盘古BPM体验地址    盘古BPM交流群盘古BPM交流群号:963222735

使用liquibase管理数据库

分享牛 4968℃

    在实际项目开发中,通常会使用到数据库,比如mysql或者oracle等。既然涉及到数据库那肯定涉及到数据表的操作了,没有表怎么操作呢?以下面的一个场景为例进行说明:

    一个开发部门有张三李四王五三个人并且同时在开发同一个项目,假如有一天张三需要在数据库表中新增一个列,然后吧唧吧唧写个一个sql,上线之前将sql脚本交给dba执行,然后上线项目,这个流程没问题,同样的场景,李四也需要修改数据库表,比如增加一个列,但是上线后,突然发现忘记将自己修改的sql脚本交给dba了,很显然,项目报错了。

    上面的问题归根结底是因为有了sql脚本并交给其他人去执行,进而导致问题发生。

    我们再来一个场景,比如王五来公司上班半年了,技术领导问他,这半年都涉及到那些表的修改操作,比如删除,增加列,新增表等等,那很显然,如果没有这些历史文件的记录和备份,那很显然王五也很迷茫了,这个问题说明对于数据库表的操作如果能有版本控制该多好。

    上面的2个问题,其实我们就可以使用liquibase框架来解决。该框架主要解决两个问题:

(1)数据库表的操作有版本的概念,比如第一个版本增加列,第二个版本增加表,都有记录在案。

(2)项目启动的时候可以自动执行我们的SQL脚本,如果发现涉及到有表、视图、索引之类的变更操作,就直接运行这些SQL脚本。

操作步骤如下:

1.引入liquibase的jar包如下所示:

<dependency>
 <groupId>org.liquibase</groupId>
 <artifactId>liquibase-core</artifactId>
 <version>3.5.3</version>
</dependency>

2.既然要操作表,肯定需要配置数据库连接的信息了,在这里我们使用spring方式,简单省事,dataBase.xml内容如下:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:mysql://127.0.0.1:3306/flowable6?useUnicode=true&amp;characterEncoding=UTF-8
        </value>
        </property>
        <property name="username">
            <value>root</value>
        </property>
        <property name="password" value="" />
</bean>
</beans>

3.我们暂且模拟一个表的创建,我们将需要创建的表的规则写到flowable-modeler-app-db-changelog.xml中,内容如下:

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

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"

    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd

http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <changeSet id="1" author="flowable">

<!-- model -->

    <createTable tableName="ACT_DE_MODEL">

    <column name="id" type="varchar(255)">

    <constraints primaryKey="true" nullable="false" />

    </column>

    <column name="name" type="varchar(400)">

    <constraints nullable="false" />

    </column>

    <column name="model_key" type="varchar(400)">

    <constraints nullable="false" />

    </column>

    <column name="description" type="varchar(4000)">

    <constraints nullable="true" />

    </column>

    <column name="model_comment" type="varchar(4000)">

    <constraints nullable="true" />

    </column>

    <column name="created" type="datetime(6)">

    <constraints nullable="true" />

    </column>

    <column name="created_by" type="varchar(255)">

    <constraints nullable="true" />

    </column>

    <column name="last_updated" type="datetime(6)">

    <constraints nullable="true" />

    </column>

    <column name="last_updated_by" type="varchar(255)">

    <constraints nullable="true" />

    </column>

    <column name="version" type="int">

    <constraints nullable="true" />

    </column>

    <column name="model_editor_json" type="longtext">

    <constraints nullable="true" />

    </column>

    <column name="thumbnail" type="longblob">

    <constraints nullable="true" />

    </column>

    <column name="model_type" type="int">

<constraints nullable="true" />

</column>

    </createTable>

    </changeSet>

</databaseChangeLog>

4.测试,代码如下:

public static void main(String[] args) throws Exception {
    ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/huimin/process/liquibase/dataBase.xml");
    DataSource dataSource = (DruidDataSource) ctx.getBean("dataSource");
    DatabaseConnection connection = new JdbcConnection(dataSource.getConnection());
    Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(connection);
    Liquibase liquibase = new Liquibase("cn/huimin/process/liquibase/flowable-modeler-app-db-changelog.xml", new ClassLoade    rResourceAccessor(), (DatabaseConnection) database.getConnection());
    liquibase.update("flowable");
}

代码说明:

1.获取数据源。

2.实例化Liquibase 。

3.调用liquibase中的update方法来更新表。

转载请注明:分享牛 » 使用liquibase管理数据库