Java 的数据库连接模板:JDBCTemplate
1.JDBCTemplate 初识
1.1 JDBC
在学习使用 JDBCTemplate 之前,我们先来了解一下 JDBC(Java DataBase Connectivity)。它是 Java 用于连接数据库的规范,也就是用于执行数据库 SQL 语句的 Java API。从 JDBC 的名称上看,它似乎没有指定某种数据库。可以猜想它可以为多种数据库提供统一访问的接口,这更合程序设计的模式。实际上,它由一组用 Java 语言编写的类和接口组成,为大部分 关系型数据库 提供访问接口。
JDBC 需要每次进行数据库连接,然后处理 SQL 语句、传值、关闭数据库。如果都由开发员编写代码,则很容易出错,可能会出现使用完成之后,数据库连接忘记关闭的情况。这容易导致连接被占用而降低性能,为了减少这种可能的错误,减少开发人员的工作量,JDBCtemplate 就被设计出来了。
1.2 JDBCTemplate
JDBCTemplate = JDBC + Template 的组合,是对 JDBC 的封装。它更便于程序实现,替我们完成所有的 JDBC 底层工作。因此,对于数据库的操作,不再需要每次都进行连接、打开、关闭了。现在通过 JDBCTemplate 不需要进行全局修改,就可以轻松地应对开发人员常常要面对的增加删除、修改和查询操作。
🚀 JDBC 和 JDBCTemplate 就像是仓库管理员,负责从仓库(数据库)中存取物品。而后者不需要 “每次进入都开门,取完关门”,因为有电动门自动控制。
2.JDBCTemplate 实现数据的增加、删除、修改和查询
2.1 配置基础依赖
要使用 JDBCTemplate,则需要添加其 Starter 依赖。因为要操作数据库,所以也需要配置数据库(以 MySQL为例)的连接依赖,见以下代码:
<!-- JDBCTemplate 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- MySQL 数据库依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
添加完依赖后,还需要配置数据库的连接信息。这样 JDBCTemplate 才能正常连接到数据库在 application.properties
配置文件中配置数据库的地址和用户信息,见以下代码:
spring.datasource.url=jdbc:mysql://127.0.0.1/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
2.2 新建实体类
新建一个测试实体类 User,实现 RowMapper 类,重写 mapRow 方法,以便实体字段和数据表字段映射(对应)。映射是指把 Java 中设置的实体字段和 MySQL 数据库的字段对应起来,因为实体的 id
可以对应数据库字段的 u_id
,也可以对应 id
、name
等。如果不重写,则程序不知道何对应。具体代码如下:
package com.example.demo.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 int id; private String username; private String password; // 必须重写mapRow方法 @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; } }
2.3 操作数据
JDBCTemplate 提供了以下操作数据的 3 个方法。
execute
:表示 执行,用于直接执行 SQL 语句。update
:表示 更新,包括新增、修改、删除操作。query
:表示 查询。
2.3.1 创建数据表
在使用 JDBCTemplate 之前,需要在控制器中注入 JDBCTemplate,然后就可以通过 execute
方法执行 SQL操作了,见以下代码:
@SpringBootTest @RunWith(SpringRunner.class) public class UserControllerTest { @Autowired private JdbcTemplate jdbcTemplate; @Test /** * @Description: 创建表 */ 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); } }
2.3.2 添加数据
添加数据可以通过 update
方法来执行,见以下代码:
@Test public void saveUserTest() throws Exception { String sql = "INSERT INTO user (USERNAME,PASSWORD) VALUES ('pipi','666666')"; int rows = jdbcTemplate.update(sql); System.out.println(rows); }
2.3.3 查询数据
以下代码是根据 name
查询单个记录,执行下面 sql
字符串里的 SQL 语句(SELECT * FROM user WHERE USERNAME = ?
)。这里需要通过 query
方法来执行。
@Test public void getUserByName() throws Exception { String name = "pipi"; String sql = "SELECT * FROM user WHERE USERNAME = ?"; List<User> list = jdbcTemplate.query(sql, new User(), new Object[]{name}); for (User user : list) { System.out.println(user); } }
运行测试,会在控制台输出如下结果:
2.3.4 查询所有记录
查询所有记录和查询单个记录一样,也是执行 query
方法。区别是,SQL 语句使用查询通配符 *
,见以下代码:
@Test public void list() throws Exception { String sql = "SELECT * FROM user"; List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper(User.class)); for (User userLists : userList) { System.out.println(userLists); } }
2.3.5 修改数据
要进行数据的修改,可以使用 update
方法来实现,见以下代码:
@Test public void updateUserPassword() throws Exception { Integer id = 1; String passWord = "999888"; String sql = "UPDATE user SET PASSWORD = ? WHERE ID = ?"; int rows = jdbcTemplate.update(sql, passWord, id); System.out.println(rows); }
2.3.6 删除数据
这里删除数据并不用 DELETE 方法,而是通过 update
方法来执行 SQL 语句中的 DELETE 方法。
@Test public void deleteUserById() throws Exception { String sql = "DELETE FROM user WHERE ID = ?"; int rows = jdbcTemplate.update(sql, 1); System.out.println(rows); }
至此,已经实现了简单的 增加、删除、修改 和 查询 功能。如果读者对关系型数据库的 SQL 不陌生,那么实现起来会非常简单。因为 JDBCTemplate 实现起来比 ORM 烦琐,所以大都分发人员使用的是 ORM(JPA 和 MyBatis)。但是 JDBCTemplate 依然有市场,因为学习成本低,会一些 SQL语句就能上手使用,操作虽然麻烦,但很容易学会。
3.认识 ORM
ORM(Object Relation Mapping)是 对象/关系映射。它提供了概念性的、易于理解的数据模型,将数据库中的表和内存中的对象建立映射关系。它是随着面向对象的软件开发方法的发展而产生的,面向对象的开发方法依然是当前主流的开发方法。
对象 和 关系型数据 是 业务实体 的两种表现形式。业务实体在内存中表现为对象,在数据库中表现为关系型数据。内存中的对象不会被永久保存,只有关系型数据库(或 NoSQL 数据库,或文件)中的对象会被永久保存。
对象/关系映射(ORM)系统一般以中间件的形式存在,因为内存中的对象之间存在关联和继承关系,而在数据库中,关系型数据无法直接表达多对多的关联和继承关系。对象、数据库通过 ORM 映射的关系如下图所示。
目前比较常用的 ORM 是国外非常流行的 JPA 和国内非常流行的 MyBatis。