`
cgs1999
  • 浏览: 537359 次
  • 性别: 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
分享到:
评论

相关推荐

    Springcloud 多数库 多数据源整合,查询动态切换数据库

    本主题聚焦于在Spring Cloud环境中实现多数据库和多数据源的整合,并且能够动态切换查询的数据库。这是一个复杂但至关重要的需求,特别是在大型企业级应用中,可能需要根据业务逻辑或用户权限连接到不同的数据库。 ...

    Spring Security 把授权信息写入数据库

    为了将用户信息和角色存储在数据库中,你需要实现`UserDetailsService`接口,并创建一个定制的服务,例如`CustomUserDetailsService`。这个服务会查询数据库来获取用户信息,包括用户名、密码、权限等。Spring ...

    spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目

    "spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目"是针对这种需求的一个解决方案,旨在提供一种灵活且动态的数据源切换机制。 首先,Spring框架作为Java领域中最受欢迎的应用框架之一,其强大...

    通过Spring Boot配置动态数据源访问多个数据库的实现代码

    在Spring Boot项目中,数据库访问是通过Restful接口来实现的,该接口用于提供数据库访问的服务。 项目结构 该项目的结构主要包括以下几个部分: * config:数据源配置管理类 * datasource:自己实现的数据源管理...

    Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查

    本项目旨在演示如何利用Spring和Quartz从数据库中动态加载定时任务,并实现对它们的增删改查功能。以下是关于这个主题的详细知识讲解。 首先,Quartz是一个开源的作业调度框架,它允许开发者创建、安排和执行定时...

    Spring系统多数据库动态切换,完整demo直接使用

    总之,这个demo提供了Spring MVC和Spring Data JPA环境下多数据库动态切换的完整实现,包括数据源配置、动态数据源的创建、以及如何在业务代码中进行切换。通过学习和实践这个示例,你可以更好地理解和掌握如何在...

    spring 动态切换数据库

    在Spring框架中,动态切换数据库是一项重要的功能,它允许应用程序根据特定条件或需求在运行时灵活地连接到不同的数据库。这种能力在多租户环境、数据隔离或测试环境中尤其有用。接下来,我们将深入探讨实现这一功能...

    springboot通过数据库动态连接多数据库

    本篇文章将深入探讨如何在Spring Boot中实现数据库的动态切换。 首先,我们需要了解Spring Boot的数据源配置。默认情况下,Spring Boot通过`application.properties`或`application.yml`文件中的`spring.datasource...

    Spring.Net,Nhibernate多数据库操作

    在上述代码中,`database1Service`和`database2Service`是Spring在配置文件中声明的数据库服务bean的ID。 通过这种方式,Spring.Net和NHibernate的结合使用,使得在.NET环境中进行多数据库操作变得简单且灵活。你...

    spring-boot集成neo4j图形数据库,并实现简单的节点创建和查询

    在本文中,我们将深入探讨如何将流行的Java框架Spring Boot与强大的图形数据库Neo4j集成,以及如何在集成后实现节点的创建和查询操作。Spring Boot以其便捷的微服务开发体验和自动化配置闻名,而Neo4j则是一款专为...

    Springboot整合Quartz实现定时任务数据库动态配置

    本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的动态配置。 首先,我们需要在项目中添加依赖。在Spring Boot的`pom.xml`文件中,引入Spring Boot的`spring-boot-starter-...

    spring+hibernate整合实现简单数据库添加记录

    在Spring中,我们可以使用DAO接口,然后通过Spring的Proxy模式动态实现这些接口。 5. **Service层**:业务逻辑层,负责处理应用程序的核心业务。这里可以注入DAO,调用其方法进行数据库操作。Service层也是事务边界...

    spring security实现动态授权

    然而,通过动态授权,我们可以将用户、角色和资源信息存储在数据库中,允许在运行时动态配置权限,而无需重启服务,从而极大地提高了灵活性。 动态授权的核心在于权限模型的设计。在Spring Security中,我们通常...

    spring多数据库

    总的来说,"spring多数据库"项目提供了一个标准的Spring项目模板,帮助开发者理解和实践如何在Spring中实现多数据库的切换查询,从而提升应用的灵活性和扩展性。通过合理配置和编程,可以有效地管理和操作来自多个...

    SpringBoot基于MYSQL动态生成数据库

    在实际开发中,我们可能需要更复杂的动态生成数据库的逻辑,例如根据配置文件或API动态创建表。这时,可以使用`@PostConstruct`注解的方法在应用启动后执行特定的数据库初始化代码。例如: ```java import org....

    spring security自定义数据库小项目

    本项目旨在演示如何利用 Spring Security 的灵活性,将权限管理与数据库相结合,从而实现动态、可扩展的权限控制。通过这种方式,我们可以根据业务需求动态地增删改查权限,避免在配置文件中硬编码权限,提高了系统...

    Mybatis+Spring+SpringMVC 框架项目源码 超市订单管理系统 +数据库脚本

    在本项目中,Spring负责管理对象的生命周期和依赖关系,通过配置XML或注解来实现依赖注入,使得代码更加模块化和易于维护。 2. **SpringMVC框架**:SpringMVC是Spring框架的一部分,专门用于处理Web请求。它遵循...

    spring4 MVC +maven + mysql数据库 + mybatis+根据后台json前台动态生成table

    在本项目中,我们主要探讨的是如何利用Spring4 MVC、Maven、MySQL数据库、MyBatis框架以及前端JSON数据来动态生成表格。这是一个常见的Web应用开发模式,它可以帮助开发者快速构建数据驱动的Web应用程序。 首先,...

    quartz整合springbatch动态集群定时实现mysql参考

    在这个“quartz_springbatch_dynamic”项目中,我们将看到如何将这两个强大的工具结合起来,以实现动态集群环境中的定时任务执行,并使用MySQL作为数据存储。 Quartz是一个开源的作业调度框架,允许开发者创建、...

    struts2+ibatis+spring+ext完整项目含数据库

    这个"struts2+ibatis+spring+ext完整项目含数据库"的压缩包文件很可能是提供了一个集成这些技术的实际应用示例,帮助开发者理解和学习如何在实际项目中将它们结合起来。 **Struts2** 是一个基于MVC(Model-View-...

Global site tag (gtag.js) - Google Analytics