SpringBoot整合H2数据库

这篇具有很好参考价值的文章主要介绍了SpringBoot整合H2数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、H2数据库概述


H2官网:http://www.h2database.com/

H2是一个Java语言编写的嵌入式数据库,它不受平台的限制,同时H2提供了一个十分方便的web控制台,用于操作和管理数据库内容。H2还提供兼容模式,可以兼容一些主流的数据库,也可以为缓存数据库使用,它具有比较完备的数据库特性,如支client/server连接,能够支持标准的SQL语句,支持存储过程等。因此采用H2作为开发期、测试期和演示的数据库非常方便,它不太适合作为大规模生产数据库。

H2数据库的前身是 HypersonicSQL,它的名字的含义是 Hypersonic2,但是它的代码是从头开始编写的,没有使用HypersonicSQL或者HSQLDB的代码。

H2特点:

  • 运行很快,开源,支持 JDBC API;
  • 支持嵌入模式和服务器模式;
  • 基于磁盘或内存中的数据库;
  • 基于浏览器控制台应用程序;
  • 文件很小,jar文件约 1.5 MB
  • 加密数据库;
  • ODBC 驱动程序;

H2控制台应用程序

通过控制台应用程序,我们就可以使用浏览器访问H2数据库了,数据库管理界面类似phpmyadmin。

springboot集成h2,Java笔记,spring boot,数据库,java

H2文档地址:http://www.h2database.com/html/quickstart.html


使用方式:

集成h2也很简单,直接将jar包导入项目中即可。

<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.199</version>
    <scope>test</scope>
</dependency>

2、SpringBoot整合H2

1、创建一个SpringBoot工程

springboot集成h2,Java笔记,spring boot,数据库,java


2、导入mp和h2相关依赖:

<!--springmvc-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--h2数据库-->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <!--version:1.4.200-->
    <scope>compile</scope>
</dependency>

<!--mp-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>

<!--mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>

<!--test-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

3、向application.yml文件中添加配置:

server:
  port: 8888 # 端口号

spring:
  datasource:
    url: jdbc:h2:~/mydb  # 数据库
    driver-class-name: org.h2.Driver
    username: root  
    password: test
  h2:
    console:
      path: /h2-console  #h2嵌入式数据库控制台,可以通过浏览器访问
      enabled: true

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启sql日志
    map-underscore-to-case: true # 开启驼峰映射(mp默认开启)
  • usernamepassword 是H2数据库的用户名和密码,自己定义即可。

  • /h2-console 是自定义的控制台地址,用户可以打开浏览器,进入这个地址管理数据库,使用上面配置的username和password登录。


4、编写业务代码:

实体类:

package com.baidou.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * 实体类
 *
 * @author 白豆五
 * @version 2023/04/4
 * @since JDK8
 */

@Data
@TableName(value = "tb_user")
public class User {
    private Integer id;
    private String username;
    private String pwd;
    private Integer salary;//以分为单位,避免浮点运算精度丢失问题

    // 封装数据
    public void setSalary(Integer salary) {
        this.salary = salary * 100;
    }
}

mapper接口:

package com.baidou.mapper;

import com.baidou.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

//mapper接口
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

service接口:

package com.baidou.service;

import com.baidou.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;

// service接口
public interface UserService extends IService<User> {
}

service接口实现类:

package com.baidou.service.impl;

import com.baidou.entity.User;
import com.baidou.mapper.UserMapper;
import com.baidou.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * service接口实现类
 *
 * @author 白豆五
 * @version 2023/04/4
 * @since JDK8
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

5、在resources目录下,创建一个db/schema-h2.sql文件:

DROP TABLE IF EXISTS tb_user;

CREATE TABLE tb_user(
    id INT(11) PRIMARY KEY  AUTO_INCREMENT COMMENT 'id',
    username VARCHAR(30) NOT NULL UNIQUE COMMENT '用户名',
    pwd VARCHAR(10) NOT NULL COMMENT '密码',
    salary  INT  NULL DEFAULT 0 COMMENT '薪资'
);

springboot集成h2,Java笔记,spring boot,数据库,java


