Spring的JdbcTemplate的模板第二种方式
通过继承JdbcDaoSupport来JdbcTemplate模板对象
JdbcDaoSupport 是 spring 框架为我们提供的一个类,该类中定义了一个 JdbcTemplate 对象,我们可
以直接获取使用,但是要想创建该对象,需要为其提供一个数据源
public abstract class JdbcDaoSupport extends DaoSupport {
private JdbcTemplate jdbcTemplate;
/**
* Set the JDBC DataSource to be used by this DAO.
*/
public final void setDataSource(DataSource dataSource) {
if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {
this.jdbcTemplate = createJdbcTemplate(dataSource);
initTemplateConfig();
}
}
......
}
代码演示
package com.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import com.dao.IUserDao;
import com.entity.User;
public class UserDaoImplSupport extends JdbcDaoSupport implements IUserDao{
/**
* 增
*/
@Override
public void save(User user) {
String sql = "insert into t_user values(null,?)";
super.getJdbcTemplate().update(sql, user.getT_name());
}
/**
* 删
*/
@Override
public void delete(int id) {
String sql = "delete from t_user where t_id = ?";
super.getJdbcTemplate().update(sql, id);
}
/**
* 改
*/
@Override
public void update(User user) {
String sql = "update t_user set t_name = ? where t_id = ?";
super.getJdbcTemplate().update(sql, user.getT_name() , user.getT_id());
}
/**
* 查询一个
* public <T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args)
* RowMapper: 里面书写的mapRow方法就是把ResultSet返回的结果集遍历封装到对象中
*/
@Override
public User find(int id) {
String sql = "select * from t_user where t_id = ?";
User user = super.getJdbcTemplate().queryForObject(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int index) throws SQLException {
User u = new User();
u.setT_id(rs.getInt("t_id"));
u.setT_name(rs.getString("t_name"));
return u;
}
}, id);
//判断
if(user==null){
return null;
}
return user;
}
/**
* 使用聚合函数
* public <T> T queryForObject(String sql, Class<T> requiredType)
* requiredType : 直接返回值的字节码
*/
@Override
public int count() {
String sql= "select count(*) from t_user";
return super.getJdbcTemplate().queryForObject(sql,Integer.class);
}
/**
* 查询所有
* public <T> List<T> query(String sql, RowMapper<T> rowMapper)
*/
@Override
public List<User> findAll() {
String sql = "select * from t_user";
List<User> query = super.getJdbcTemplate().query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int arg1) throws SQLException {
User u = new User();
u.setT_id(rs.getInt("t_id"));
u.setT_name(rs.getString("t_name"));
return u;
}
});
//判断
if(query.isEmpty()){
return null;
}
return query;
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd ">
<!--
把UserDaoImpl对象放进容器中
并且把数据源放进UserDaoImpl中,因为继承了JdbcDaoSupport, 里面需要dataSource
-->
<bean id="userDaoImpl" class="com.dao.impl.UserDaoImplSupport">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 把连接池放进容器中 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="org.gjt.mm.mysql.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/hibernate_crm"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
</beans>
思考:
两版 Dao 有什么区别呢?
答案:
- 第一种在 Dao类中定义 JdbcTemplate 的方式,适用于所有配置方式(xml 和注解都可以)。
- 第二种让 Dao继承 JdbcDaoSupport 的方式,只能用于基于 XML的方式,**注解用不了==