博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LiquiBase实战总结
阅读量:4493 次
发布时间:2019-06-08

本文共 7045 字,大约阅读时间需要 23 分钟。

LiquiBase概述  转载 https://blog.csdn.net/Netbug_NB/article/details/40075493 

Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。

 

Liquibase具备如下特性:

* 不依赖于特定的数据库,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12种数据库,这样在数据库的部署和升级环节可帮助应用系统支持多数据库。
* 提供数据库比较功能,比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库。
* 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作。
* 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化(ChangSet)。
* 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态。
* 可生成数据库修改文档(HTML格式)
* 提供数据重构的独立的IDE和Eclipse插件。

Liquibase的核心就是存储变化的XML,如例:

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.6"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.6
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.6.xsd">
<changeSet id="1" author="netbug_nb">
<createTable tableName="department">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(50)">
<constraints nullable="false"/>
</column>
<column name="active" type="boolean" defaultValue="1"/>
</createTable>
</changeSet>
</databaseChangeLog>
其中,changeSet包含不同的数据库变化,几乎涵盖了所有的数据库变化类型,具体支持的类型要看API,我这里给几个例子:

* 创建和删除表、视图、存储过程、主键、外键、索引等

* 重命名表、视图、列等

* 加入列缺省值、唯一约束、非空约束等

* 合并两个列

* 在一个表的数据的基础上创建一个字典表

除此之外,Liquibase还允许你运行自己的Sql脚本、执行Shell程序。

在ivy.xml中引入Liguibase的依赖

?xml version="1.0" encoding="UTF-8"?>

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
...
<!-- 数据库相关内容 -->
...
<dependency org="org.liquibase" name="liquibase-core" rev="2.0.4" conf="compile->compile(*),master(*);runtime->runtime(*)" transitive="false"/>
...
</dependencies>
</ivy-module>
将Liquibase集成到spring框架

<beans>

...
<!-- 数据库事务管理 -->
<bean id="tm"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds" />
</bean>
<!-- 初始化数据库 -->
<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
<property name="dataSource" ref="ds" />
<property name="changeLog" value="classpath:com/cdv/test/db_changelog/master.xml" />
<property name="contexts" value="production" />
</bean>
</beans>
编制数据库变更文件

我大致分了分类:

om/cdv/test/db_changelog/master.xml ——引用了下面三个文件c
com/cdv/test/db_changelog/table.xml ——对数据库表的更改过程
com/cdv/test/db_changelog/view.xml ——对视图的更改过程
com/cdv/test/db_changelog/data.xml ——对数据的操作

com/cdv/test/db_changelog/master.xml如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
<include file="table.xml" relativeToChangelogFile="true" />
<include file="view.xml" relativeToChangelogFile="true" />
<include file="data.xml" relativeToChangelogFile="true" />
</databaseChangeLog>

