mybatis逆向工程,真的不是我懒!

今天我们来搞搞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的类是专门用来对这个单表来查询的类。目前我还没怎么用到它。

更新于 2019-04-08

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容