写过 JDBC 代码的人都懂,当需要操作数据库的时候,我们需要写一堆模板式的代码,除了核心的一两句代码,其它代码一模一样。
Spring 简化了这些操作,它把那些模板式的代码都封装起来了。jdbcTemplate就是是属于dao层数据库操作一层提供的基于JDBC的解决方法
Spring 的JDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码,让我们只需要编写从数据库读写数据的必须代码。
Spring 提供的3个模板类
NamedParameterJdbcTemplate 所具备的命名参数功能在Spring2.5 中被合并到了SimpleJdbcTemplate,所以我们也没有必要再使用NamedParameterJdbcTemplate了。
public class User2 {
private int id;
private String name;
private int age;
private float score;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
@Override
public String toString() {
return "User2{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}
这个数据表以及对应的Bean 就是我们操作的对象
首先配置一下数据源(我使用的c3p0连接池来配置数据源)
来一个JdbcTemplate 对象,将数据源注入到JdbcTemplate对象中,JdbcTemplate就可以工作了。
将JdbcTemplate装配到DAO层并使用JdbcTemplate访问数据库。(代码非常少真的)
@Resource(name = "template")
private JdbcTemplate template;
查询一下
public User2 getUserById(int id) {
//查询操作
String sql4 = "select * from user where id = ?";
User2 user = (User2) template.queryForObject(sql4, new MyUser2(), new Object[]{1});
return user;
}
class MyUser2 implements RowMapper{
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
User2 user2 = new User2();
//将jdbc返回的结果集属性分别映射到对象上的属性
user2.setId(rs.getInt("id"));
user2.setName(rs.getString("name"));
user2.setAge(rs.getInt("age"));
user2.setScore(rs.getInt("score"));
//返回对象
return user2;
}
}
queryForObject()方法的三个参数
RowMapper对象中,对于查询返回的每一行数据,JdbcTemplate 将会调用RowMapper的mapRow方法,在这个方法中我们将得到的数据填充进了User2对象中。
测试一下
public class jdbctest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Spring-jdbc.xml");
UserController controller = (UserController) context.getBean("controller");
User2 user = controller.getUserById(1);
System.out.println(user);
}
}
Spring 帮我们封装了那些模板式的代码以及各种异常处理工作,对比一下使用JDBC直接操作,这样的代码更简洁,也便于理解。
对于应用程序中的DAO 层,每一个类都需要一个JdbcTemplate对象,当我们程序中有好多个dao 的时候,每一个都装配一个JdbcTemplate 就显得很繁琐,一个通用的解决方案是创建一个通用的dao 类让其他的类都来继承,我们只需要将JdbcTemplate注入基类就ok啦。
所以Spring也提供了内置对的基类JdbcDaoSupport,我们dao 类只需要继承这个类就ok啦,然后再XML文件中为其服了注入一个JdbcTemplate
然后可以通过getJdbcTemplate()方法获取基类里的JdbcTemplate 对象
public class User2Dao extends JdbcDaoSupport {
public User2 getUserById(int id) {
//查询操作
String sql4 = "select * from user where id = ?";
User2 user = (User2) getJdbcTemplate().queryForObject(sql4, new User2Dao.MyUser2(), new Object[]{1});
return user;
}
class MyUser2 implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
User2 user2 = new User2();
//将jdbc返回的结果集属性分别映射到对象上的属性
user2.setId(rs.getInt("id"));
user2.setName(rs.getString("name"));
user2.setAge(rs.getInt("age"));
user2.setScore(rs.getInt("score"));
//返回对象
return user2;
}
}
}
最后,因为我们的dao类是继承自JdbcDaoSupport类,我们可以直接将数据源配置给我们自己的dao 对象的dataSource属性,这个属性是继承自JdbcDaoSupport的。像这样子。