JavaFX桌面开发——整合H2数据库

364 阅读4分钟

前言


这篇文章的相关内容 基于 JavaFX 整合了 SpringBoot 的项目,如果不熟悉的可以看我之前的博客: juejin.cn/post/745598…


在使用SpringBoot 进行开发的时候,我们最常用到的数据库就是MySQL,但是MySQL存在很多问题,例如:

  • 需要本地有正在运行的MySQL服务,传递给别人时,还需要考虑对方是否具备环境。(8.0 还是 5.7)
  • 传递给别人时,数据库的内容只能导出为SQL文件给别人运行完之后才能读取.
  • 针对不同的用户,需要调整对应的用户名与密码,有些情况下还要修改url或者Driver

那有没有一种数据库,在不具备环境的情况下就能读取数据库,而且传递给别人时还可以直接使用呢?

而JavaFX最终的目的是形成桌面程序,显然不能使用MySQL,这就引入了我们今天的 H2 数据库


Maven依赖在最下面


H2 相关配置

数据库配置

在IDEA中打开 整合了JavaFX与SpringBoot 的项目,找到 application.yaml,将数据库配置更改为H2的相关内容,如下:

datasource:
  url: jdbc:h2:file:./db/myData;SCHEMA=PUBLIC;DB_CLOSE_DELAY=0;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL 
  driver-class-name: org.h2.Driver
  username: sa
  password:

其中,url 属性中的 各个选项解释如下:

jdbc:h2:file:./db/myData : 表示采用文件的形式保存数据库。对应的路径为 项目目录/db/myData

如果不需要具体的文件,可以修改成 jdbc:h2:mem:testdb,表示在内存中创建testdb作为数据库。

其他属性:

SCHEMA=PUBLIC,表示采用H2的默认数据库模式

DB_CLOSE_DELAY= 0,表示数据库在应用程序结束的时候主动关闭,属性值代表数据库关闭的时间,以为计数单位。若为 -1,则不关闭

DB_CLOSE_ON_EXIT = TRUE,表示数据库在JVM退出时是否允许关闭数据库。

MODE = MYSQL,表示对SQL语句的解析采用MYSQL语法

H2 配置

除了配置上述的数据库属性,还需要针对H2本身进行一系列的配置调整。如下:

datasource:
  url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=0;DB_CLOSE_ON_EXIT=TRUE;MODE=MYSQL
  driver-class-name: org.h2.Driver
  username: sa
  password:
h2:
  console:
    enabled: true
    path: /h2-console
    settings:
      trace: false
      web-allow-others: false

属性的相关解释如下:

console.enabled = ture,表示开启H2控制台,在控制台中可以管理H2数据库的内容

console.path = /h2-console ,表示可以在浏览器中通过 项目访问地址/h2-console 访问H2控制台。

console.settings.trace = false ,表示 不启用控制台的追踪,即输出控制台的日志等信息。

console.settings.web-allow-others = false ,表示不允许其他主机访问 H2控制台。


H2 属性应该与 datasource 同级,位于Spring属性下


SQL 的设置

修改配置

application.yaml 中 添加:(sql 属性与 H2 同级

sql:
  init:
    schema-locations: classpath:db/schema.sql
    data-locations: classpath:db/data.sql
    mode: always

对内部属性的解释如下:

sql.init.shema-locations : classpath:db/schema.sql ,表示 初始化脚本 位于 项目的相对路径(resource/) db/shema.sql.

sql.init.data-locations : classpath:db/data.sql , 表示 数据脚本 位于 项目的相对路径(resource/) db/data.sql

sql.init.mode = always : 表示在应用程序启动时总是执行初始化脚本。其他属性如下:

embedded: 仅在嵌入式数据库(如H2) 中执行初始化脚本.

never: 从不执行初始化脚本.

not-exists: 仅在数据库中不存在任何表时执行初始化脚本.

SQL文件的内容设置

从上一步,我们已经知道存在两个SQL文件—— schema.sqldata.sql

将它们在对应路径创建后,分别编辑内部内容,示例如下:(上面设置了MYSQL语法)


schema.sql:

DROP TABLE IF EXISTS `users1`;
CREATE TABLE  IF NOT EXISTS `users`
(
 `id`       INT  NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL,
 `password` varchar(255) NOT NULL,
 `phone`    varchar(255) NOT NULL,
 primary key (`id`)
) ENGINE = InnoDB,CHARACTER SET = utf8mb4;

data.sql:

INSERT IGNORE INTO `users`(`id`, `name`, `password`, `phone`) VALUES
(1, 'lcy', '123456', '12345678900'),
(2, 'TaogLi', '123', '12345678900'),
(3, 'zhb', '123456', '12345678900');

Maven 依赖

仅需要在之前的依赖基础上添加H2的依赖即可,如下:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

其他

  • JavaFX 对 H2数据库并没有任何不兼容的点,所以只要将MySQL相关的内容替换成H2就能成功整合。
  • 可以通过Mybatis-plus 等技术来对H2数据库进行操作,过程和 MySQL差不多,这里不赘述。
  • 嵌入式数据库 是桌面应用不能忽略的一个点,这里采用 H2 实现,除了 H2 还有 shiro等。

总结

这篇文章主要讲述了 如何在SpringBoot 已经整合了JavaFx的情况下配置H2,为后续的打包EXE建立了良好的基础。