liquibase管理数据库与tk.mybatis、mybatis-generator结合使用快速生成代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nb7474/article/details/83387101

项目架构介绍

项目使用的是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

执行完毕后控制台输出信息:
在这里插入图片描述

第一次执行的时候会因为需要安装插件依赖进行下载,花费的时间可能会有点长,安心等待即可。

这时候查看目录结构:

在这里插入图片描述

我们想要生成的代码已经生成成功了,查看数据库中也建表成功,数据插入完毕。

猜你喜欢

转载自blog.csdn.net/nb7474/article/details/83387101