欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3-2 使用JdbcTemplate模板类实现CRUD操作

程序员文章站 2022-05-08 11:26:56
...

Spring的JDBC模板

Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。它针对JavaEE三层中的每一层都提供了不同的解决技术,在dao层,Spring提供了JDBC模板的技术,可对数据库进行CRUD操作。Spring提供了很多持久层技术的模板类简化了编程,如下图: 
3-2 使用JdbcTemplate模板类实现CRUD操作
我再次加以说明:Spring框架对不同的持久层技术做了封装,如对传统的JDBC使用JdbcTemplate进行了封装,对Hibernate框架使用HibernateTemplate进行了封装。JdbcTemplate对JDBC进行了简单封装,使用类似于dbutils,但是使用并没有dbutils方便,只是提供了一种实现的方式而已。下面来演示使用JdbcTemplate模板类实现CRUD操作。

使用JdbcTemplate模板类实现CRUD操作

首先创建数据库和表,如下:

create database spring_lee;
use spring_lee;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `username` varchar(100) DEFAULT NULL,
  `password` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用JdbcTemplate模板类还须导入jar包,先引入JdbcTemplate的jar包: 
3-2 使用JdbcTemplate模板类实现CRUD操作
但我们要知道spring-jdbc-4.2.4.RELEASE.jar包才是最主要的。除此之外还须导入MySQL数据库驱动的jar包。

添加操作

在src目录下创建一个cn.itcast.jdbcTemplate包,并在该包下编写一个JdbcTemplateDemo1单元测试类。现在要编写一个add方法来测试添加操作。

public class JdbcTemplateDemo1 {

    // 1.添加操作
    @Test
    public void add() {
        // 1.设置数据库相关信息(JDBC模板依赖连接池获得数据库连接,所以必须先构造连接池)
        DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///spring_lee");
        dataSource.setUsername("root");
        dataSource.setPassword("yezi");

        // 2.做添加的操作
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        String sql = "insert into user values(?,?)";
        int rows = jdbcTemplate.update(sql, "liayun", "lee");
        System.out.println(rows);
    }

}

注意:JDBC模板依赖连接池获得数据库连接,所以必须先构造连接池,然后再创建JdbcTemplate模板类对象。而且还须用到JdbcTemplate模板类的update方法: 
3-2 使用JdbcTemplate模板类实现CRUD操作 
这个方法中有两个参数:

  • 第一个参数是sql语句。
  • 第二个参数是传递的参数值,Object类型的可变参数。

修改操作

现在要在单元测试类中编写一个update方法来测试修改操作。

public class JdbcTemplateDemo1 {

    // 2.修改操作
    @Test
    public void update() {
        // 1.设置数据库相关信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///spring_lee");
        dataSource.setUsername("root");
        dataSource.setPassword("yezi");

        // 实现修改操作
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        String sql = "update user set password=? where username=?";
        int rows = jdbcTemplate.update(sql, "9999", "liayun");
        System.out.println(rows);
    }

}

删除操作

现在要在单元测试类中编写一个delete方法来测试删除操作。

public class JdbcTemplateDemo1 {

    // 3.删除操作
    @Test
    public void delete() {
        // 1.设置数据库相关信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///spring_lee");
        dataSource.setUsername("root");
        dataSource.setPassword("yezi");

        // 实现删除操作
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        String sql = "delete from user where username=?";
        int rows = jdbcTemplate.update(sql, "liayun");
        System.out.println(rows);
    }

}

查询操作

查询表中的记录数

现在要在单元测试类中编写一个testCount方法来测试查询表中记录数的操作。

public class JdbcTemplateDemo1 {

    // 查询表记录数
    @Test
    public void testCount() {
        // 1.设置数据库相关信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///spring_lee");
        dataSource.setUsername("root");
        dataSource.setPassword("yezi");

        // 2.创建JdbcTemplate模板类的对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        // 3.sql语句
        String sql = "select count(*) from user";
        // 4.调用JdbcTemplate模板类里面的方法
        // 返回int类型
        int count = jdbcTemplate.queryForObject(sql, Integer.class);
        System.out.println(count);
    }

}

在查询表中记录数的操作时,用到了JdbcTemplate模板类里面的queryForObject方法,如下: 
3-2 使用JdbcTemplate模板类实现CRUD操作 
这个方法中有两个参数:

  • 第一个参数:sql语句
  • 第二个参数:返回类型的class

查询返回对象

