liquibase管理資料庫與tk.mybatis、mybatis-generator結合使用快速生成程式碼
專案架構介紹
專案使用的是springboot框架,MySql資料庫,liquibase資料庫版本管理工具,tk.mybatis統一管理增刪改查,mybatis-generator生成dao層/po層/mapper.xml檔案,jhipster生成controller及service程式碼。
這裡簡單介紹liquibase+tk.mybatis+mybatis-generator結合使用,這樣做的好處就是可以快速搭建專案的基本框架。
liquibase管理資料庫,當資料庫的版本發生變更或者某個表的欄位發生改變,不再需要複雜的修改各個層的程式碼。只需要在liquibase的配置檔案中對這個表做出更改,然後執行mvn命令,mybatis-generator就可以根據表的該表對原先的實體類做出對應的修改,說是修改,其實是重新讀取表結構,重新生成實體類,覆蓋了原先的是體類。
具體配置檔案
1. pom.xml
pom檔案是此專案的基本,根據pom檔案配置了springboot的依賴及liquibase/tk.mybatis/mybatis-generator的外掛。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jeep</groupId> <artifactId>leadsscoring</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>prj-jeep-leadsscoring-2018</name> <description>Jeep Leads Scoring</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> <tk.mybatis.version>3.3.6</tk.mybatis.version> </properties> <profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <profiles.active>dev</profiles.active> <db.driver>com.mysql.jdbc.Driver</db.driver> <db.url>jdbc:mysql://localhost:3306/leadsscoring?useSSL=false</db.url> <db.username>root</db.username> <db.password>root</db.password> </properties> </profile> <profile> <id>qa</id> <properties> <profiles.active>qa</profiles.active> <db.driver>com.mysql.jdbc.Driver</db.driver> <db.url>jdbc:mysql://localhost:3306/hsale?useSSL=false</db.url> <db.username>root</db.username> <db.password>Pass1234</db.password> </properties> </profile> </profiles> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.3</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <finalName>leadsscoring</finalName> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <pluginManagement> <plugins> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>3.6.2</version> <configuration> <changeLogFile>src/main/resources/config/liquibase/changelog/master.xml</changeLogFile> <driver>${db.driver}</driver> <url>${db.url}</url> <username>${db.username}</username> <password>${db.password}</password> </configuration> <executions> <execution> <phase>process-resources</phase> <goals> <goal>update</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <configurationFile>src/main/resources/config/mybatis.generator/generatorConfig.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> <dependencies> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>${tk.mybatis.version}</version> </dependency> <dependency> <groupId> mysql</groupId> <artifactId> mysql-connector-java</artifactId> <version> 5.1.47</version> </dependency> </dependencies> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> <configuration> <delimiters> <delimiter>$</delimiter> </delimiters> <useDefaultDelimiters>false</useDefaultDelimiters> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
簡單介紹其中的幾個元件:
1) 最外層的properties
定義了java的版本,專案的編碼格式,還可以自定義標籤,這裡就自定義了一個tkmybatis的版本標籤,在下面就可以直接使用這個標籤,表示tkmybatis所要使用的版本。
2) profile配置
用於構建不同的環境,這裡定義了兩個環境一個是測試一個是開發,其中通過activeByDefault定義dev為預設的開發環境,這樣在執行專案的時候所使用的就是dev環境下的資料庫配置資訊。在這裡定義了db.driver等標籤配置資料的連線資訊,在application.yml檔案中就可以直接使用這些標籤。
3) pluginManagement
元件管理模組,這個模組是本專案中的重點,使用了liquibase/mybatis-generator等外掛。具體各個標籤的含義可以自己到網上查詢,就不細說了。
重點指出就是mybatis-generator外掛中添加了mysql和tk-mybatis的外掛依賴,這裡的依賴與外層的dependency依賴不同,一個是外掛依賴jar包,一個是專案依賴jar包,不可以通用一個。
2. application.yml
專案中主要的配置檔案:
server:
servlet:
context-path: /leadsscoring
port: 6543
spring:
datasource:
druid:
url: $db.url$
username: $db.username$
password: $db.password$
driver: $db.driver$
# profiles:
# include: $profiles.active$
mybatis:
mapper-locations:
- classpath:mybatis/mapper/*.xml
config-location: classpath:mybaits/mybatis.xml
這裡就可以發現數據庫的配置資訊使用的就是pom檔案中profile模組所定義的標籤了,這樣做的好處就是發不同環境的war包時候,不需要臨時修改application.yml中的資料庫連線資訊。
3. liquibase的配置檔案
主配置檔案master.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"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
<include file="src/main/resources/config/liquibase/changelog/20181024-schema-leadsscoring.xml" relativeToChangelogFile="false"/>
<include file="src/main/resources/config/liquibase/changelog/20181024-data-leadsscoring.xml" relativeToChangelogFile="false"/>
</databaseChangeLog>
使用include添加了另外兩個配置檔案,一個scheme是新建表,一個data是新增資料,如果要修改表結構就可以通過修改schema檔案中的表配置就可以了。
schema-leadsscoring.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
<changeSet author="dongshiyi (generated)" id="1539339960699-10">
<createTable tableName="TT_SALE_INFO">
<column name="CD_SALE" remarks="銷售ID" type="SMALLINT">
<constraints nullable="false"/>
</column>
<column name="SALE_DESC" remarks="銷售簡述" type="VARCHAR(60)">
<constraints nullable="false"/>
</column>
<column name="USER_ID" remarks="所屬使用者" type="VARCHAR(90)"/>
<column name="ST_SALE" remarks="銷售單狀態" type="TINYINT(3)"/>
<column name="DT_UPDATETIMED" remarks="更新時間" type="datetime">
<constraints nullable="false"/>
</column>
<column name="NM_UPDATETIMED" remarks="更新人" type="VARCHAR(60)">
<constraints nullable="false"/>
</column>
<column name="DT_CREATED" remarks="建立日期" type="datetime">
<constraints nullable="false"/>
</column>
<column name="NM_CREATED" remarks="建立人" type="VARCHAR(60)">
<constraints nullable="false"/>
</column>
<column name="BACKUP_COLUMN" type="VARCHAR(150)"/>
</createTable>
</changeSet>
</databaseChangeLog>
data-leadsscoring.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
<changeSet author="dongshiyi (generated)" id="1539339962381-10" >
<insert tableName="TT_SALE_INFO">
<column name="CD_SALE" valueNumeric="1"/>
<column name="SALE_DESC" value="購買手機、耳機"/>
<column name="USER_ID" value="APPTEST01"/>
<column name="ST_SALE" valueNumeric="1"/>
<column name="DT_UPDATETIMED" valueDate="current_timestamp"/>
<column name="NM_UPDATETIMED" value="SYSTEM"/>
<column name="DT_CREATED" valueDate="current_timestamp"/>
<column name="NM_CREATED" value="SYSTEM"/>
<column name="BACKUP_COLUMN" value=""/>
</insert>
<insert tableName="TT_SALE_INFO">
<column name="CD_SALE" valueNumeric="2"/>
<column name="SALE_DESC" value="購買電視機"/>
<column name="USER_ID" value="APPTEST03"/>
<column name="ST_SALE" valueNumeric="1"/>
<column name="DT_UPDATETIMED" valueDate="current_timestamp"/>
<column name="NM_UPDATETIMED" value="SYSTEM"/>
<column name="DT_CREATED" valueDate="current_timestamp"/>
<column name="NM_CREATED" value="SYSTEM"/>
<column name="BACKUP_COLUMN" value=""/>
</insert>
</changeSet>
</databaseChangeLog>
4. mybatis-generator/tk.mybatis的配置檔案generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 必須引入對應驅動包操作資料庫 -->
<!-- 報錯:configfile null does not exist configfile null does not exist -->
<!--<classPathEntry location="mysql-connector-java-5.1.47.jar"/>-->
<!-- 注意context內必需存在節點 及 順序問題 -->
<!-- <context id="context" targetRuntime="MyBatis3" defaultModelType="flat"> -->
<context id="context" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<!-- 生成的Java檔案的編碼 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!--通用程式碼生成器外掛-->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
</plugin>
<jdbcConnection connectionURL="jdbc:mysql://localhost:3306/leadsscoring?useSSL=false" driverClass="com.mysql.jdbc.Driver" password="root" userId="root" />
<!-- 預設false,把JDBC DECIMAL 和 NUMERIC 型別解析為 Integer true,把JDBC DECIMAL 和
NUMERIC 型別解析為java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<javaModelGenerator targetPackage="com.jeep.leadsscoring.po" targetProject="./src/main/java" >
<property name="enableSubPackages" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="mybatis.mapper" targetProject="./src/main/resources" >
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<javaClientGenerator targetPackage="com.jeep.leadsscoring.dao" targetProject="./src/main/java" type="XMLMAPPER" >
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table tableName="tt_sale_info" domainObjectName="SaleInfo"/>
</context>
</generatorConfiguration>
分別定義了po層的路徑,dao層的路徑,還有mapper.xml的路徑。
其中table表中的tableName是要生成程式碼的表名,可以使用%
表示所有表都生成程式碼。如果只生成單個表,後面的引數domainObjectName則表示實體類的名稱。
最上方被註釋掉的classPathEntry就是所要使用的mysql的jar包,如果在外掛中沒有新增mysql的依賴,則需要使用絕對路徑引入本地倉庫中mysql的jar包。
mybatis.xml
最後還有一個mybatis.xml的配置資訊,這個與springboot中的基本配置沒有什麼太大的區別:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- <setting name="logImpl" value="STDOUT_LOGGING" /> -->
<!-- 指定 MyBatis 所用日誌的具體實現,未指定時將自動查詢 -->
<!-- <setting name="logImpl" value="LOG4J" /> -->
<!-- 指定當結果集中值為 null 的時候是否呼叫對映物件的 setter(map 物件時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本型別(int、boolean等)是不能設定成 null 的。 -->
<setting name="callSettersOnNulls" value="true" />
<!-- 延遲載入的全域性開關。當開啟時,所有關聯物件都會延遲載入。 特定關聯關係中可通過設定fetchType屬性來覆蓋該項的開關狀態。 -->
<setting name="lazyLoadingEnabled" value="false" />
<!-- 當開啟時,任何方法的呼叫都會載入該物件的所有屬性。否則,每個屬性會按需載入(參考lazyLoadTriggerMethods). -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 是否開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映。 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
生成資料庫和程式碼
通過maven執行資料庫建表及程式碼生成操作,注意執行前要確定資料庫中已經存在這個庫,就是資料庫連線資訊中配置的leadsscoring庫。
mvn liquibase:update mybatis-generator:generate
執行完畢後控制檯輸出資訊:
第一次執行的時候會因為需要安裝外掛依賴進行下載,花費的時間可能會有點長,安心等待即可。
這時候檢視目錄結構:
我們想要生成的程式碼已經生成成功了,檢視資料庫中也建表成功,資料插入完畢。