JDBC(Java Database Connectivity),它是 Java 用于连接数据库的规范
,也就是用于执行数据库 SQL 语句的 Java API
。
JDBC 可以连接多种数据库,原因在于提供了统一访问的接口
,这也符合 Java 程序接口设计的模式。
JDBC 需要每次进行数据库连接,然后出了 SQL 语句、传值、关闭数据库。这样的流程操作,一旦忘记某一步,就会出现很多问题,于是 JDBCTemplate 被设计出来了。
JDBCTemplate = JDBC + Template
的组合,是对 JDBC 的封装。它更便于程序实现,替我们完成所有的 JDBC 底层操作。因此,对于数据库的操作,再不需要每次都进行连接、打开、关闭了。
JDBC 和 JDBCTemplate 就像是仓库管理员,负责从仓库(数据库)中存取物品。而后者采用的是“电动门自动控制”
JDBCTemplate
实现起来比ORM
繁琐,所以大部分开发使用的是 ORM(JPA
和MyBatis
)。但是 JDBCTemplate 依然有市场,因为学习成本低。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
添加完成后,还需要配置数据库连接信息。这样 JDBCTemplate 才能正常连接数据库。
在 application.properties
配置文件中配置数据库的地址和用户信息
。
# MySql 数据库信息
# 驱动地址
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 配置 IP 地址、编码、时区
spring.datasource.url=jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
# 用户名
spring.datasource.username=root
# 密码 此处没有密码是因为 数据库本身没有设置密码
spring.datasource.password=
新建一个测试实体类 User,实现 RowMapper 类,重新 mapRow 方法,以便实体字段和数据表字段映射。(下面有创建数据表的 SQL 命令)
package com.example.model;
import lombok.Data;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
@Data
public class User implements RowMapper<User> {
private Integer id;
private String username;
private String password;
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user = new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
return user;
}
}
JDBCTemplate 提供了以下操作数据的 3 个方法。
在使用 JDBCTemplate 之前,需要在控制器中注入 JDBCTemplate,然后就可以通过 execute 方法执行 SQL 操作了。
package com.example.test;
import com.example.model.User;
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 java.util.List;
@SpringBootTest
public class UserControllerTest {
@Autowired
private JdbcTemplate jdbcTemplate;
// 创建表
@Test
public void createUserTable() throws Exception {
String sql = "CREATE TABLE `user`(\n" +
"`id` int(10) NOT NULL AUTO_INCREMENT,\n" +
"`username` varchar(100) DEFAULT NULL,\n" +
"`password` varchar(100) DEFAULT NULL,\n" +
"PRIMARY KEY(`id`)\n" +
") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;\n" +
"\n";
jdbcTemplate.execute(sql);
}
// 添加数据
@Test
public void saveUserTest() throws Exception {
String sql = "INSERT INTO user (USERNAME, PASSWORD) VALUES ('张三', '123456');";
Integer rows = jdbcTemplate.update(sql);
System.out.println(rows);
}
// 查询数据
@Test
public void getUserByName() throws Exception {
String name = "张三";
String sql = "SELECT * FROM user WHERE USERNAME = ?";
List<User> list = jdbcTemplate.query(sql, new User(), name);
for (User user : list) {
System.out.println(user);
}
}
// 查询所有数据
@Test
public void list() throws Exception {
String sql = "SELECT * FROM user LIMIT 0,1000";
List<User> userList = jdbcTemplate.query(sql, new User());
for (Object user : userList) {
System.out.println(user);
}
}
// 数据修改
@Test
public void updateUserPassword() throws Exception {
Integer id = 1;
String password = "99998888";
String sql = "UPDATE user SET PASSWORD = ? WHERE ID = ?";
Integer rows = jdbcTemplate.update(sql, password, id);
System.out.println(rows);
}
// 数据删除
@Test
public void deleteUserById() throws Exception {
Integer id = 1;
String sql = "DELETE FROM user WHERE ID = ?";
Integer rows = jdbcTemplate.update(sql, id);
System.out.println(rows);
}
}
ORM(Object Relational Mapping)是 对象/关系映射
。它提供了概念性的、易于理解的数据模型
,将数据库中的表
和内存中的对象
建立映射关系
。它是随着面向对象的软件开发方法的发展而产生的,面向对象的开发方法依然是当前主流的开发方法。
对象
和关系型数据
是业务实体的两种表现形式。业务实体在内存中
的表现为对象
,在数据库中
表现为关系型数据
。内存中的对象不会被永久保存,只有关系型数据库(或 NoSQL 数据库,或文件)中的对象会被永久保存。
对象/关系映射(ORM)系统一般以中间件的形式存在,因为内存中的对象之间存在关联和继承关系,而在数据库中,关系型数据无法直接表达多对多的关联和继承关系。对象、数据库通过 ORM 映射的关系图。
目前比较常用的 ORM 是国外流行的 JPA
和国内流行的 MyBatis
。
本文主要来源:书名:《Spring Boot实战派》第八章;作者:龙中华;出版社:中国工信出版社。