使用JdbcTemplate模板类进行查询操作的时候,还是比较麻烦的。前面我也说过JdbcTemplate对JDBC进行了简单封装,使用类似于dbutils,但是使用并没有dbutils方便,只是提供了一种实现的方式而已。我是为何这么说呢?因为在dbutils里面帮我们编写好了一些实现类,使用这些实现类可以封装结果,这些实现类都实现了接口ResultSetHandler;使用JdbcTemplate模板类进行查询操作返回数据结果的时候,虽然在JdbcTemplate模板类中有个接口,但是并没有提供实现类,故还需要自己编写实现类来封装结果。 
好了,接下来复习一下编写JDBC最原始的代码做查询操作,基本功不要忘记了啊! 
首先在cn.itcast.jdbcTemplate包下编写一个User类。

public class User {

    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }

}


然后再在该包下编写一个JdbcTemplateDemo2单元测试类,编写JDBC最原始的代码做查询操作。

public class JdbcTemplateDemo2 {

    // jdbc最原始的代码做查询操作
    @Test
    public void testJDBC() {
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///spring_lee", "root", "yezi");
            String sql = "select * from user where username=?";
            // 对sql进行预编译操作
            psmt = conn.prepareStatement(sql);
            psmt.setString(1, "mary");
            // 执行sql
            rs = psmt.executeQuery();
            // 遍历结果
            while (rs.next()) {
                String username = rs.getString("username");
                String password = rs.getString("password");

                User user = new User();
                user.setUsername(username);
                user.setPassword(password);
                System.out.println(user);
            }
        } catch (Exception e) {

        } finally {
            try {
                rs.close();
                psmt.close();
                conn.close();
            } catch (Exception e2) {

            }
        }
    }       

}

接下来,就来讲如何使用JdbcTemplate模板类进行查询操作并返回一个User类的对象。其中就要用到JdbcTemplate模板类里面的queryForObject方法: 
3-2 使用JdbcTemplate模板类实现CRUD操作 
这个方法有3个参数:

  • 第一个参数:sql语句
  • 第二个参数:RowMapper接口 
    1. 之前使用dbutils进行查询时,返回结果有ResultSetHandler接口,但是在dbutils里面有其对应的实现类。
    2. 使用JdbcTemplate模板类的时候,虽然提供了RowMapper接口,但是这个接口没有实现类,需要自己进行实现,然后进行数据封装。
  • 第三个参数:可变参数

现在要在JdbcTemplateDemo2单元测试类中编写一个testObject方法来测试查询时返回一个User类对象的操作。

public class JdbcTemplateDemo2 {

    // 1.查询返回对象
    @Test
    public void testObject() {

        // 1.设置数据库相关信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///spring_lee");
        dataSource.setUsername("root");
        dataSource.setPassword("yezi");

        // 2.创建JdbcTemplate对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        // 3.sql语句
        String sql = "select * from user where username=?";

        // 4.调用方法执行
        // 第二个参数是接口,RowMapper,要自己创建一个类实现这个接口,在里面进行封装
        User user = jdbcTemplate.queryForObject(sql, new MyRowMapper(), "mary");
        System.out.println(user);

    }

}

注意,还要编写RowMapper接口的一个实现类。在以上JdbcTemplateDemo2.java源代码文件中编写RowMapper接口的一个MyRowMapper实现类。

// T:表示要将数据封装到哪个类的对象中
class MyRowMapper implements RowMapper<User> {

    // 实现接口里面的方法,在方法中实现数据封装
    // 第一个参数:返回的结果集,第二个参数是当前的行数(即第几行)
    @Override
    public User mapRow(ResultSet rs, int rows) throws SQLException {
        // 从结果集得到数据
        String username = rs.getString("username");
        String password = rs.getString("password");

        // 封装到对象里面
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        return user;
    }

}

查询返回List集合

现在要在JdbcTemplateDemo2单元测试类中编写一个testList方法来测试查询时返回List集合的操作。

public class JdbcTemplateDemo2 {

    // 2.返回List集合
    @Test
    public void testList() {

        // 1.设置数据库相关信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///spring_lee");
        dataSource.setUsername("root");
        dataSource.setPassword("yezi");

        // 2.查询操作
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        String sql = "select * from user";

        List<User> list = jdbcTemplate.query(sql, new MyRowMapper());
        System.out.println(list);

    }

}
  • MyRowMapper实现类与对象的相同。

在进行查询并返回List集合的操作时,须用到JdbcTemplate模板类里面的query方法: 
3-2 使用JdbcTemplate模板类实现CRUD操作 
或 
3-2 使用JdbcTemplate模板类实现CRUD操作

相关标签: 增删改查 spring