Spring学习(三)——在Spring中使用JDBC

写过 JDBC 代码的人都懂,当需要操作数据库的时候,我们需要写一堆模板式的代码,除了核心的一两句代码,其它代码一模一样。
Spring 简化了这些操作,它把那些模板式的代码都封装起来了。jdbcTemplate就是是属于dao层数据库操作一层提供的基于JDBC的解决方法

Spring 的JDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码,让我们只需要编写从数据库读写数据的必须代码。
Spring 提供的3个模板类

  • JdbcTemplate:最基本的Spring JDBC模板,这个模板支持最简单的JDBC数据库访问功能以及简单的索引参数查询
  • NamedParameterJdbcTemplate:使用该模板类执行查询时,可以将查询值以命名参数的形式绑定到SQL中,而不是以一些最简单的索引参数。
  • SimpleJdbcTemplate:该模板类利用java 5 的一些特性,如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。

NamedParameterJdbcTemplate 所具备的命名参数功能在Spring2.5 中被合并到了SimpleJdbcTemplate,所以我们也没有必要再使用NamedParameterJdbcTemplate了。

JdbcTemplate

先来一个例子了解一下JdbcTemplate的用法
Spring学习(三)——在Spring中使用JDBC_第1张图片

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()方法的三个参数

  • String :从数据库查找数据的SQL
  • RowMapper对象:用来从ResultSet 中提取并构建域对象
  • 可变参数列表:列出了要绑定到查询语句上的索引参数值

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直接操作,这样的代码更简洁,也便于理解。

Spring 的JDBC DAO 支持类

对于应用程序中的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的。像这样子。


      

你可能感兴趣的:(Spring)