【开发篇】四、数据源、JdbcTemplate、内嵌H2

文章目录

  • 1、数据源DataSource
  • 2、SpringBoot的内嵌数据源对象
  • 3、Spring的内置持久化方案JdbcTemplate
  • 4、SpringBoot内嵌数据库
  • 5、内嵌数据库H2的访问

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第1张图片

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的起步依赖后,这个配置还可以写为:

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第2张图片

SpringBoot提供了3种内嵌的数据源对象供开发者选择:

  • Hikari CP:默认内置数据源对象
  • Tomcat提供DataSource:HikariCP不可用的情况下,且在web环境中,将使用tomcat服务器配置的数据源对象
  • Commons DBCP:Hikari不可用,tomcat数据源也不可用,将使用dbcp数据源

注意除通用配置外,具体的连接配置,要视具体的数据源类型来在下一级配置中设定,如maximum-pool-size:

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第3张图片

注释掉Druid的起步依赖,重启模块,可以看到日志中不再有之前Druid的信息,而是输出Hikaricp。

3、Spring的内置持久化方案JdbcTemplate

接下来不用之前的MyBatis或者MyBatisPlus,使用Spring的JdbcTemplate来完成持久化,引入起步依赖:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-jdbcartifactId>
dependency>


<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <scope>runtimescope>
dependency>

其实看下mybatis或者mybatisplus的依赖,会发现他们里面包含jdbc的起步依赖spring-boot-starter-jdbc,因为这两个框架当然也是以jdbc为基础做的封装。它们之间的关系,我理解的是原生JDBC => JDBC Template => MyBatis => MyBatisPlus

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第4张图片

关于JDBC Template的使用,粗糙的查询如下,此时返回结果的类型是List>,可能使用不便。

@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.bootgroupId>
	<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>

<dependency>    
	<groupId>com.h2databasegroupId>    
	<artifactId>h2artifactId>    
	<scope>runtimescope>
dependency>

再设置当前项目于为web工程(直接引入spring-boot-starter-web起步依赖就行),并配置H2管理控制台参数:

spring:
   h2:    
     console:   
       enabled: true  # 开启可视化控制台  
       path: /h2     # 配置控制台访问路径
       
# 访问用户名sa,默认密码123456

第一次在控制台启动测试连接可能会失败,没有这个库(对应磁盘~目录下没这个文件夹),存C盘有点烦,可按需自己改,如:

jdbc:h2:D:/software/h2/data/test

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第5张图片

改下配置,把上面表单的配置贴datasource里:

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第6张图片

重启服务后再登录,即可成功:

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第7张图片

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)

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第8张图片

更多H2数据库的信息,如运行模式是内嵌模式、服务器模式、混合模式,连接模式是不是内存模式等,参考这篇:https://blog.csdn.net/qq_34845394/article/details/107190256

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

【开发篇】四、数据源、JdbcTemplate、内嵌H2_第9张图片

你可能感兴趣的:(SpringBoot,SpringBoot,数据源)