【开发篇】四、数据源、JdbcTemplate、内嵌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

到此,关于数据层的技术选型搭配就很多了:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-代号9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值