Spring Boot 版本:2.2.2.RELEASE
数据库:MySQL
数据表准备
MySQL 数据表定义:
mysql> show create table t_user \G
*************************** 1. row ***************************
Table: t_user
Create Table: CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(12) DEFAULT NULL,
`password` varchar(12) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> desc t_user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(12) | YES | | NULL | |
| password | varchar(12) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
引入依赖
在 Spring Boot 中开启 JdbcTemplate 很简单,只需要引入 JdbcTemplate 和数据库驱动,见第 23 ~ 26、34 ~ 39 行。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.mk</groupId>
<artifactId>spring-boot-jdbc-template</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-jdbc-template</name>
<description>JdbcTemplate</description>
<properties>
<java.version>1.8</java.version>
<mysql-connector-java.version>5.1.40</mysql-connector-java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
实现代码
实体类,我使用了 Lombok 提供的注解,免去使用 IDE 生成构造方法、Getter、Setter、toString 等方法的工作。
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class User {
private Integer id;
private String name;
private String password;
}
数据源配置,为了方便起见,我直接使用了 Spring 自带的数据源,application.yml 文件的内容如下。
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm?useSSL=true&useUnicode=true&characterEncoding=utf-8
username: root
password: root
测试类
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.mk.domain.User;
@SpringBootTest
class SpringBootJdbcTemplateApplicationTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
// System.out.println(this.jdbcTemplate);
// 根据 ID 查询
User user = this.selectBy(1);
System.out.println(user);
// 新增
this.add(new User(2, "zhangsan", "123"));
this.add(new User(3, "lisi", "123"));
// 修改
this.update(new User(1, "admin", "123"));
// 删除
this.delete(3);
// 查询所有
List<Map<String, Object>> users = this.selectAll();
for (Map<String, Object> u : users) {
System.out.println(u.values().toString());
}
}
public int add(User record) {
String sql = "insert into t_user(id,name,password) values(:id,:name,:password)";
NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate(this.jdbcTemplate.getDataSource());
return npjt.update(sql, new BeanPropertySqlParameterSource(record));
}
public int update(User record) {
String sql = "update t_user set name = ?,password = ? where id = ?";
Object[] args = { record.getName(), record.getPassword(), record.getId() };
int[] argTypes = { Types.VARCHAR, Types.VARCHAR, Types.INTEGER };
return this.jdbcTemplate.update(sql, args, argTypes);
}
public int delete(Integer id) {
String sql = "delete from t_user where id = ?";
Object[] args = { id };
int[] argTypes = { Types.INTEGER };
return this.jdbcTemplate.update(sql, args, argTypes);
}
public List<Map<String, Object>> selectAll() {
String sql = "select * from t_user";
return this.jdbcTemplate.queryForList(sql);
}
public User selectBy(Integer id) {
String sql = "select * from t_user where id = ?";
Object[] args = { id };
int[] argTypes = { Types.INTEGER };
List<User> records = this.jdbcTemplate.query(sql, args, argTypes, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
Integer id = rs.getInt("id");
String name = rs.getString("name");
String password = rs.getString("password");
User user = new User(id, name, password);
return user;
}
});
if ((records != null) && (records.size() > 0)) {
return records.get(0);
} else {
return null;
}
}
}
运行测试类,控制台输出
User(id=1, name=root, password=123456)
[1, admin, 123]
[2, zhangsan, 123]
项目结构