6、实现让服务启动时自动执行DDL语句,并且只让它第一次启动时自动创建数据库,后续项目启动都不会重新创建(避免数据丢失)

① 定义一个类去实现ApplicationContextAware接口,然后在类上添加@Component注解,代表当前类是spring的bean。

package com.baidou.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

/**
 * 定义一个注册器策略类,方便后续加载资源文件
 *
 * ApplicationContextAware是Spring框架提供的接口,也叫做spring上下文的增强器,在项目启动时执行,会被spring处理
 * 当一个bean实现了该接口,通过setApplicationContext方法可以直接获取spring容器中的所有bean
 */
@Component
public class ApplicationContextRegister implements ApplicationContextAware {

    private ApplicationContext applicationContext = null;

    /**
     * Spring容器启动时,会回调setApplicationContext方法,并传入ApplicationContext对象,之后就可对该对象进行操作。(例如获取spring容器中的所有bean)
     *
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }


    /**
     * 提供一个方法,用于加载sql脚本文件
     *
     * @param url sql文件位置
     * @return
     */
    public Resource getResource(String url) {
        return this.applicationContext.getResource(url);
    }
}

ApplicationContextAware接口详解:https://www.cnblogs.com/loongk/p/12375708.html


② 编写初始化数据库代码:

package com.baidou.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.init.ScriptUtils;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.io.File;

/**
 * 初始化h2数据库
 */
@Slf4j
@Service
@AutoConfigureAfter(DataSource.class) //DataSource创建完后才初始化此类
public class H2DataSourceConfig {

    //初始化sql
    private static final String schema="classpath:db/schema-h2.sql";

    @Autowired
    DataSource dataSource;

    @Autowired
    ApplicationContextRegister applicationContextRegister; //自定义注册器


    // JDK提供的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法
    @PostConstruct
    public  void init() throws Exception {
        //初始化本地数据库
        String userHome= System.getProperty("user.home");//获取系统用户目录
        // 创建一个标识文件,只有在第一次初始化数据库时会创建,如果系统用户目录下有这个文件,就不会重新执行sql脚本
        File f = new File(userHome+ File.separator+"my.lock");
        if(!f.exists()){
            log.info("--------------初始化h2数据----------------------");
            f.createNewFile();
            // 加载资源文件
            Resource resource= (Resource) applicationContextRegister.getResource(schema);
            // 手动执行SQL语句
            ScriptUtils.executeSqlScript(dataSource.getConnection(),resource);
        }
    }
}

7、启动项目,然后浏览器访问:http://localhost:8888/h2-console

输入之前在application.yml中h2的相关配置;如用户名、密码、数据库名

springboot集成h2,Java笔记,spring boot,数据库,java

springboot集成h2,Java笔记,spring boot,数据库,java


8、创建一个测试类,然后使用MP操作H2数据库

执行单元测试的时候先将项目停止,不然汇报H2数据库文件锁定问题。(默认单线程模式)

package com.baidou.test;

import com.baidou.entity.User;
import com.baidou.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

/**
 * 使用MP操作H2数据库
 *
 * @author 白豆五
 * @version 2023/04/4
 * @since JDK8
 */
@SpringBootTest
public class H2Test {

    @Autowired
    private UserService userService;

    @Test
    public void test1() {
        User user = new User();
        user.setId(1);
        user.setUsername("张三");
        user.setPwd("123456e");
        user.setSalary(10000); //10k
        boolean flag = userService.save(user);
        System.out.println(flag ? "插入成功" : "插入失败");
    }

    @Test
    public void test2() {
        List<User> list = userService.list();
        System.out.println(list);
    }
}

运行结果:

springboot集成h2,Java笔记,spring boot,数据库,java


重新启动项目,再次通过浏览器访问h2控制台:

springboot集成h2,Java笔记,spring boot,数据库,java

3、 扩展 :基于文件模式将H2数据库持久化

springboot集成h2,Java笔记,spring boot,数据库,java
H2数据库在文件模式下会生成: xxx.mv.db和xxx.trace.db文件。

  • xxx.mv.db是H2数据库的主文件,用于保存数据表的结构和数据。
  • xxx.trace.db是H2数据库的跟踪文件,用于记录数据库的操作和日志信息。