com/cdv/test/db_changelog/table.xml如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
<!-- OOOOOO注意: 本文件不要格式化OOOOOO -->
<changeSet author="netbug_nb" id="20131128-test" context="production">
<createTable tableName="bf_role">
<column name="rolename" type="NVARCHAR(100)"><constraints nullable="false" primaryKey="true" primaryKeyName="PK_ROLE" /></column>
<column name="roleconfig" type="TEXT"></column>
<column name="readonly" type="TINYINT"><constraints nullable="false" /></column>
</createTable>
<createTable tableName="bf_user">
<column name="userid" type="NVARCHAR(100)"><constraints nullable="false" primaryKey="true" primaryKeyName="PK_USER" /></column>
<column name="username" type="NVARCHAR(100)"><constraints nullable="false" /></column>
<column name="password" type="NVARCHAR(32)"><constraints nullable="false" /></column>
<column name="rolename" type="NVARCHAR(100)"><constraints nullable="false" /></column>
<column name="departmentid" type="NVARCHAR(100)"></column>
<column name="email" type="NVARCHAR(255)"></column>
<column name="cellphone" type="NVARCHAR(14)"></column>
<column name="telphone" type="NVARCHAR(20)"></column>
<column name="columns" type="TEXT"></column>
<column name="disabled" type="TINYINT"><constraints nullable="false" /></column>
<column name="readonly" type="TINYINT"><constraints nullable="false" /></column>
</createTable>
<changeSet author="netbug_nb" id="20140107-test" context="production">
<addColumn tableName="bf_synctask">
<column name="content" type="TEXT"></column>
</addColumn>
<createSequence sequenceName="BF_SQ_SYNCTASKID" startValue="0" incrementBy="1" />
</changeSet>
<changeSet author="netbug_nb" id="20140109-test" context="production">
<modifyDataType tableName="bf_file" columnName="hash" newDataType="NVARCHAR(50)"/>
<addColumn tableName="bf_file">
<column name="infection" type="TEXT"></column>
</addColumn>
</changeSet>
</databaseChangeLog>
com/cdv/test/db_changelog/data.xml如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
<changeSet author="sun-wei" id="20131128-test-initdata">
<!-- 初始化角色 -->
<insert tableName="bf_role">
<column name="rolename" value="系统管理员" />
<column name="readonly" valueBoolean="true" />
</insert>
<insert tableName="bf_role">
<column name="rolename" value="维护管理员" />
<column name="readonly" valueBoolean="true" />
</insert>
<!-- 初始化用户 -->
<insert tableName="bf_user">
<column name="userid" value="admin" />
<column name="username" value="系统管理员" />
<column name="password" value="xxxxxxxxxxxx" />
<column name="rolename" value="系统管理员" />
<column name="disabled" valueBoolean="false" />
<column name="readonly" valueBoolean="true" />
</insert>
<insert tableName="bf_user">
<column name="userid" value="manager" />
<column name="username" value="维护管理员" />
<column name="password" value="xxxxxxxxxxxxx" />
<column name="rolename" value="维护管理员" />
<column name="disabled" valueBoolean="false" />
<column name="readonly" valueBoolean="true" />
</insert>
</changeSet>
</databaseChangeLog>
OK,现在启动你的Web应用

启动后,Liquibase将自动帮你创建数据库表字段视图等、以后数据库结构发生任何变化,去添加ChangeSet吧,它会帮你修改数据库的,不需要你直接操作数据库了。

Liquibase通过在你的数据库中增加两个它自己表来判断和处理数据库的变化。
另外,Liquibase还支持不同数据的的方言哦,通过在ChangeSet中增加dbms属性即可达到目的,比如
<changeSet author="xxx" id="xxxx-id-1" context="production" dbms="mssql">
...
</changeSet>
<changeSet author="xxx" id="xxxx-id-1" context="production" dbms="mysql">
...
</changeSet>

Best Wishes For You!

转载于:https://www.cnblogs.com/yachao1120/p/11357740.html

你可能感兴趣的文章
怎样比较、分析两组或者两组以上的数据?
查看>>
数据解析01-15
查看>>
linux 安装mysql数据库——yum安装法
查看>>
Several ports (8005, 80, 8009) required by Tomcat v6.0 Server at localhost are already in use
查看>>
事件监听器
查看>>
解决 libstdc++.so.5: cannot open shared object file: No such file or directory 问题
查看>>
iframe引入百度地图显示企业位置
查看>>
加载事件(...)
查看>>
Android初学第47天
查看>>
jQuery基本使用
查看>>
Python3文件处理
查看>>
Web APi入门之Self-Host寄宿及路由原理 【转载】
查看>>
ViewPager加载Activity
查看>>
移动APP项目研发流程及版本规划(转)
查看>>
Jquery 操作HTML5自定义属性data-*
查看>>
python redis
查看>>
一文弄懂神经网络中的反向传播法——BackPropagation
查看>>
18.错误处理
查看>>
边界值测试
查看>>
windows socket client server 测试
查看>>