SpringBoot-人人开源框架 整合H2数据库,MySql转H2数据库

1.H2 数据库介绍(度娘的)

H2数据库是一个用Java编写的开源的关系型数据库管理系统(RDBMS),具有轻量级、快速、免费的特点。它可以嵌入到Java应用程序中作为嵌入式数据库运行,也可以在客户端-服务器模式下运行,允许远程访问。H2数据库主要用于测试和开发阶段,但也适用于轻量级的生产应用。

以下是H2数据库的主要特点:

  1. 轻量级和快速:H2数据库非常小巧,通常以一个单一的JAR文件提供,易于集成到Java应用程序中。它对内存和处理器的要求较低,从而提供了高效的性能。
  2. 内存数据库:H2支持内存模式,即数据库可以存储在RAM中,这提供了非常高的访问速度和查询性能。但请注意,在这种模式下,数据不会持久存储在磁盘上。
  3. 嵌入式数据库:在嵌入式模式下,H2数据库可以嵌入到Java应用程序中,无需安装或管理一个独立的数据库系统。
  4. 客户端-服务器模式:除了嵌入式模式外,H2也可以配置为一个独立的数据库服务器,支持远程访问。
  5. 支持SQL和JDBC:H2数据库兼容大多数SQL标准,并提供了JDBC API,使得开发者能够使用标准的SQL语句进行数据库操作。
  6. 附加功能:H2还提供了基于磁盘或内存的数据库和表、只读数据库支持、临时表等附加功能。

H2数据库的使用场景非常广泛,包括但不限于企业应用开发、桌面应用开发、移动应用开发等。在这些场景中,H2数据库能够提供一个可靠、容量大、运行稳定、响应迅速、性能高的数据存储环境。此外,当某些场景下数据模型必须为关系型时,H2数据库也可以充当Memcached使用,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据。

总的来说,H2数据库是一个功能强大、灵活且易于使用的轻量级数据库,特别适用于需要快速、高效且易于集成的数据库解决方案的场景。

官方致命文档:H2 Database Engine

备注:作者通过内嵌以及服务器两种方式连接H2数据库,均测试成功。步骤描述涉及两种方式。

2.通过官方文档连接下载H2数据库包:

3.mySql数据库转换成H2数据库:

Idea下载mysqlToH2插件。IDea 工具栏点开 MySql To H2,将Mysql数据库导出的sql语句转换一下。如下图:

4.解压步骤2中下载的H2数据库,执行bin目录下.bat文件(window环境)

5.执行后在菜单栏找到h2-ConSole图标,右键图标创建一个新的数据库。linux系统可通过命令创建(自行度娘)。

6.通过h2-console连接刚创建的数据库

7.连接创建好的数据库:通过下图框中执行sql语句,也可以通过h2控制台工具执行sql语句。这里通过步骤3 mySql转h2的sql文件直接执行是不成功的,需要做部分修改。主要是修改点有:部分字段数据类型

7.1 数据库修改对比:

备注:本人迁移的数据库表比较少,基本上是手动修改的;如果有其他更好的办法,可以相互交流。

8.renren-damin下 pom.xml配置。

dependencies下添加:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 排除默认的 Tomcat 依赖 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

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

        <!--h2数据库-->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.2.224</version>
        </dependency>

build下添加:

            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>db</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*</include>
                </includes>
                <targetPath>${project.build.outputDirectory}/db</targetPath>
            </resource>

            <resource>
                <directory>${project.basedir}/dist</directory>
                <targetPath>META-INF/resources</targetPath>
            </resource>

注:此处DB文件夹也是框架自带的,如果框架内嵌方式连接数据库,可将DB路径下 mysql.sql文件替换成自己生成的sql文件。如图:

9.内嵌方式手动执行sql文件。在renren-admin->src->main->java->io->renren->common->config目录(路径根据自己实际情况来)下创建H2DataSourceConfig类。如果在步骤7中自己创建了数据库文件,H2DataSourceConfig类执行要生成的数据库文件也可以用步骤7生成的替代。

