文章目录
- 1、数据源DataSource
- 2、SpringBoot的内嵌数据源对象
- 3、Spring的内置持久化方案JdbcTemplate
- 4、SpringBoot内嵌数据库
- 5、内嵌数据库H2的访问
1、数据源DataSource
了解数据源这个概念前,先看下原生JDBC的基本步骤:
Connection conn= null;
Statement statement = null;
try{
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","95279527");
//获取数据库操作对象
statement = conn.createStatement();
//执行SQL语句
String sql = "UPDATE dept SET dname='智能研发' WHERE deptno=1";
int count = statement.executeUpdate(sql);
System.out.println(count == 1 ? "更新成功" : "更新失败");
}catch(Exception e){
e.printStackTrace();
} finally{
//关闭资源
}
数据源,即数据的来源。在数据源对象中存储了所有建立数据库连接的信息,如驱动类型,host、port、username、password,来构建数据库连接和连接池(注意不是所有的数据源都提供连接池),这个连接池,我理解的是上面的Connection对象的一个集合。
普通的连接数据库是建立一个连接,执行完sql之后,就会关闭,即销毁connection对象,再次连接还需要重复上述步骤。当与数据库交互频繁时,这种模式会严重影响程序的性能。时间和空间消耗大多数消耗在连接和销毁中,而非数据库处理。而数据源连接池会根据你的参数建立多个数据库连接并缓存,你每次连接数据库的时候就可以从连接池中获取一个连接,去执行sql,用完会放入连接池。这样,就避免了连接数据库的开销,也减少了对数据库的压力。
2、SpringBoot的内嵌数据源对象
前面项目中,数据层解决方案的技术选型是:
- 数据源用DruidDataSource
- 数据库用MySQL
- 持久化框架用:MyBatis-plus
数据源的配置格式有:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: root
type: xxx
当引入了Druid的起步依赖后,这个配置还可以写为:
SpringBoot提供了3种内嵌的数据源对象供开发者选择:
- Hikari CP:默认内置数据源对象
- Tomcat提供DataSource:HikariCP不可用的情况下,且在web环境中,将使用tomcat服务器配置的数据源对象
- Commons DBCP:Hikari不可用,tomcat数据源也不可用,将使用dbcp数据源
注意除通用配置外,具体的连接配置,要视具体的数据源类型来在下一级配置中设定,如maximum-pool-size:
注释掉Druid的起步依赖,重启模块,可以看到日志中不再有之前Druid的信息,而是输出Hikaricp。
3、Spring的内置持久化方案JdbcTemplate
接下来不用之前的MyBatis或者MyBatisPlus,使用Spring的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>
其实看下mybatis或者mybatisplus的依赖,会发现他们里面包含jdbc的起步依赖spring-boot-starter-jdbc,因为这两个框架当然也是以jdbc为基础做的封装。它们之间的关系,我理解的是原生JDBC => JDBC Template => MyBatis => MyBatisPlus
关于JDBC Template的使用,粗糙的查询如下,此时返回结果的类型是List<Map<String,Object>>
,可能使用不便。
@Test
void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){
String sql = "select * from tbl_book where id = 1";
List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
}
以下这个写法返回实体类的List。中间使用RowMapper接口做了转换:
@SpringBootTest
class Springboot15SqlApplicationTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
void testJdbc(){
String sql = "select * from tbl_book where id = 1";
List<Book> query = jdbcTemplate.query(sql, 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;
}
});
System.out.println(query);
}
}
关于JdbcTemplate的配置:
spring:
jdbc:
template:
query-timeout: -1 # 查询超时时间
max-rows: 500 # 最大行数
fetch-size: -1 # 缓存行数
这个缓存行数,即不会一次把查询的所有行都装进来,每次先存fetch-size行
4、SpringBoot内嵌数据库
SpringBoot提供了3种内嵌数据库供开发者
选择,提高开发测试效率:
- H2
- HSQL
- Derby
H2是一个采用java语言编写的嵌入式关系型数据库,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制。
以H2数据库为例,首先导入依赖的坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
再设置当前项目于为web工程(直接引入spring-boot-starter-web起步依赖就行),并配置H2管理控制台参数:
spring:
h2:
console:
enabled: true # 开启可视化控制台
path: /h2 # 配置控制台访问路径
# 访问用户名sa,默认密码123456
第一次在控制台启动测试连接可能会失败,没有这个库(对应磁盘~目录下没这个文件夹),存C盘有点烦,可按需自己改,如:
jdbc:h2:D:/software/h2/data/test
改下配置,把上面表单的配置贴datasource里:
重启服务后再登录,即可成功:
H2启动成功。
5、内嵌数据库H2的访问
server:
port: 80
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:~/test
username: sa
password: 123456
h2:
console:
path: /h2
enabled: true
SpringBoot可以根据url地址自动识别数据库种类,在保障驱动类存在的情况下,可以省略配置,即driver-class-name: org.h2.Driver 这行可注释掉。使用JDBC来操作一下H2数据库:
String sql = "inser into xxx";
jdbcTemplate.update(sql);
这里可能会报错:
The file is locked:nio:C:/Users/yourname/test.mv.db
Database may be already in use:null. Close all other connections
这是因为默认是嵌入式的连接方式,这种连接方式默认情况下只允许有一个客户端连接到H2数据库,有客户端连接到H2数据库之后,此时数据库文件就会被锁定,那么其他客户端就无法再连接了。最后,H2数据库控制台仅用于开发阶段,线上项目请务必关闭控制台功能。(或者分配置文件,dev、pro)
更多H2数据库的信息,如运行模式是内嵌模式、服务器模式、混合模式,连接模式是不是内存模式等,参考这篇:https://blog.csdn.net/qq_34845394/article/details/107190256
到此,关于数据层的技术选型搭配就很多了: