在Web项目中,我们可以通过配置servlet listener使用LiquiBase自动更新数据库。需要以下七个步骤:
1. 创建一个数据库变更日志(change log)文件。
2. 在变更日志文件内部创建一个变更集(change set)。
3. 配置JNDI数据源。
4. 在项目中加入包liquibase。
5. 配置项目中的web.xml文件。
6. 启动项目。
7. 检验数据库中的变更。
Changelog.xml:
<?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:
<?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
<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
<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可能进不去,要用代理)
下载:
liquibase-1.9.5.zip LiquiBase1.9.5 jar包
maven_project.rar 2个Mevan项目
分享到:
相关推荐
java web项目,使用JDBC连接MySQL数据库,首先得在本机的MySQL数据库中创建相应的数据库和数据表,并添加相关数据,解压后在MyEclipse中通过import向导将整个文件夹加入到工程中,然后运行即可。
JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园...
java web从入门到精通配套源代码,《Java Web从入门到精通》介绍如何整合Web框架进行J2EE开发,所有实例都基于MyEclipse IDE开发,引领读者快速进入基于JaVa web的J2EE应用领域。《Java Web从入门到精通》开始主要...
介绍了在Internet/Intranet网页设计中被广泛使用的ASP的基本概念和运行机制,ASP,ADO,ODBC和数据库之间的关系,以及ADO实现对数据库访问的具体方法和步骤。重点讨论了在利用IIS所含的ASP和ADO实现Web数据库访问时,如何...
web项目数据库连接样例web项目数据库连接样例web项目数据库连接样例web项目数据库连接样例web项目数据库连接样例
一个完整的java web项目 包括sqlserver2005数据库
人力资源管理系统 java web 完整项目 包含源码和数据库 人力资源管理系统 java web 完整项目 包含源码和数据库
物流管理平台 java web 完整项目 包含源码和数据库 物流管理平台 java web 完整项目 包含源码和数据库
一个直接使用的web项目,连接数据库,显示在table上!一个好例子
电子商务系统 java web 完整项目 包含源码和数据库 更新中
没分了迫不得已把我们做的java Web网上书城项目上传上来 值得借鉴
实现显示Mysql数据库中的内容,可以在eclipse中实现mysql数据库中的具体内容,还可以显示其他信息,另外加了背景显示。
使用Java Swing界面实现数据库基本操作,使用Java Swing界面实现数据库基本操作
Web数据库设计 Web数据库设计 Web数据库设计
JAVA WEB项目十多套包含数据库文件
在jsp连接SQL server 2000数据库时,必须添加相关的jdbc驱动,设置其环境变量,并在程序中编写jdbc代码来实现数据库的连接,从而在java web中对数据库进行查找、插入、删除更新等操作。 jdbc驱动文件必须包含:...
Sprigboot-web项目,解析日志和数据库数据并且显示在页面上,端口是3399,拿到项目之后,只需要修改数据库部分就可以使用了
电子商务系统 java web 完整项目 包含源码和数据库 电子商务系统 java web 完整项目 包含源码和数据库
基于Spring+Spring MVC+Mybatis+mysql实现web聊天室项目源码+数据库+项目说明.7z 【使用技术】 项目使用Maven构建,后台使用的语言是JAVA 框架为Spring + Spring MVC + Mybatis 数据库使用的是MySQL 前端采用Amaze ...