SpringBoot集成JdbcTemplate

231 阅读3分钟
原生方式使用JDBC

在原生的JDBC开发中,我们通常会先定义一个DAO接口,这里我们只举一个例子查询所有学生

public interface StudentDAO {
    /**
     * 查询所有学生
     * @return 所有学生
     */
    public List<Student> query();
}

实现StudentDAO接口:

public class StudentDAOImpl implements  StudentDAO{
    @Override
    public List<Student> query() {
 
        List<Student> students = new ArrayList<Student>();
 
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        String sql = "select id, name , age from student";
        try {
            connection = JDBCUtil.getConnection();//这里我们把获取连接操作写在一个工具类中,方便调用
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
 
            Student student = null;
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
 
                student = new Student();
                student.setId(id);
                student.setName(name);
                student.setAge(age);
 
                students.add(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.release(resultSet,preparedStatement,connection);//关闭操作也写在工具类中,方便调用
        }
        return students;
    }
}

如果只有这个方法可能看不出什么问题,但问题就在于,我们的应用系统通常会涉及很多对数据库的CRUD操作,如果你使用JDBC,你会发现你大部分的时间是用于复制一份已有的代码,然后对sql语句以及结果集进行修改之类的操作而已,

并且,这里的获得连接以及关闭连接封装在一个工具类中,如果是直接写在方法体内,你可能会发现,这个方法里50行代码核心只有5行。

这就暴露出一个问题,代码过于冗余,另外值得一提的是,原生的JDBC连接使用完需要手工关闭,如果没有关闭会导致数据库连接过多,而每次获取连接和关闭 连接会加大数据库的负担。

然而优秀的程序员都是“懒”的,他们会想:我怎么能把时间花在copy一些冗余的代码上呢?这些冗余的代码基本上都是一样的,能不能用一个模板把它们封装起来,我需要写核心代码就行呢?没错,这就是接下来要讲的Spring的JdbcTemplate。

JDBCTemplete是什么

Spring 的 JDBC Templete 是 Spring 对 JDBC 使用的一个基本的封装。他主要是帮助程序员实现了数据库连接的管理,其余的使用方式和直接使用 JDBC 没有什么大的区别。

Springboot集成JDBCTemplete
引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
数据源配置

spring-boot-starter-jdbc模块默认使用HikariCP作为数据库的连接池。

spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot_jdbc?useSSL=false&useUnicode=true&characterEncoding=utf8
    username: root
    password: 123456
使用JdbcTemplate

Spring的JdbcTemplate是自动配置的,你可以直接使用@Autowired或构造函数(推荐)来注入到你自己的bean中来使用。

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 新增用户
     * @param user
     * @return
     */
    public int add(User user) {
        String sql = "insert into t_user(id,name,age)values(?,?,?)";
        Object args[] = {user.getId(),user.getName(),user.getAge()};
        return jdbcTemplate.update(sql, args);
    }

    /**
     * 删除用户
     * @param id
     * @return
     */
    public int delete(int id) {
        String sql = "delete from t_user where id = ?";
        Object args[] = new Object[]{id};
        return jdbcTemplate.update(sql,args);
    }

    /**
     * 修改用户
     * @param user
     * @return
     */
    public int update(User user) {
        String sql = "update t_user set name = ? where id = ?";
        Object args[] = new Object[]{user.getName(),user.getId()};
        return jdbcTemplate.update(sql,args);
    }

    /**
     * 查询用户
     * @return
     */
    public List<Map<String, Object>> getList() {
        List<Map<String, Object>> list=jdbcTemplate.queryForList("select * from t_user ");
        return list;
    }

}

问题:Spring jdbcTemplate操作完数据库后是否需要手动关闭数据库连接? 答案是不需要手动关闭了。它已经做了。

 finally {  
        if (psc instanceof ParameterDisposer) {  
            ((ParameterDisposer) psc).cleanupParameters();  
        }  
        JdbcUtils.closeStatement(ps);  
        DataSourceUtils.releaseConnection(con, getDataSource());  
    }  
总结

关于Spring所提供的JdbcTemplate的用法就是这些,Spring集成JdbcTemplate的方法也是比较简单的,整体就是先引入依赖,在配置数据库的连接,然后使用jdbcTemplate这个类就可以了,JdbcTemplate 类中就已经封装了大部分对于数据库的操作。目前在企业级项目中应用比较少的,一般用于对于操作数据库的要求不高的项目,因为他就是对jdbc的简单封装,所有的sql都是写入到代码中,维护性差,看起来也比较乱。

完整项目地址:github.com/cocoamu/spr…