Spring 数据访问 - JdbcTemplate 入门
一、项目准备
(一)使用 IDEA 开发工具新建 Maven 工程.
(二)修改 pom.xml, 添加所需的依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
(三)新建数据库及表
drop database study_jdbctemplate;
create database study_jdbctemplate;
use study_jdbctemplate;
drop table if exists t_user;
create table t_user
(
id int primary key auto_increment,
username varchar(100),
password varchar(200),
email varchar(200)
);
insert into t_user (id, username, password, email) values (1, 'zs', 'zs', 'zs@abc.com');
insert into t_user (id, username, password, email) values (2, 'ls', 'ls', 'ls@abc.com');
insert into t_user (id, username, password, email) values (3, 'a', 'a', 'a@abc.com');
insert into t_user (id, username, password, email) values (4, 'b', 'b', 'b@abc.com');
insert into t_user (id, username, password, email) values (5, 'c', 'c', 'c@abc.com');
insert into t_user (id, username, password, email) values (6, 'd', 'd', 'd@abc.com');
insert into t_user (id, username, password, email) values (7, 'e', 'e', 'e@abc.com');
insert into t_user (id, username, password, email) values (8, 'f', 'f', 'f@abc.com');
insert into t_user (id, username, password, email) values (9, 'g', 'g', 'g@abc.com');
insert into t_user (id, username, password, email) values (10, 'h', 'h', 'h@abc.com');
insert into t_user (id, username, password, email) values (11, 'i', 'i', 'i@abc.com');
insert into t_user (id, username, password, email) values (12, 'j', 'j', 'j@abc.com');
insert into t_user (id, username, password, email) values (13, 'k', 'k', 'k@abc.com');
insert into t_user (id, username, password, email) values (14, 'l', 'l', 'l@abc.com');
(四)配置数据库连接
# resources/application.properties
spring.datasource.name=mysql
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/study_jdbctemplate?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root
(五)配置日志
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.springframework.jdbc.core" additivity="true" level="DEBUG">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="com.demo.jdbctemplate" level="debug"/>
<logger name="org.springframework.test" level="error"/>
<logger name="org.springframework.jdbc.support" level="error"/>
<logger name="org.springframework" level="error"/>
<logger name="com.zaxxer" level="error"/>
<logger name="ch.qos.logback" level="error"/>
</configuration>
(六)新建实体类User
package com.demo.jdbctemplate.entity;
public class User {
private Integer id;
private String username;
private String password;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}
二、增删改查
(一)新增一条记录
public Integer insertUser(User user) {
String sql = "insert into t_user(id, username, password, email) values(null, ?, ?, ?)";
return jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), user.getEmail());
}
(二)删除指定记录
public Integer deleteUserById(Integer id) {
String sql = "delete from t_user where id = ?";
return jdbcTemplate.update(sql, id);
}
(三)修改指定记录
public Integer updateUser(User user) {
String sql = "update t_user set username = ?, password = ?, email = ? where id = ?";
return jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), user.getEmail(), user.getId());
}
(四)查找所有记录
public List<User> findUsers() {
String sql = "select id, username, password, email from t_user";
return jdbcTemplate.query(sql, userRowMapper());
}
(五)查找一条记录
public User getUserById(Integer id) {
String sql = "select id, username, password, email from t_user where id = ?";
return jdbcTemplate.queryForObject(sql, userRowMapper(), id);
}
其中,查询记录中需要的 userRowMapper() 方法定义如下:
private RowMapper<User> userRowMapper() {
return (resultSet, i) -> {
User user = new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
user.setEmail(resultSet.getString("email"));
return user;
};
}
(六)查找记录总数量
public Integer count() {
String sql = "select count(id) from t_user";
return jdbcTemplate.queryForObject(sql, Integer.class);
}
(七)返回新增记录的 ID
插入一条新纪录时,如果需要获得新记录的 id,可以使用下面的方式:
// 方式 1:
public Integer insertUser(User user) {
String sql = "insert into t_user(id, username, password, email) values(null, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
int resRow = jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getEmail());
return ps;
}, keyHolder);
return Integer.parseInt(Objects.requireNonNull(keyHolder.getKey()).toString());
}
// 方式 2:
public Integer insertUser(User user) {
String sql = "insert into t_user(id, username, password, email) values(null, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
int resRow = jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getEmail());
return ps;
}, keyHolder);
return Integer.parseInt(Objects.requireNonNull(keyHolder.getKey()).toString());
}