今天我们来搞搞mybatis的逆向工程,那么我们先看看啥是mybatis的逆向工程。
简单点说,就是通过数据库中的单表,自动生成java代码。
Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\po类)
也就是说,我们可以通过mybatis逆向工程生成dao,pojo,mapper.xml这些东东,节省我们写这些代码的时间,可以把更多的时间花在业务上。哈哈,盘它。
这里我使用mysql演示,相信其他关系数据库也类似吧!(注意我使用的springboot哦,没办法,我已经彻底爱上它ˋωˊ)
第一步:
maven的pom文件加入依赖
<!--mybatis 的starter 必须的吧-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--mybatis的逆向工程生成器-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!--maven的mybatis逆向工程插件,有了它双击就开始盘 ,简直不要太方便,仔细哟,这是个插件,要放在插件里面,别写到依赖里面了。-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!--这里注意了哟,这里是mybatis逆向工程的配置文件的位置,1 这个文件必须存在,2 这个路径要准确,仔细看,这个路径是从项目下src开始。(其他细节遇到再百度吧,比如不写这个会怎样?)-->
<configurationFile>src/main/resources/config/generatorConfig.xml</configurationFile>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
</configuration>
</plugin>
上边写的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>
<!--这个是你springboot的配置文件,它会加载spring的配置-->
<properties resource="application.yml"/>
<!-- 必须要有这个 mysql驱动的位置 这个是MySQL连接的jar包,你需要指定你自己计算机上的jar包的位置,我用的自己本机的maven仓库的,注意别只复制这个jar存在的路径,在最后边要加上jar的名字哦。细节细节-->
<classPathEntry location="/media/chenjunan/D/deepin/apache-maven-3.6.0/repository/mysql/mysql-connector-java/8.0.15/mysql-connector-java-8.0.15.jar"/>
<context id="Tables" targetRuntime="MyBatis3">
<!-- 生成 JavaBean 对象重写 toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<!-- 取消生成注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--这是mysql连接的配置信息,DriverClass的路径是否存在 cj 看自己mysql连接的版本 5.xx没有cj。6.xx的有cj-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/xunjian?serverTimezone=GMT" <!--这个serverTimezone我查了下是返回的时间问题,等用到了在细学吧!-->
userId="root"
password="root">
<!--这个很重要,没有的话,会发生一些奇怪的问题,稍后细讲!-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和NUMERIC 类型解析为java.math.BigDecimal 涉及金额就要注意了哟-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--指定javaBean生成的位置 targetProject="./src/main/java" 注意src前面有个 ./-->
<!--targetPackage="com.chenggongyuan.xunjian.pojo",这里是自己项目的名字,下面的都得替换成自己的项目名称-->
<javaModelGenerator targetPackage="com.chenggongyuan.xunjian.pojo"
targetProject="./src/main/java">
<!--这个为true 逆向工程可能会生成子包-->
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 指定sql映射文件生成位置 -->
<sqlMapGenerator targetPackage="mapper" targetProject="./src/main/resources/mappers">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 指定dao接口生成的位置,mapper接口 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.chenggongyuan.xunjian.mapper"
targetProject="./src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 制定每个表的生成策略 这里可以写多个表,表名和需要生成的pojo名写正确 -->
<table tableName="staff" domainObjectName="Staff"></table>
</context>
</generatorConfiguration>
接下来开始运行。
首先点击 maven
深度截图_选择区域_20190408165056.png
再双击它。
深度截图_选择区域_20190408165129.png
看看控制台有没有error,没有就成功!有的话就需要随着问题继续学习了。(有问题不要生气,你可是励志成为百万年薪的高级程序员。)
看看生成的文件吧
深度截图_选择区域_20190408165011.png
到这,演示结束了,后边说说问题,有兴趣的继续嗨~
1 上边说道 <property name="nullCatalogMeansCurrent" value="true" />这个配置不加,会有问题,我们看看会有啥问题!图片可能看起来太乱,这里我选择口述。
我 的mysql数据库我在里面建了两个数据库,两个数据库都有staff这个名字的表。虽然我在配置连接数据库时指定了数据库,相信聪明的你一定看到。
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/xunjian?serverTimezone=GMT" <!--这个serverTimezone我查了下是返回的时间问题,等用到了在细学吧!-->
userId="root"
password="root">
在url后边我指定了xunjian这个数据库,但对staff这个表逆向工程时,却生成了另外一个数据库的staff表的pojo。令我很是不解,但在官方文档有他的答案。 官方文档 ,在下才疏学浅,并未看懂。遗憾~。总结一句话,MySql不能正确支持SQL目录和架构。哪天遇到高手了,再细究。
2 相信大家看到逆向工程还生成了××Example的类,放在pojo中,它有什么用处呢?
先打开看看。。
protected String orderByClause;
protected boolean distinct;
protected List<Criteria> oredCriteria;
public StaffExample() {
oredCriteria = new ArrayList<Criteria>();
}
......
三个属性,和一个构造函数,后边还有很多set,get方法和其他一些方法,我就省略了,有兴趣的自己去看看便是!
第一个属性 orderByClause ,从他 的名字看,大概是通过什么排序。 String 类型。它 的demo样子如下
userExample.setOrderByClause("username asc"); //asc升序,desc降序排列
这下懂了,对某个表查询的时候根据某属性排序。
第二个属性distinct boolean值,翻译过来意思是 确切的,在mysql中一般使用它对查询的结果根据某个属性去重,就是查询出某个字段不重复的记录,一般用来查询不重复记录的条数。。
用法例如
select distinct name from user
如果在user表有两个name为张三的,那么结果只会显示一个。这里我想到一个场景,一张考勤表,上面有学生这堂课签到和签退记录,甚至有学生恶意反复刷,统计上课学生人数时就可以使用它来通过名字去重,当然如果班上有重名的考虑其他方案。这里我们再说这个场景,班上有两个叫张三的,我通过name和id去重。对应sql语句如下:
select distinct name,distinct id from user
这种写法至少在我的机器上报了错,并且提示error发生在distinct id附近。原因是distinct必须放在要查询字段的开头。多个字段可能需要考虑group by了,分组去重,对应sql如下
select distinct id,name from user group by name
第三个叫oredCriteria,是个Criteria 的list,看看这个类是啥!
public static class Criteria extends GeneratedCriteria {
protected Criteria() {
super();
}
}
static class,继续--->
protected abstract static class GeneratedCriteria {
protected List<Criterion> criteria;
protected GeneratedCriteria() {
super();
criteria = new ArrayList<Criterion>();
}
它的父类抽象了,又多个一个list,Criteria 变成了Criterion,查了意思是标准,规范。继续深入-->
public static class Criterion {
private String condition; //where 后面的条件
private Object value;
private Object secondValue;
private boolean noValue;
private boolean singleValue;
private boolean betweenValue;
private boolean listValue;
private String typeHandler;
Criteria类—-可以把它想成where条件的集合
Criteria包含一个Criterion的集合,每一个Criteria对象内包含的Criterion之间是由AND连接的,是逻辑与的关系。
好了,不继续深入了,用到了在深入吧,免得学了又忘! 总之啊,这个××Example的类是专门用来对这个单表来查询的类。目前我还没怎么用到它。