4-1.SQL
约 1505 字大约 5 分钟
2025-06-25
SSMP 整合时,数据层解决方案主要由以下技术构成:
- 数据源技术:Druid
- 持久化技术:MyBatisPlus
- 数据库技术:MySQL
接下来,我们将分别从这三个层面展开研究。
1. 数据源技术
目前常用的数据源技术是 Druid,其初始化信息会在日志中显示。
如果不使用 Druid,Spring Boot 实际上会提供默认的数据源支持。移除 Druid 的 starter 后,日志中会出现 HikariDataSource
的初始化信息。这引出了 Spring Boot 内嵌数据源的概念。
Spring Boot 为了简化数据库连接管理,提供了三种内嵌数据源技术:
- HikariCP:Spring Boot 官方推荐的默认数据源。
- Tomcat DataSource:如果使用 Tomcat 作为 Web 服务器,可以选择使用 Tomcat 提供的 DataSource。
- Commons DBCP:在不使用 HikariCP 和 Tomcat DataSource 的情况下,Spring Boot 会默认使用 DBCP。
之前配置 Druid 数据源时,我们通常在 application.yml
文件中进行如下配置:
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
要使用 HikariCP,只需移除 druid
配置,保留基本的数据源配置即可:
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
或者,也可以显式地配置 hikari
属性:
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
hikari:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
还可以进一步配置 HikariCP 的其他属性,例如连接池大小:
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
hikari:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
maximum-pool-size: 50
配置 Tomcat DataSource 或 DBCP 的方式类似。
2. 持久化技术
接下来,我们将探讨 Spring Boot 提供的持久化解决方案——JdbcTemplate
。
JdbcTemplate
是 Spring 框架提供的 JDBC 封装,简化了 JDBC 编程。
使用 JdbcTemplate 的步骤
导入 JDBC starter
在
pom.xml
文件中添加以下依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
自动装配 JdbcTemplate 对象
在需要使用
JdbcTemplate
的类中,通过@Autowired
注解自动装配JdbcTemplate
对象:@SpringBootTest class Springboot15SqlApplicationTests { @Test void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){ } }
使用 JdbcTemplate 实现查询操作(非实体类封装数据的查询操作)
使用
queryForList()
方法执行 SQL 查询,并将结果封装为List<Map<String, Object>>
:@Test void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){ String sql = "select * from tbl_book"; List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); System.out.println(maps); }
这段代码演示了如何使用
JdbcTemplate
执行一个简单的查询,查询tbl_book
表中的所有记录,并将结果以List<Map<String, Object>>
的形式返回。jdbcTemplate.queryForList(sql)
方法负责执行该 SQL 语句,并将查询结果封装成一个列表,列表中的每个元素都是一个Map<String, Object>
对象,代表数据库中的一行记录。Map 的键是列名,值是对应列的数据。使用 JdbcTemplate 实现查询操作(实体类封装数据的查询操作)
使用
query()
方法执行 SQL 查询,并通过RowMapper
将结果映射到实体类对象:@Test void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){ String sql = "select * from tbl_book"; RowMapper<Book> rm = new RowMapper<Book>() { @Override public Book mapRow(ResultSet rs, int rowNum) throws SQLException { Book temp = new Book(); temp.setId(rs.getInt("id")); temp.setName(rs.getString("name")); temp.setType(rs.getString("type")); temp.setDescription(rs.getString("description")); return temp; } }; List<Book> list = jdbcTemplate.query(sql, rm); System.out.println(list); }
此示例展示了如何使用
JdbcTemplate
将查询结果映射到实体类Book
。RowMapper
接口定义了如何将ResultSet
中的数据转换为Book
对象。mapRow()
方法负责从ResultSet
中提取数据,并将其设置到Book
对象的相应属性中。jdbcTemplate.query(sql, rm)
方法执行 SQL 查询,并使用RowMapper
将每一行结果转换为Book
对象,最终返回一个包含所有Book
对象的列表。使用 JdbcTemplate 实现增删改操作
使用
update()
方法执行 INSERT、UPDATE 或 DELETE 语句:@Test void testJdbcTemplateSave(@Autowired JdbcTemplate jdbcTemplate){ String sql = "insert into tbl_book values(3,'springboot1','springboot2','springboot3')"; jdbcTemplate.update(sql); }
这段代码展示了如何使用
JdbcTemplate
执行 INSERT 操作,向tbl_book
表中插入一条新的记录。jdbcTemplate.update(sql)
方法执行 SQL 语句,并返回受影响的行数。
配置 JdbcTemplate
可以在 application.yml
文件中配置 JdbcTemplate
的相关属性:
spring:
jdbc:
template:
query-timeout: -1 # 查询超时时间
max-rows: 500 # 最大行数
fetch-size: -1 # 缓存行数
3. 数据库技术
Spring Boot 还提供了内置的数据库解决方案,包括 H2、HSQL 和 Derby。这些数据库可以内嵌在 Spring Boot 容器中运行,方便进行功能测试。
内嵌数据库的主要优点是方便进行功能测试。测试数据无需存储在磁盘上,服务器关闭后数据会自动清除。
以 H2 数据库为例,介绍如何使用内嵌数据库。
导入 H2 数据库对应的坐标
在
pom.xml
文件中添加以下依赖:<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
将工程设置为 Web 工程
添加
spring-boot-starter-web
依赖,以便启动 H2 数据库:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
开启 H2 数据库控制台访问程序
在
application.yml
文件中配置 H2 数据库控制台:spring: h2: console: enabled: true path: /h2
如果访问失败,需要配置数据源:
datasource: url: jdbc:h2:~/test hikari: driver-class-name: org.h2.Driver username: sa password: 123456
配置完成后,可以通过
/h2
路径在 Web 端访问 H2 数据库控制台。使用 JdbcTemplate 或 MyBatisPlus 技术操作数据库
使用
JdbcTemplate
或MyBatisPlus
操作 H2 数据库的方式与操作 MySQL 数据库类似。
重要提醒
上线时,务必关闭内存级数据库,并使用 MySQL 数据库作为数据持久化方案。可以通过设置 spring.h2.console.enabled
属性为 false
来关闭 H2 数据库。
4. 数据层解决方案总结
目前,我们有多种数据层技术可供选择:
- 数据源技术:Druid、HikariCP、Tomcat DataSource、DBCP
- 持久化技术:MyBatisPlus、MyBatis、JdbcTemplate
- 数据库技术:MySQL、H2、HSQL、Derby
在开发程序时,可以根据需要选择以上技术组合成一套数据库解决方案。