package io.renren.common.config;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.jdbc.datasource.init.ScriptUtils;
import org.springframework.stereotype.Service;

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

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

    /**
     * 初始化sql文件所在位置
     */
    private static final List<String> SCHEMAS = Lists.newArrayList(
            "db/mysql.sql"
/*            "db/generator/mysql.sql",
            "db/region_data/mysql.sql"*/
    );

    @Autowired
    DataSource dataSource;

    @Value("${h2.file-path}")
    private String filePath;
    @Value("${h2.db-name}")
    private String dbName;


    @PostConstruct
    public void init() throws Exception {
        //初始化本地数据库
        // 创建一个标识文件,只有在第一次初始化数据库时会创建,如果系统用户目录下有这个文件,就不会重新执行sql脚本
        File f = new File(filePath + File.separator+dbName+".lock");
        if(!f.exists()){
            log.info("--------------初始化h2数据----------------------");
            log.info("{}",f.getPath());
            f.getParentFile().mkdirs();
            f.createNewFile();

            for (String schema : SCHEMAS) {
                // 加载资源文件
                Resource resource = new ClassPathResource(schema);
                EncodedResource encodedResource = new EncodedResource(resource, "utf-8");

                // 手动执行SQL语句
                ScriptUtils.executeSqlScript(dataSource.getConnection(),encodedResource);
            }
        }
    }
}

10.renren-admin 下 application.yml配置修改:

10.1

# Tomcat
server:
  jetty:
    acceptors: 2
    selectors: 4
    request-header-size: 8192
    max-http-form-post-size: 1048576
  port: 8888
  servlet:
    context-path: /network-admin
    session:
      cookie:
        http-only: true

10.2

  h2:
  #如需通过可视化界面访问数据库,需要配置以下参数
  console:
    path: /h2-console  #h2嵌入式数据库控制台,可以通过浏览器访问
    enabled: true

  resources:
    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/


#h2数据库配置
h2:
  #数据库名称
  db-name: netool
  #数据库文件地址
  #file-path: E:\h2\data\file
  file-path: /opt/h2-test/file

11. renren-admin下application-prod.yml 配置文件修改(根据自己实际使用配置文件对应修改)

内嵌模式连接:

      driver-class-name: org.h2.Driver
      #内嵌连接模式
      url: jdbc:h2:file:${h2.file-path}/${h2.db-name};MODE=MYSQL
      username: root
      password: 123456
      initialization-mode: always

服务器模式连接:

      driver-class-name: org.h2.Driver
      #混合连接模式
      #url: jdbc:h2:tcp://192.168.2.74/E:/h2/data/data/netool
      #url: jdbc:h2:tcp://192.168.2.20/./netool
      username: root
      password: 123456
      initialization-mode: always

12.总结:服务器模式需要手动先启动h2数据库,内嵌模式不需要。linux系统可用下面的启动命令:java -jar h2-2.2.224.jar -tcp -tcpAllowOthers -webAllowOthers 或者

java -cp h2*.jar org.h2.tools.Server -webDaemon -tcpAllowOthers -baseDir /opt/h2-data/h2/data/dist       baseDir为自己数据库路径。

  • 21
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot 内嵌的 H2 数据库是一款基于 Java 的内存数据库,可以很方便地在应用程序中使用。使用 H2 数据库有很多好处,比如它非常轻量级,可以快速启动和停止,适合于开发和测试环境等。 下面是在 Spring Boot 中使用 H2 数据库的步骤: 1. 在 pom.xml 中添加 H2 数据库的依赖: ```xml <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> ``` 2. 在 application.properties 文件中配置 H2 数据库相关信息: ```properties # H2 Database spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password= ``` 这里的配置将 H2 数据库的 URL 设置为 `jdbc:h2:mem:testdb`,表示使用内存数据库,用户名和密码分别设置为 `sa` 和空字符串。 3. 创建实体类和数据访问层: ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // getters and setters } @Repository public interface UserRepository extends JpaRepository<User, Long> { } ``` 这里我们创建了一个名为 `User` 的实体类,并使用 `JpaRepository` 接口来访问数据库。 4. 创建控制器和服务层: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public List<User> getUsers() { return userService.getUsers(); } } @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getUsers() { return userRepository.findAll(); } } ``` 这里我们创建了一个名为 `UserController` 的控制器,并使用 `UserService` 来获取用户列表。 5. 运行应用程序,并访问 http://localhost:8080/users 即可查看用户列表。 总之,使用 H2 数据库内嵌到 Spring Boot 应用程序中非常简单,可以方便地进行开发和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值