从零开始:Spring Boot+Mybatis高效集成H2数据库教程
一、引言部分
Spring Boot框架的重要性与优势:
-
简化开发过程:Spring Boot的核心价值在于极大地简化了Spring应用的搭建和配置过程。它通过自动配置机制,能够智能地根据项目依赖来配置应用程序,无需编写大量XML配置文件,使得开发者能快速上手并专注于业务逻辑。
-
开箱即用:Spring Boot提供了大量的starter模块,只需简单添加依赖即可集成各种功能,如Web服务、安全控制、数据访问等,从而加快项目的启动速度。
-
独立运行:Spring Boot应用可以直接打包为可执行的jar或war文件,内嵌了Tomcat、Jetty等容器,使得应用可以独立部署,无需额外安装应用服务器。
-
强大的生态系统:Spring Boot依托于Spring Framework及其广泛的社区支持,拥有丰富的第三方库集成,便于开发者进行功能扩展。
Mybatis持久层框架的优势:
-
灵活的SQL定制:Mybatis允许开发人员直接编写SQL语句,对于复杂的查询优化有较大灵活性,适合对数据库操作有较高定制化需求的场景。
-
解耦度高:通过Mapper接口与XML映射文件的方式,实现了Java代码与SQL语句的分离,提高了系统的可维护性。
-
轻量级:相比于Hibernate等全自动化ORM框架,Mybatis更加轻便,学习曲线相对平缓,并且在特定场景下性能表现更优。
H2内存数据库的重要性与优势:
-
快速开发与测试:H2是一个开源的Java数据库引擎,它可以作为内存数据库使用,这意味着所有数据都存储在内存中,非常适合于开发环境下的单元测试和原型设计,因为它的启动速度快,数据操作实时响应。
-
易用的Web控制台:H2提供了一个内置的Web控制台,方便开发者查看数据库内容、执行SQL脚本和管理数据,这对于调试和数据分析非常有用。
-
多模式支持:除了内存模式,H2还支持文件模式(数据持久化到磁盘)和混合模式,这使得它既能用于临时数据处理,也能作为一个小型生产数据库系统。
-
嵌入式特性:由于H2可以嵌入到应用程序中,因此特别适用于微服务架构下的单体应用或者分布式环境中的每个组件内部的数据存储需求。
二、环境准备与依赖管理
- 添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
三、Mybatis、H2整合
- 配置文件详解: 示例配置如下:
# 文件模式
spring.datasource.url=jdbc:h2:file:./data/ymd;AUTO_RECONNECT=TRUE
# 依赖
spring.datasource.driverClassName=org.h2.Driver
# 用户名
spring.datasource.username=sa
# 密码
spring.datasource.password=
# h2初始化脚本
spring.sql.init.data-locations=classpath:/db/trigger.sql
# mybatis sql打印
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 启用H2 Console
spring.h2.console.enabled=true
# 可选:设置允许访问控制台的路径,默认是/h2-console
spring.h2.console.path=/h2-console
# 控制初始化脚本执行时机
spring.sql.init.mode=always
h2模式运行介绍
在Spring Boot项目中配置H2数据库时,spring.datasource.url
属性用于指定数据源的连接URL。对于H2数据库,你可以根据不同的运行模式(内存模式或文件模式)来设置这个属性。以下是两种常见模式下的配置示例:
1. 内存模式(不持久化到磁盘):
# application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
这里,“testdb”是内存数据库的名称,DB_CLOSE_DELAY=-1
表示当最后一个数据库连接关闭后,数据库不会被自动关闭,这样可以保持数据在应用重启之间仍然可用。
2. 文件模式(持久化到磁盘):
# application.properties
spring.datasource.url=jdbc:h2:file:/path/to/your/database;IFEXISTS=TRUE
这里,“/path/to/your/database”指定了数据库文件的路径,如果文件已经存在,则IFEXISTS=TRUE
会避免尝试重新创建数据库而引发错误。
另外,还可以添加其他H2特定的参数以调整其行为,例如开启H2 Web Console控制台:
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console # 自定义H2 Console访问路径,默认为/h2-console
初始化脚本
在Spring Boot中,spring.sql.init.data-locations
属性用于指定应用启动时加载的SQL数据脚本文件的位置。这些脚本通常用来初始化数据库中的数据(DML语句)。对于H2数据库或者其他任何支持的数据源,配置方法如下:
# application.properties
spring.sql.init.data-locations=classpath:db/data.sql
或者如果你有多个数据初始化脚本需要按照特定顺序执行:
spring.sql.init.data-locations=classpath:db/data1.sql,classpath:db/data2.sql
管控台配置
spring.h2.console.enabled
是Spring Boot项目中用于配置H2数据库Web控制台的属性。当设置为 true
时,它会启用内嵌在Spring Boot应用中的H2 Console Web应用程序,使得开发人员可以通过浏览器来访问和管理H2数据库。
配置示例:
# application.properties
spring.h2.console.enabled=true
默认情况下,H2 Console的访问路径通常是 /h2-console
。如果你希望更改这个访问路径,可以使用以下配置:
# 更改H2 Console的访问路径
spring.h2.console.path=/my-h2-console
启用并配置好H2 Console后,在本地启动Spring Boot应用,并访问 http://localhost:8080/h2-console
(或你自定义的路径),就可以通过Web界面登录到H2数据库进行数据查询、更新等操作了。
注意:在生产环境中,出于安全考虑,通常不推荐开启H2 Console。
其他配置
H2数据库在Spring Boot中除了上述提到的基本配置外,还有其他一些可配置选项。以下是一些常见的H2数据库高级配置:
-
连接参数:
# 指定是否自动创建表(适用于非内嵌模式) spring.datasource.h2.auto-table-creation=true # 是否允许混合模式,即同时支持多个网络连接 spring.datasource.url=jdbc:h2:tcp://localhost/~/test;AUTO_SERVER=TRUE # 数据库加密(如果需要的话) spring.datasource.url=jdbc:h2:file:/data/mydb;CIPHER=AES # 自定义文件模式下数据库文件的路径和名称 spring.datasource.url=jdbc:h2:file:/path/to/your/database;DB_CLOSE_DELAY=-1
-
Schema管理与初始化脚本执行时机:
# 在所有bean初始化完成后执行SQL脚本 spring.sql.init.mode=always
四、实战示例
- 引入pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.example</groupId>
<artifactId>springmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 配置h2数据库库 创建application.properties文件
spring.datasource.url=jdbc:h2:file:./data/ymd;AUTO_RECONNECT=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.sql.init.data-locations=classpath:/db/trigger.sql
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 启用H2 Console
spring.h2.console.enabled=true
# 可选:设置允许访问控制台的路径,默认是/h2-console
spring.h2.console.path=/h2-console
# 控制初始化脚本执行时机
spring.sql.init.mode=always
- 配置数据库脚本 创建trigger.sql脚本
CREATE TABLE IF NOT EXISTS ymd_trigger(
id varchar(50),
ymd_id int,
PARENT INT
);
- 创建实体类 创建ymd_trigger类
package com.example.entity;
import java.util.Date;
public class YmdTrigger {
private String id;
private Integer ymdId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getYmdId() {
return ymdId;
}
public void setYmdId(Integer ymdId) {
this.ymdId = ymdId;
}
}
- 创建mybatis查询语句 创建YmdTriggerMapper类
package com.example.dao;
import com.example.entity.YmdTrigger;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface YmdTriggerMapper {
@Insert("INSERT INTO ymd_trigger" +
"(id, ymd_id)" +
"VALUES('', 0);")
int insert(YmdTrigger record);
@Select("Select * from ymd_trigger")
List<YmdTrigger> getTrigger();
@Select("select count(*) from ymd_trigger")
int count();
}
- 创建控制器用于调试 创建TestController类
package com.example.controller;
import com.example.dao.YmdTriggerMapper;
import com.example.entity.YmdTrigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
public class TestController {
@Autowired
YmdTriggerMapper mapper;
@RequestMapping("/test")
@ResponseBody
public String test(){
return "ok";
}
@RequestMapping("/queryTrigger")
@ResponseBody
public String queryTrigger(){
List<YmdTrigger> trigger = mapper.getTrigger();
System.out.println(trigger.size());
return "ok";
}
@RequestMapping("/addTrigger")
@ResponseBody
public String addTrigger(){
mapper.insert(new YmdTrigger());
return "ok";
}
}
- 单元测试 创建单元测试类
package com.example.dao;
import com.example.entity.YmdTrigger;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class YmdTriggerMapperTest {
@Autowired
YmdTriggerMapper triggerMapper;
@Test
void insert() {
long startTime = System.currentTimeMillis();
int limit = 100000;
for (int i = 0; i < limit; i++) {
triggerMapper.insert(new YmdTrigger());
}
System.out.println("插入"+limit+"条记录耗时:"+(System.currentTimeMillis()-startTime)+"ms");
}
五、扩展阅读
本教程详述了如何从零开始在Spring Boot中集成Mybatis和H2数据库。首先添加所需依赖,配置数据源连接H2(内存或文件模式)。设置Mybatis相关属性以实现Mapper接口与SQL映射,利用spring.sql.init.data-locations加载初始化脚本。同时介绍了启动内嵌的H2 Web控制台进行数据库操作。
转载自:https://juejin.cn/post/7352079398071975999