`
cgs1999
  • 浏览: 530162 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在Spring项目中实现动态创建数据库

 
阅读更多
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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics