`
youyun_2008
  • 浏览: 113697 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

(转)在Web项目中使用LiquiBase实现数据库自动更新

 
阅读更多
在Web项目中,我们可以通过配置servlet listener使用LiquiBase自动更新数据库。需要以下七个步骤:
1. 创建一个数据库变更日志(change log)文件。
2. 在变更日志文件内部创建一个变更集(change set)。
3. 配置JNDI数据源。
4. 在项目中加入包liquibase。
5. 配置项目中的web.xml文件。
6. 启动项目。
7. 检验数据库中的变更。


Changelog.xml:


Html代码  收藏代码

   
<?xml version="1.0" encoding="UTF-8"?>  
    <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9  
            http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">  
    <changeSet id="1" author="jim">  
      
    <createTable tableName="useraccount">  
    <column name="userid" type="bigint(20)">  
    <constraints primaryKey="true" />  
    </column>  
    <column name="accountstate" type="varchar(255)" />  
    <column name="expiredDate" type="datetime" />  
    <column name="username" type="varchar(255)" />  
    </createTable>  
      
    <addUniqueConstraint tableName="useraccount"  
    columnNames="username" constraintName="username" />  
      
    </changeSet>  
      
    <changeSet id="2" author="jim">  
      
    <addColumn tableName="useraccount">  
    <column name="gender" type="varchar(1)" value="M">  
    <constraints nullable="false"/>  
    </column>  
    </addColumn>  
              
    </changeSet>  
      
    </databaseChangeLog>  




Web.xml:
Html代码  收藏代码

   
<?xml version="1.0" encoding="UTF-8"?>  
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    <display-name>liquid</display-name>  
      
    <description>MySQL Test App</description>  
    <resource-ref>  
    <description>DB Connection</description>  
    <res-ref-name>jdbc/test</res-ref-name>  
    <res-type>javax.sql.DataSource</res-type>  
    <res-auth>Container</res-auth>  
    </resource-ref>  
      
    <context-param>  
    <param-name>LIQUIBASE_CHANGELOG</param-name>  
    <param-value>db.changelog.xml</param-value>  
    </context-param>  
      
    <context-param>  
    <param-name>LIQUIBASE_DATA_SOURCE</param-name>  
    <param-value>java:comp/env/jdbc/test</param-value>  
    </context-param>  
      
    <context-param>  
    <param-name>LIQUIBASE_FAIL_ON_ERROR</param-name>  
    <param-value>true</param-value>  
    </context-param>  
      
    <context-param>  
    <param-name>LIQUIBASE_CONTEXTS</param-name>  
    <param-value>jdbc/test</param-value>  
    </context-param>  
      
    <listener>  
    <listener-class>liquibase.servlet.LiquibaseServletListener</listener-class>  
    </listener>  
      
    </web-app>  



     通过上面的web.xml文件,可以看到这里配置了一个listener,LiquibaseServletListener这个类继承了ServletContextListener,ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。当服务器启动时,LiquibaseServletListener的 contextInitialized()方法被调用,这个方法会比较数据库与Changelog.xml的不同,并自动更新数据库。
     那么LiquiBase是怎么更新数据的呢?当LiquibaseServletListener第一次被调用时,会创建了两个特定的表。第一个特定于 LiquiBase 的表称为 databasechangelog,它跟踪应用到数据库的所有变更 — 有助于跟踪谁执行了数据库变更以及原因。第二个特定于 LiquiBase的表是 databasechangelock,标识出具有数据库变更锁的用户。LiquiBase通过比较databasechangelog中的记录和Changelog.xml中的changeSet,更新数据库。
     liquid项目1中Changelog.xml中的只有1条changeset

Xml代码  收藏代码

   
<changeSet id="1" author="jim">  
      
    <createTable tableName="useraccount">  
    <column name="userid" type="bigint(20)">  
    <constraints primaryKey="true" />  
    </column>  
    <column name="accountstate" type="varchar(255)" />  
    <column name="expiredDate" type="datetime" />  
    <column name="username" type="varchar(255)" />  
    </createTable>  
      
    <addUniqueConstraint tableName="useraccount"  
    columnNames="username" constraintName="username" />  
      
    </changeSet>  



    启动项目1,LiquiBase会自动创建表useraccount,并添加字段userid,accountstate,expiredDate,username。Databasechangelog表会新增一条表示<changeSet id="1" author="jim">的记录。

    liquid项目2中Changelog.xml中的多加了1条changeset


Xml代码  收藏代码

   
<changeSet id="2" author="jim">  
      
    <addColumn tableName="useraccount">  
    <column name="gender" type="varchar(1)" value="M">  
    <constraints nullable="false"/>  
    </column>  
    </addColumn>  
              
    </changeSet>  




     启动项目2,LiquiBase会发现<changeSet id="1" author="jim">已经更新,所以只更新新增的<changeSet id="2" author="jim">。添加字段gender,并设置值为“M”。如果删除表useraccount,并删除表Databasechangelog中所有的记录,重新启动项目2,LiquiBase将创建表useraccount,并添加字段userid,accountstate,expiredDate,username和gender,并设置gender的值为“M”。
    根据上面LiquiBase的特性,如果我们把每一次的数据库变更都写进到changeSet,并使用LiquiBase更新数据库,我们就可以通过对Changelog.xml文件进行版本控制,来控制数据库的版本。当我们升级软件的时候,也可以很方便地自动更新数据库。

  

    参考资料:
    IBM 使用 LiquiBase 管理数据库变更:http://www.ibm.com/developerworks/cn/java/j-ap08058/index.html

    LiquiBase官网:http://www.liquibase.org/ (国内的IP可能进不去,要用代理)
分享到:
评论

相关推荐

    在Web项目中使用LiquiBase实现数据库自动更新

    本文将深入探讨如何在Web项目中集成并使用LiquiBase来实现数据库的自动更新。 LiquiBase通过跟踪和应用数据库变更集来管理数据库的演变。变更集是描述数据库结构变化的独立单元,比如创建表、修改列或添加索引。...

    s2sh博客,自动生成数据库

    标题中的“s2sh博客,自动生成数据库”指的是一个基于Struts2、Spring和Hibernate(简称S2SH)三大主流Java EE框架构建的博客系统,该系统具备自动创建或更新数据库的能力。这样的功能对于开发者来说非常便利,因为...

    swf-2.2.zip

    使用Play Liquibase插件,开发者首先需要在应用配置文件(application.conf)中设置相关的Liquibase属性,如数据库连接信息和变更日志的位置。接着,通过编写变更日志文件(通常是XML、YAML或JSON格式),定义数据库...

    spring2.5 mvc 完整项目

    数据库脚本包括创建表、插入初始数据等操作,这些可以通过SQL语句实现,并在项目启动时自动执行。为了更好地组织和管理这些脚本,可以使用数据库版本控制工具如Flyway或Liquibase。 四、Spring 2.5 MVC项目构建 1....

    毕业设计基于springboot+layui+mysql实现的健身房管理系统源码+数据库

    【标题】:“毕业设计基于springboot+layui+mysql实现的健身房管理系统源码+数据库”是一个综合性的项目,它涵盖了Web开发中的多个核心技术,包括Spring Boot、LayUI和MySQL。这个系统是为健身行业定制的,旨在提升...

    若依微服务数据库执行sql

    在若依微服务中,我们通常会使用ORM(Object-Relational Mapping)框架如MyBatis或Hibernate来简化数据库交互。这些框架允许我们将SQL语句封装在Java代码中,通过注解或XML配置文件进行管理,从而提高开发效率和代码...

    spring-boot-liquibase-rest-example:简单的spring boot rest api骨架项目来购物,如何使用liquibase

    1. **初始化数据库**:在项目启动时,Liquibase会根据变更日志文件自动创建和更新数据库表。例如,我们可以为商品创建一个`products`表,包括`id`、`name`、`description`和`price`等字段。 2. **版本控制**:随着...

    基于springboot开发在线音乐网站(包含数据库脚本文件)

    在本项目中,"基于Springboot开发在线音乐网站(包含数据库脚本文件)"是一个使用现代Web技术构建的音乐分享和播放平台。该网站利用Spring Boot框架的优势,为用户提供了一个简洁、高效的交互体验。以下是对该项目...

    springmvc+queryrunner自动生成

    在IT行业中,SpringMVC和QueryRunner是两个非常重要的组件,它们在开发Web应用程序时起着关键作用。本文将深入探讨这两个技术,并...在实际项目中,开发者应当充分利用这些工具和方法,以实现高效、安全的Web应用开发。

    基于springboot的中小型医院网站源码数据库.zip

    总的来说,这个项目提供了一个完整的中小型医院信息管理系统实例,涵盖了前后端开发的多个方面,是学习SpringBoot和Java web开发的好材料。通过分析源码和数据库设计,我们可以了解如何在实际场景中运用这些技术和...

    springdemo

    在SpringBoot项目中,Liquibase可以与Spring的初始化过程集成,自动在应用启动时执行数据库迁移。这使得开发者能够以版本化的形式管理数据库模式,并确保数据库结构与代码同步。 在`springbootdemo`这个项目中,...

    将之前基于SSM实现的教务管理系统改成SpringBoot+Mybatis实现.zip

    在SpringBoot项目中,可以使用`@DataSourceProperties`和`Flyway`或` Liquibase`进行数据库迁移。 5. **源代码结构**: - `src`目录下,原来的`java`和`webapp`目录会被替换为`src/main/java`(存放Java源码)和`...

    javaweb进销存源码-liquibase-workshop:liquibase-车间

    数据库服务器并在浏览器中打开管理界面,请运行以下命令。 请注意,此任务运行 H2 数据库发行版中的 Java 程序,该程序不会自动退出。 您必须按 CTRL-C 才能返回命令行。 gradlew startDatabase 或者,运行gradle ...

    JHIPSTER操作指南

    JHipster支持的数据库有多种,包括关系型数据库和NoSQL数据库,例如MySQL和MongoDB,它会自动使用Liquibase来处理数据库更新。Liquibase可以帮助JHipster创建改变日志文件,进行数据库的版本控制和管理,保证数据...

    springboot042IT技术交流和分享平台的设计与实现.zip

    在本项目"springboot042IT技术交流和分享平台的设计与实现"中,我们可以深入探讨如何利用Spring Boot框架构建一个高效、用户友好的在线IT技术交流和分享平台。Spring Boot以其简洁的配置和快速开发特性,成为了现代...

    Springboot+Mybatis+MySql搭建实例.zip

    如果需要在启动应用时自动创建或更新数据库表,可以使用Spring Boot的Flyway或Liquibase插件进行数据库迁移。 9. **异常处理和日志** 为了提高应用的健壮性,可以配置全局异常处理器,并启用Spring Boot的日志...

    springmvc+jdbctemplate+mchange+multidatasource

    4. **Multi DataSource**:多数据源是指在一个应用中使用多个不同的数据库源。这在处理分布式系统、数据隔离、读写分离、高可用性等场景时非常有用。在Spring中,可以使用AbstractRoutingDataSource或Spring Boot的...

    DevOps.for.Web.Development.2016.10.pdf

    #### 知识点五:DevOps 在 Web 开发中的应用 - **前端开发**: - 使用工具如 Webpack 自动化前端资源打包。 - 通过 Babel 转换现代 JavaScript 语法以兼容旧浏览器。 - **后端开发**: - 应用服务器如 Node.js ...

    springboot_vue.zip

    综上所述,"springboot_vue.zip"项目是一个综合性的全栈开发示例,涵盖了SpringBoot后端、Vue.js前端以及MySQL数据库的使用,是学习和实践现代Web开发的宝贵资源。开发者可以借此深入了解SpringBoot和Vue.js的结合,...

    自动化测试环境部署相关文件

    使用如Flyway、 Liquibase等数据库迁移工具可以帮助管理数据库结构的变化,而Mockito等工具可用于模拟数据交互,避免对真实数据库的直接操作。 综上所述,自动化测试环境部署涉及多个方面,从环境配置、工具选择到...

Global site tag (gtag.js) - Google Analytics