springboot集成h2,Java笔记,spring boot,数据库,java文章来源地址https://www.toymoban.com/news/detail-602517.html

到了这里,关于SpringBoot整合H2数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot3数据库集成

    标签:Jdbc.Druid.Mybatis.Plus; 项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,而对于这个功能的实现,其组件选型也非常丰富; 通过如下几个组件来实现数据库的整合; Druid连接池 :阿里开源的数据库连接池,并且提供 SQL 执行的监控能力; MybatisPlu

    2024年02月13日
    浏览(33)
  • 快速入门Springboot整合Datagpa操作数据库

    Spring Data JPA是Spring Data家族的一部分,可以轻松 实现基于JPA的存储库 。 . JPA是ORM规范,Hibernate是JPA规范的具体实现 ,这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。Spring Data Jpa则是在JPA之上添加另一层抽象(Repository层的实现),极大

    2024年02月07日
    浏览(37)
  • SpringBoot整合达梦数据库的教程(详解)

    一、官网下载试用版本 http://www.dameng.com/down.aspx 我是win 11系统下载如下: 二、安装 解压后 双击打开iso文件 然后点击安装   选择创建实例(注意记住账号/密码 端口号 默认的是 SYSDBA/SYSDBA 5236)   然后一直下一步 到完成(不做其他操作就完成就行了 此时数据库与可视化工具

    2024年02月16日
    浏览(41)
  • 达梦数据库整合在springboot的使用教程

    一、官网下载试用版本 http://www.dameng.com/down.aspx 我是win 11系统下载如下: 二、安装 解压后 双击打开iso文件   然后点击安装   选择创建实例( 注意记住账号/密码 端口号 默认的是 SYSDBA/SYSDBA 5236 )   然后一直下一步 到完成(不做其他操作就完成就行了 此时数据库与可视化

    2024年02月06日
    浏览(44)
  • 详细springboot实现MySQL数据库的整合步骤

    提示:本文适用于初学者,资深玩家仁者见仁智者见智 在家闲来无事,想起最基础的spring boot项目,但整合jdbc,链接数据库一整个操作对于初学者来说还是有些困难,我顺带记录一下。之后把springboot整合Mybatis和整合redis以及一些案例也写一下,期待成品给大家。。。。 提示

    2024年02月03日
    浏览(50)
  • springboot集成Logback 日志写入数据库

    引入maven依赖 注意:springboot内部是有Logback的包,但是本人使用的时候缺少部分类文件,因此单独映入了一次 建表 logback有三张表logging_event、logging_event_exception、logging_event_property,不需要自己创建,只需要在如下位置找到自己保存的库表生成sql复制运行即可. 添加配置文件(logback-sp

    2024年02月07日
    浏览(38)
  • SpringBoot项目整合MybatisPlus并使用SQLite作为数据库

    SQLite 是一个进程内库,它实现了 独立的、无服务器的、零配置 的事务性 SQL 数据库引擎。SQLite 没有单独的服务器进程。 SQLite直接读取和写入普通磁盘文件,就是一个完整的 SQL 数据库 , 包含多个表、索引、 触发器和视图包含在单个磁盘文件中 。 数据库文件格式是跨平台

    2024年01月21日
    浏览(37)
  • Springboot整合Neo4J图数据库

    1.引入依赖 JDK11, neo4J4.4.23 2.解决springboot与neo4j兼容问题

    2024年02月09日
    浏览(32)
  • SpringBoot 如何使用 EmbeddedDatabaseBuilder 进行数据库集成测试

    在开发 SpringBoot 应用程序时,我们通常需要与数据库进行交互。为了确保我们的应用程序在生产环境中可以正常工作,我们需要进行数据库集成测试,以测试我们的应用程序是否能够正确地与数据库交互。在本文中,我们将介绍如何使用 SpringBoot 中的 EmbeddedDatabaseBuilder 来进行

    2024年02月16日
    浏览(46)
  • jdk17 SpringBoot JPA集成多数据库

    switchRegion(切换地区)功能, 客户端可手动切换地区 , 查询不同的数据库, 后台根据地区切换数据库, 请求头添加region的key

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包