原生方式使用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…