持久层:JdbcTemplate / mybatis
JdbcTemplate 是 Spring ⾃带的 JDBC 模版组件,底层实现了对 JDBC 的封装,⽤法与 MyBatis 类似,需要开发者⾃定义 SQL 语句,JdbcTemplate 帮助我们完成数据库的连接,SQL 执⾏,结果集的封装。
不⾜之处是灵活性不如 MyBatis,因为 MyBatis 的 SQL 语句定义在 XML 中,更有利于维护和扩展,JdbcTemplate 以硬编码的⽅式将 SQL 直接写在 Java 代码中,不利于扩展维护。
1、pom.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.southwind</groupId>
<artifactId>springbootdao</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
2、创建实体类
java
package com.southwind.entity;
import lombok.Data;
@Data
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
}
3、创建 UserRepository
java
package com.southwind.repository;
import com.southwind.entity.User;
import java.util.List;
public interface UserRepository {
public List<User> findAll();
public User findById(Integer id);
public int save(User user);
public int update(User user);
public int deleteById(Integer id);
}
4、创建实现类
java
package com.southwind.repository.impl;
import com.southwind.entity.User;
import com.southwind.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<User> findAll() {
return jdbcTemplate.query(
"select * from t_user",
new BeanPropertyRowMapper<>(User.class)
);
}
@Override
public User findById(Integer id) {
return jdbcTemplate.queryForObject(
"select * from t_user where id = ?",
new Object[]{id},
new BeanPropertyRowMapper<>(User.class)
);
}
@Override
public int save(User user) {
return jdbcTemplate.update(
"insert into t_user(username,password,age) values (?,?,?)",
user.getUsername(),
user.getPassword(),
user.getAge()
);
}
@Override
public int update(User user) {
return jdbcTemplate.update(
"update t_user set username = ?,password = ?,age = ? where id = ?",
user.getUsername(),
user.getPassword(),
user.getAge(),
user.getId()
);
}
@Override
public int deleteById(Integer id) {
return jdbcTemplate.update(
"delete from t_user where id = ?",
id
);
}
}
5、Handler
java
package com.southwind.controller;
import com.southwind.entity.User;
import com.southwind.repository.impl.UserRepositoryImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserHandler {
@Autowired
private UserRepositoryImpl userRepository;
@GetMapping("/findAll")
public List<User> findAll() {
return userRepository.findAll();
}
@GetMapping("/findById/{id}")
public User findById(@PathVariable("id") Integer id) {
return userRepository.findById(id);
}
@PostMapping("/save")
public int save(@RequestBody User user) {
return userRepository.save(user);
}
@PutMapping("/update")
public int update(@RequestBody User user) {
return userRepository.update(user);
}
@DeleteMapping("/deleteById/{id}")
public int deleteById(@PathVariable("id") Integer id) {
return userRepository.deleteById(id);
}
}
query
query(String sql,RowMapper rowMapper)

RowMapper 是⼀个接⼝,作⽤是解析结果集,将 JDBC 查询出的 ResultSet 对象转换成对应的 POJO。
queryForObject(String sql,Object[] args,RowMapper rowMapper)
该⽅法⽤来查询⼀条数据,并将结果封装成⼀个 POJO。
update
增加、删除、修改的操作都可以调⽤个这个⽅法。