1、Spring jdbcTemplate方法解析
JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
userDao.java
public void updateLoginInfo(User user){
String sqlStr="UPDATE t_user SET last_visit=?,last_ip=?,credits=? WHERE user_id=?";
jdbcTemplate.update(sqlStr,new Object[]{user.getLastVisit(),user.getLastIp(),user.getCredits(),user.getUserId()});
}
- query方法及queryForXXX方法:用于执行查询相关语句;
- query方法的签名有三个参数query(SQLStr,Object[] args,RowCallbackHandler rch)
- sqlStr:查询的SQL语句,允许带“?”的参数占位符
- args:SQL语句中占位符对应的参数数组
- rch:查询结果的处理回调接口,该回调接口有一个方法processRow(ResultSet rs),该方法负责将查询到的结果装载到类似领域对象的对象实例中,下面代码就是一个RowCallbackHandler通过在匿名内部类中的回调接口实例
- query方法的签名有三个参数query(SQLStr,Object[] args,RowCallbackHandler rch)
userDao.java
jdbcTemplate.query(sqlStr,new Object[]{userName},new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
// TODO Auto-generated method stub
user.setUserId(rs.getInt("userId"));
user.setUserName(userName);
user.setCredits(rs.getInt("credits"));
}
});
- call方法:用于执行存储过程、函数相关语句。
JdbcTemplate类支持的回调类:
预编译语句及存储过程创建回调:
用于根据JdbcTemplate提供的连接创建相应的语句;
- PreparedStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的PreparedStatement;
- CallableStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的CallableStatement;
预编译语句设值回调:
用于给预编译语句相应参数设值;
- PreparedStatementSetter:通过回调获取JdbcTemplate提供的PreparedStatement,由用户来对相应的预编译语句相应参数设值;
- BatchPreparedStatementSetter:;类似于PreparedStatementSetter,但用于批处理,需要指定批处理大小;
自定义功能回调:
提供给用户一个扩展点,用户可以在指定类型的扩展点执行任何数量需要的操作;
- ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作;
- StatementCallback:通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作;
- PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作;
- CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作;
结果集处理回调:通过回调处理ResultSet或将ResultSet转换为需要的形式;
- RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型。
- RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可。
- ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;
2、Spring中装配Dao
在Dao的实现类中并没有打开/释放Connection的代码,哪DAO类是如何访问数据库的呢?在DAO的实现类中,样板式的操作都被jdbcTemplate封装,jdbcTemplate本身需要一个DataSource,这样它就可以根据需要从DataSource中获取/返回数据。
在类UserDao和LoginLogDAO类中都有一个@Autowired注解的JdbcTemplate变量,所以我们必须事先声明一个数据源,然后定义一个JdbcTemplate Bean,通过Spring容器中的上下文自动绑定机制进行Bean的注入。
配置DAO,applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引用Spring多个Schema空间的格式定义文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/contexr/spring-context-4.2.1.xsd">
<!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
<context:componemt-scan base-package="com.changhong.dao"/>
<!-- 定义一个 使用DBCP实现的数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
dextory-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/sampledb"
p:username="root"
p:password="1234"/>
<!-- 定义Jdbc模Bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource"/>
</beans>
解释:
- 使用Spring的扫描指定类包下的所有类,这样在类中定义的Spring注解(如@Repository,@Autowired等)才能产生作用。
- 使用jakarta的DBCP开源数据源方案定义了一个数据源,数据库驱动类为com.mysql.jdbc.Driver,由于我们MYSQL数据库的服务端为3309,而非默认的3306,所以数据库URL中显示指定了3309端口的信息。
- 配置JdbcTemplate Bean,将前面声明的DataSource注入到JdbcTemplate中,而这个JdbcTemplate Bean将通过@Autowired自动注入到LoginLog和UserDao 的Bean中,可见Spring可以很好的将注解配置和XML配置统一起来。