JdbcTemplate使用小结

本文通过具体示例展示了如何使用 Spring 框架中的 JDBC 模块进行数据库操作,包括增删改查等基本功能实现。

spring配置:

<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<constructor-arg ref="dataSourceTransactionManager" />
</bean>

<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="dataSource" />
</bean>
//不需要返回值,增加数据时
public long addFamily(int regType,String mobile,String address,long areaId,String fmlCode){
OracleSequenceMaxValueIncrementer incr =
new OracleSequenceMaxValueIncrementer(jt.getDataSource(), "seq_family");
long id = 0;
try{
id = incr.nextLongValue();//获得id
if(!(jt.update(INSERT_FAMILY, new Object[] { id,regType,mobile,address,areaId,fmlCode })>=1)){
id=0;
}
}catch(DataAccessException e){
logger.error(e.getMessage());
throw e;
}
return id;
}

//返回单个对象
public Member getMember(String mobile,String relations){
Member entity=null;
try{
ParameterizedRowMapper<Member> mapper = new ParameterizedRowMapper<Member>() {
public Member mapRow(ResultSet rs, int rowNum)
throws SQLException {
Member m = new Member();
m.setId(rs.getLong(1));
m.setFamilyId(rs.getLong(2));
m.setMobile(rs.getString(3));
m.setRelations(rs.getString(4));
m.setState(rs.getInt(5));
return m;
}
};
entity = (Member) jt.queryForObject(QUERY_MEMBER_BY_RELA,new Object[] { mobile,relations }, mapper);
}catch(DataAccessException ex){
}catch(Exception e){
logger.error(e.getMessage());
}
return entity;
}
//更新数据
public boolean updateFamily(Family f){
boolean res = false;
try{
jt.update(UPDATE_FAMILY, new Object[] { f.getState(),f.getId() });
res=true;
}catch(DataAccessException e){
logger.error(e.getMessage());
throw e;
}
return res;
}

//返回集合
public List<Msg> getCancelMsgList(long orderId){
ParameterizedRowMapper<Msg> mapper = new ParameterizedRowMapper<Msg>() {
public Msg mapRow(ResultSet rs, int rowNum)
throws SQLException {
Msg entity = new Msg();
entity.setId(rs.getLong(1));
entity.setLsh(rs.getString(2));
entity.setEwmHdh(rs.getString(3));
entity.setEwmSph(rs.getString(4));
entity.setEwmJgm(rs.getString(5));
return entity;
}
};
return jt.query(QUERY_MM,new Object[] { orderId }, mapper);
}

//执行插入操作
public boolean buildProDayReport(final String strDate){
boolean bRes = false;
final Response tranRes = new Response();
try{
tt.execute(new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus ts){
jt.update(ProDayReport1,new Object[] { strDate });
jt.update(ProDayReport2,new Object[]{ strDate });
tranRes.setCode("0000");
}
});
if("0000".equals(tranRes.getCode())){
bRes = true;
}
}catch(Exception ex){
logger.error(ex.getMessage());
}
return bRes;
}
Spring的`JdbcTemplate`类提供了一个名为`queryForObject`的方法,用于执行SQL查询并返回单个对象。这个方法非常适合用来从数据库中检索单个记录或聚合值。 ### 基本用法 `queryForObject`方法有多种重载形式,可以根据不同的需求来使用。最常用的几种形式包括: - **返回单个值**:当你期望查询返回一个单一的值(例如计数、求和等),可以使用如下形式: ```java Integer count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM some_table", Integer.class); ``` 这里,SQL语句`SELECT COUNT(*) FROM some_table`将返回一个整数值,表示表中的记录总数。 - **返回单个行**:如果查询预期返回一行数据,并且这一行包含多个列,则可以使用带有`RowMapper`的版本。`RowMapper`接口允许你定义如何将结果集的一行映射到Java对象。 ```java User user = jdbcTemplate.queryForObject( "SELECT id, name FROM users WHERE id = ?", new Object[]{1}, (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")) ); ``` 在这个例子中,`User`是一个简单的POJO类,它有两个构造参数:`id`和`name`。`RowMapper`通过lambda表达式实现,负责将结果集的当前行转换为`User`对象。 ### 参数处理 当使用`queryForObject`方法时,可以通过传递一个`Object[]`数组来传递参数。这些参数会按照顺序替换SQL语句中的占位符(问号`?`)。例如,在上面的例子中,`new Object[]{1}`作为参数传递给SQL语句中的`?`占位符。 ### 异常处理 使用`queryForObject`时需要注意,如果查询没有返回任何行,或者返回多于一行的数据,都会抛出异常。具体来说,如果没有找到数据,则会抛出`IncorrectResultSizeDataAccessException`,并且其`getActualSize()`方法返回0;如果有多个结果,则同样抛出`IncorrectResultSizeDataAccessException`,但`getActualSize()`方法返回实际找到的行数。因此,在调用`queryForObject`之前确保查询逻辑能够准确地匹配到恰好一行数据是非常重要的[^1]。 ### 替代方案 值得注意的是,某些旧版本的Spring中提供的`queryForInt`、`queryForLong`等方法已经被标记为废弃。对于这些情况,推荐使用`queryForObject`方法替代,因为它提供了更灵活的结果类型支持。例如,要替换`queryForInt`,可以直接使用`queryForObject(..., Integer.class)`的方式[^2]。 ### 配置JdbcTemplate 为了使用`JdbcTemplate`,首先需要在Spring配置文件中正确配置它。通常,这涉及到定义一个`DataSource` bean以及一个`JdbcTemplate` bean,后者依赖于前者。下面是一个简单的XML配置示例,展示了如何配置`JdbcTemplate`和`DataSource`: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 定义数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/springtest"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> </beans> ``` 这段配置首先创建了一个`DriverManagerDataSource`实例作为数据源,然后创建了一个`JdbcTemplate`实例,并将其`dataSource`属性设置为之前创建的数据源实例。这样,在应用程序中就可以通过注入`JdbcTemplate`来使用它执行数据库操作了[^3]。 ### 小结 综上所述,`JdbcTemplate`的`queryForObject`方法是一个非常强大且灵活的工具,用于执行返回单个对象的SQL查询。通过合理利用该方法的不同重载形式,可以有效地处理各种查询场景,同时也要注意处理可能出现的异常情况,确保程序的健壮性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值