SpringBoot 如何启动并初始化执行 sql 脚本? 您所在的位置:网站首页 mysql如何执行sql SpringBoot 如何启动并初始化执行 sql 脚本?

SpringBoot 如何启动并初始化执行 sql 脚本?

2023-03-24 21:44| 来源: 网络整理| 查看: 265

见字如面,我是咕泡科技创始人Mic(谭锋)

你可以使用 Spring JDBC 或者 MyBatis 来执行 SQL 脚本。

Spring JDBC 是一个简单的 JDBC 抽象层,它可以让你更方便地使用 JDBC,而不用关注低级的细节。MyBatis 是一个优秀的 ORM 框架,它支持使用 XML 或注解来配置 SQL 映射关系,并提供了丰富的查询功能和性能优化功能。

无论你使用哪种方式来执行 SQL 脚本,你都可以通过 Spring Boot 自动化配置来启动和初始化它们。

以下是两种常见的方式:

使用 Spring JDBC

首先,需要在应用程序的配置文件中配置数据源和 JDBC 驱动程序的相关信息:

propertiesCopy code spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=root

接着,你可以使用 Spring JDBC 来执行 SQL 脚本。Spring JDBC 提供了 JdbcTemplate 类来执行 SQL 语句,可以通过在 Application 类中创建一个 JdbcTemplate 实例来初始化 SQL 脚本:

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; ​ @Component public class Application implements CommandLineRunner { ​ @Autowired private JdbcTemplate jdbcTemplate; ​ @Override public void run(String... args) throws Exception { InputStream inputStream = getClass().getResourceAsStream("/db.sql"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuilder stringBuilder = new StringBuilder(); while ((line = reader.readLine()) != null) { stringBuilder.append(line).append("\n"); } jdbcTemplate.execute(stringBuilder.toString()); } ​ }

在上面的代码中,我们实现了 CommandLineRunner 接口,并在 run() 方法中读取一个名为 db.sql 的 SQL 脚本文件,并使用 JdbcTemplate.execute() 方法来执行它。

使用Mybatis

在 Spring Boot 启动时通过 MyBatis 执行 SQL 脚本,可以使用 MyBatis 提供的 SqlSessionFactory 和 SqlSession 来执行 SQL 脚本。以下是实现步骤:

在 application.properties 文件中配置数据源和 MyBatis 相关属性,例如:spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.jdbc.Driver ​ mybatis.type-aliases-package=com.example.model mybatis.mapper-locations=classpath*:mappers/**/*.xml

2. 创建一个初始化 Bean,在该 Bean 中通过 MyBatis 执行 SQL 脚本,例如:

import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; ​ @Component public class DatabaseInitializer implements InitializingBean { ​ @Autowired private SqlSessionFactory sqlSessionFactory; ​ @Override public void afterPropertiesSet() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); try { String script = readScript("classpath:sql/init.sql"); Map params = new HashMap(); params.put("sql", script); sqlSession.insert("com.example.mapper.UserMapper.createTable", params); sqlSession.commit(); } finally { sqlSession.close(); } } ​ private String readScript(String path) throws Exception { InputStream stream = getClass().getClassLoader().getResourceAsStream(path); if (stream == null) { throw new Exception("Script not found"); } BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); StringBuilder builder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { builder.append(line).append("\n"); } reader.close(); return builder.toString(); } }

在上述代码中,我们通过 SqlSessionFactory 创建了一个 SqlSession 对象,并在其中执行了一个名为 init.sql 的 SQL 脚本。我们首先读取 init.sql 文件中的 SQL 语句,并将它们保存在一个字符串中。然后,我们将 SQL 语句作为参数传递给 MyBatis 的 insert 方法,该方法会执行 SQL 语句并返回受影响的行数。最后,我们通过调用 commit 方法将事务提交。

3. 创建 SQL 映射文件,例如:

${sql}

在上述代码中,我们定义了一个名为 createTable 的 SQL 语句,它使用 ${sql} 占位符来表示要执行的 SQL 脚本。

4. 运行 Spring Boot 应用程序,在应用程序启动时,MyBatis 将执行 SQL 脚本。

需要注意的是,执行 SQL 脚本可能需要一些时间,所以我们最好将其放在异步线程中执行,以免阻塞主线程。此外,应该确保 SQL 脚本的正确性,避免出现中途中断的问题。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有