1、问题描述
在使用Spring框架的J2EE项目中,都会在其配置文件中配置数据源,如下所示
config.properties文件
applicationContext.xml文件
当所连接的数据库不存在时,就会报错,所以很多的时候,我们都需要先预先创建好指定名称的数据库,这样运行后才不会有问题。虽然创建数据库的工作量不大,但每次部署新环境的时候都需要预先创建数据库,不然系统就不能正常运行。
那么,能不能将创建数据库的步骤放入到系统中呢?答案是肯定的,下面就如何实现动态创建Spring项目所需的数据库进行说明。
2、解决思路
Spring项目运行不起来的原因是:在Spring实例化dataSource的时候,指定数据库不存在,导致实例化失败,导致系统不能正常运行。那么,如果在Spring实例化dataSource之前,所要连接的数据库已经存在的话,问题就解决了。
以MySQL为例,创建数据库执行的SQL脚本如下:
create database if not exists `duoduo` default character set utf8
若在Spring实例化dataSource之前就执行了上面的SQL语句,实例化dataSource就不会报错,系统就可以正常运行了。
3、解决过程
3.1 调整properties文件的配置
创建数据库时,除了数据库的驱动、用户名和密码外,还需要知道数据库服务器的地址和端口、数据库的名称等信息。从原先的config.properties文件中,我们只能通过解析jdbc.url的内容来获得数据库服务器的地址和端口、以及数据库名称,处理起来比较麻烦。
下图为调整后的properties文件的配置,既保持了之前的配置项,又提供了创建数据库所需的内容。
3.2 增加创建数据库帮助类
package com.duoduo.core.flyway;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class DatabaseHelper {
private String dbHost = "localhost";
private int dbPort = 3306;
private String dbName = "mysql";
private String dbUsername = "root";
private String dbPassword = "";
public void setDbHost(String dbHost) {
this.dbHost = dbHost;
}
public void setDbPort(int dbPort) {
this.dbPort = dbPort;
}
public void setDbName(String dbName) {
this.dbName = dbName;
}
public void setDbUsername(String dbUsername) {
this.dbUsername = dbUsername;
}
public void setDbPassword(String dbPassword) {
this.dbPassword = dbPassword;
}
private String getDbUrl() {
return String.format("jdbc:mysql://%s:%d/", dbHost, dbPort);
}
/**
* 创建需要的数据库
*/
public void prepareDatabase() {
try {
Class.forName("com.mysql.jdbc.Driver");
// 连接已经存在的数据库,如:mysql
Connection connection = DriverManager.getConnection(getDbUrl(), dbUsername, dbPassword);
Statement statement = connection.createStatement();
// 创建数据库
statement.executeUpdate("create database if not exists `" + dbName + "` default character set utf8");
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.3 调整Spring的配置文件
其中(1)databaseHelper的bean中需要特别注意要增加初始化方法
init-method="prepareDatabase";
(2)dataSource的bean中需要特别注意增加依赖配置
depends-on="databaseHelper",确保dataSource的实例化在databaseHelper的实例化之后;
4、运行结果
当Spring项目连接的数据库不存在时,项目会自动创建并连接指定名称的数据库;当Spring项目连接的数据库已存在时,项目会连接的已数据库。运行结果符合预期,问题解决。
项目相关代码已分享在 https://git.oschina.net/beixiang/demo-springdb,有兴趣的童靴可以自行前往查阅(
注:代码和案例内容有所不同)。
- 大小: 7.1 KB
- 大小: 10.8 KB
- 大小: 26.2 KB
- 大小: 41 KB
分享到:
相关推荐
本项目为基于 Spring Kafka 的动态配置消费者的 Demo,主要实现了以下功能: 1. 动态读取数据库配置连接 Kafka 地址 2. 动态创建 Kafka 消费者,并监听指定的 Topic 3. 可以通过调用接口动态启动或停止 Kafka 的消费...
SpringBoot基于MYSQL动态生成数据库
通过本文,读者将能够轻松集成HikariCP到Spring Boot项目中,从而提高数据库连接的性能和效率。 HikariCP的工作原理可以概括为以下几点: 1. 连接创建与缓存:HikariCP通过预先创建并缓存一定数量的数据库连接,来...
12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. ...
12.2.2. 在Spring容器中创建 SessionFactory 12.2.3. The HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的...
sentinel规则持久化到...这是一个项目压缩包,解压后,修改数据库地址, 需要监控的项目中还需要配置一下 yml spring: cloud: sentinel: transport: dashboard: xxx:8080 访问接口后,才会出现监控的东西和菜单
1.前端用jquery-zTree插件,后端读取数据库配置,并封装成json格式,把树显示在前端。Strtus2+Spring架构。 2.内涵定时调度的配置和使用例子。Spring+Quartz
基于SpringBoot/WebFlux+Shiro+JPA+Java/Scala,实现的数据库细粒度动态权限管理系统(源码),项目经过严格测试,确保可以运行! 环境 SpringBoot 2.0.3.RELEASE SpringBoot WebFlux SpringBoot Data Jpa Apache ...
主要给大家介绍了关于Spring Boot如何动态创建Bean的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
Spring security认证授权例子,自动创建数据库,在SysUser类增加字段,即可动态增加数据库对应表sys_user字段(前提是要删除原表,启动应用时才会重建表)
- [在传统Spring应用中使用spring-boot-actuator模块提供监控端点](http://blog.didispace.com/spring-boot-actuator-without-boot/) - [Spring Boot应用的后台运行配置]...
经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...
12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7...
实现JPA基本数据库操作功能封装 实现基于ASM9,动态生成entity、repository、service、serviceImpl、controller相关.class 可根据库表,一键生成新增、修改删除、查询等接口 实现部分基于mybatis-plus,动态代码生成...
Spring和MyBatis的整合是Java开发中常见的架构模式,它提供了一种高效、灵活的方式来管理数据库操作和业务逻辑层。本文深入探讨了Spring和MyBatis整合的关键原理和实践要点,帮助架构师和开发者有效地利用这两个强大...
SpringBoot 整合Mybatis 创建临时表
5 Spring数据库 106 5.1 Spring+JDBC 106 5.1.1 Jdbc编程特点 106 5.1.2引入DataSource 106 5.1.3 核心类JdbcTemplate 106 5.1.4 使用JdbcTemplate 106 5.1.5 继承JdbcDaoSupport 107 5.1.6 使用properties文件 107 ...
基于深度学习+VUE前端+SpringBoot的人流量检测系统设计与实现python源码+项目说明+数据库(高分毕设).zip ## 简介 最近人工智能大火,之前也做了一些相关的项目,有软件有硬件,但大都不够完整,没什么实用价值,...
在本项目中,Thymeleaf负责将静态页面与动态数据进行结合,实现前端页面的渲染。 功能概述: 用户注册与登录:用户可以在网站上注册账号并登录,以便参与众筹项目。 项目管理:用户可以创建、编辑和删除众筹项目,...
3. 授权粒度只细化到角色级别,白话就是角色即权限,这么做一方面本项目没有前后分离也没有实现前后分离的动态路由,所以没必要细化到各角色权限也能实现该有的功能 4. 一些开源组件实现可能还存在比较细节的错误 ...