当我们需要连接使用数据库时,我们需要建立数据库连接,数据库连接是一项高额的开销,频繁的创建与销毁会造成巨大的性能问题,因而诞生了数据库连接池技术。
主流的ORM框架都配备了连接池,如hibernate,mybatis等,jdbcTemplate也是其中一种,它是Spring对数据库的操作在jdbc上面做了深层次的封装,更加轻量级,但相应地在编码上也较繁琐点。
一、示例演示
在SringBoot中,使用jdbcTemplate与其他Spring项目一样,只是SringBoot为我们提供了更加便捷的starter。
首先我们引入所需依赖,除了jdbcTemplate的外,我们还需要引入数据库连接驱动,这里以mysql为例,以及数据库连接池,这里我们采用了阿里的druid。
<!--mysql连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<!--jdbc依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
然后配置文件中加入数据源的配置
Spring已经为我们默认注入了JdbcTemplate对象的bean示例,所以我们直接注入即可。这里我们创建了万能的User类。
UserApi为controller层代码,提供了简单的增删改查方法,调用service,由于业务简单,并没有复杂逻辑,所以server直接调用了dao层,即UserDao。
UserApi代码:
@RestController
@RequestMapping("user")
public class UserApi {
@Autowired
private UserService userService;
/**
* 添加用户
* @param user
*/
@PostMapping("addUser")
public String addUser(User user){
userService.addUser(user);
return "添加用户成功";
}
/**
* 删除用户
* @param id
*/
@GetMapping("delUser")
public String delUser(@RequestParam(value = "id") int id){
userService.delUser(id);
return "删除用户成功";
}
/**
* 修改用户信息
* @param user
*/
@PostMapping("updateUser")
public String updateUser(User user){
userService.updateUser(user);
return "修改用户成功";
}
/**
* 获取用户信息
* @param id
* @return
*/
@GetMapping("getUser")
public User getUser(@RequestParam(value = "id") int id){
return userService.getUser(id);
}
/**
* 获取所有用户信息
* @return
*/
@GetMapping("getUsers")
public List<User> getUsers(){
List<User> users = userService.findAll();
return users;
}
}
UserDao代码:
@Repository
public class UserDao implements IUserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 添加用户
* @param user
* @return
*/
@Override
public int add(User user) {
return jdbcTemplate.update("insert into user(username, password) value(?, ?)",
user.getUsername(), user.getPassword());
}
/**
* 根据id删除用户
* @param id
* @return
*/
@Override
public int del(int id) {
return jdbcTemplate.update("delete from user where id = ?", id);
}
/**
* 更新用户信息
* @param user
* @return
*/
@Override
public int update(User user) {
return jdbcTemplate.update("update user set username = ?, password = ? where id = ?",
user.getUsername(), user.getPassword(), user.getId());
}
/**
* 根据id查找用户
* @param id
* @return
*/
@Override
public User find(int id) {
List<User> users = jdbcTemplate.query("select * from user where id = ?",
new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int i) throws SQLException {
User user = new User();
//user.setId(rs.getInt("id"));
user.setUsername("通过自定义RowMapper设置列:" + rs.getString("username"));
user.setPassword("通过自定义RowMapper设置列:" + rs.getString("password"));
return user;
}
}, id);
return users != null && users.size() > 0 ? users.get(0) : null;
}
/**
* 获取全部用户
* @return
*/
@Override
public List<User> findAll() {
return jdbcTemplate.query("select * from user ", new BeanPropertyRowMapper<>(User.class));
}
}
可以看到,jdbcTemplate的使用还是比较简单,它为我们提供了一系列常用的增删改查方法,同时,也可以看到,jdbcTemplate需要我们自己提供sql,而方法的本质即为传入sql与对应参数,然后映射结果集。
这与原生jdbc类似,只不过jdbcTemplate封装的更加简单,屏蔽掉了重复性的工作。复杂的结果集可以使用RowMapper<>进行映射。