LiquiBase实战总结

简介: LiquiBase概述 Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。 Liquibase具备如下特性: * 不依赖于特定的数据库,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12种数据库,这样在数据库的

LiquiBase概述

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>

编制数据库变更文件

我大致分了分类:
  1. om/cdv/test/db_changelog/master.xml ——引用了下面三个文件c
  2. com/cdv/test/db_changelog/table.xml ——对数据库表的更改过程
  3. com/cdv/test/db_changelog/view.xml ——对视图的更改过程
  4. 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!


目录
相关文章
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
JavaScript 前端开发 搜索推荐
【庖丁解牛】vue-element-admin前端CRUD通用操作组件详解
【庖丁解牛】vue-element-admin前端CRUD通用操作组件详解
2091 0
【庖丁解牛】vue-element-admin前端CRUD通用操作组件详解
|
9月前
|
druid Java 应用服务中间件
五大主流数据库连接池的深度剖析与对比
HikariCP通过优化concurrentBag和fastStatementList等集合,提升了并发的读写效率。它采用threadlocal缓存连接,并大量运用CAS机制,以最大程度地减少lock的使用。从字节码的维度进行代码优化,确保方法尽量控制在35个字节码以内,以提升JVM处理效率。HikariCP在此基础上的进一步优化措施包括:利用ping命令进行mysql连接,以及通过Sharding-JDBC的Driver、Server和Sidecar三个版本,构建灵活多样的生态系统,满足不同需求和环境。对于线上应用,Sharding-JDBC-Driver可提供直连数据库的最优性能,而Sha
|
云安全 安全 Go
云:私有云与公有云对比
公有云与私有云安全的区别
718 1
|
存储 Go
Go中make和new的区别
在 Go 语言中,`make` 和 `new` 都用于分配内存,但功能不同。`make` 用于初始化切片、映射和通道,并返回初始化后的对象;`new` 分配内存并返回指向零值的指针,适用于任何类型。`make` 返回的是数据结构本身,而 `new` 返回指针。`make` 完整初始化特定数据结构,`new` 只初始化为零值。
454 0
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!
|
人工智能 算法 前端开发
首个 AI 编程认证课程上线!阿里云 AI Clouder 认证:基于通义灵码实现高效 AI 编码
为了帮助企业和开发者更好使用通义灵码,阿里云上线了“AI Clouder 认证课程--基于通义灵码实现高效 AI 编码”。本课程汇聚了后端、前端、算法领域 5 名实战派专家,带你体验 4 大研发场景实践,上手 3 大实操演练,深度掌握智能编码助手通义灵码,实现全栈 AI 编码技能跃升。
|
人工智能 算法 前端开发
首个 AI 编程认证课程上线!阿里云 AI Clouder 认证:基于通义灵码实现高效 AI 编码
为了帮助企业和开发者更好使用通义灵码,阿里云上线了“AI Clouder 认证课程--基于通义灵码实现高效 AI 编码”。本课程汇聚了后端、前端、算法领域 5 名实战派专家,带你体验 4 大研发场景实践,上手 3 大实操演练,深度掌握智能编码助手通义灵码,实现全栈 AI 编码技能跃升。
|
SQL Java 数据库连接
数据库迁移不再难:Flyway 与 Liquibase 大比拼,哪个才是你的真命天子?
【9月更文挑战第3天】数据库迁移在软件开发中至关重要,尤其在使用 ORM 框架如 Hibernate 时。为确保部署时能顺利应用最新的数据库变更,开发者常使用自动化工具。Flyway 和 Liquibase 是当前流行的两种选择,均能有效管理数据库版本控制。Flyway 采用 SQL 脚本表示变更,简单易用;Liquibase 支持多种脚本格式,功能更强大,适合复杂项目。本文将对比这两种工具的特点,并通过示例展示各自的优缺点,帮助开发者根据项目需求做出合适的选择。
3236 1