文档章节

数据库逆向框架代码生成工具:MyBatis Generator的使用

蛙牛
 蛙牛
发布于 2014/02/16 14:10
字数 1421
阅读 83130
收藏 168

MyBatis Generator的详细介绍http://mybatis.github.io/generator/index.html

MyBatis Generator  With Maven http://mybatis.github.io/generator/running/runningWithMaven.html

1前言

前段时间根据工作需要,使用Spring+Mybatis完成了一个功能模块,领导推荐了MyBatis Generator(以下简称为MBG),可以逆向生成持久层的基本代码,而且mybatis的实现方案比较好,可以自由组合完成比较复杂的查询,当然更复杂的就需要手动写了,下面整理下基本使用

2搭建逆向工程

1.创建一个Maven项目:File——New Project——Maven

2.在pom文件中,添加MBG插件,IDE会自动帮我们下载插件

(如果没反应,可以点开右侧Maven Project选项卡刷新以下)

(插件1.3.0有点小bug,不能去掉生成的注释)

<build>
        <finalName>mybatis_generator</finalName>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
            </plugin>
        </plugins>
</build>

3.在src/main/resource目录下创建generatorConfig.xml文件

(官方配置以及说明:http://mybatis.github.io/generator/configreference/xmlconfig.html

<?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>
    <!--数据库驱动jar -->
    <classPathEntry location="E:\mysql-connector-java-5.1.7-bin.jar" />

    <context id="DB2Tables" targetRuntime="Ibatis2Java5">
        <!--去除注释  -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!--数据库连接 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/news"
                        userId="root"
                        password="">
        </jdbcConnection>
        <!--默认false
           Java type resolver will always use java.math.BigDecimal if the database column is of type DECIMAL or NUMERIC.
         -->
        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--生成实体类 指定包名 以及生成的地址 (可以自定义地址,但是路径不存在不会自动创建  使用Maven生成在target目录下,会自动创建) -->
        <javaModelGenerator targetPackage="com.qianyan.model" targetProject="MAVEN">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!--生成SQLMAP文件 -->
        <sqlMapGenerator targetPackage="com.qianyan.persistence.ibatis"  targetProject="MAVEN">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!--生成Dao文件 可以配置 type="XMLMAPPER"生成xml的dao实现  context id="DB2Tables" 修改targetRuntime="MyBatis3"  -->
        <javaClientGenerator type="SPRING" targetPackage="com.qianyan.persistence.dao"  targetProject="MAVEN">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!--对应数据库表 mysql可以加入主键自增 字段命名 忽略某字段等-->
        <table tableName="USER" domainObjectName="User" >
        </table>

    </context>
</generatorConfiguration>

4.点击Maven Project——项目——Plugins——mybatis generator——Run Maven build


5.可以根据自己项目的配置,把生成的代码拷贝到自己的项目中去

3生成代码的使用

mybatis设计比较巧妙,Dao层就不用说了,这里主要介绍下实体类User和UserExample

User类就是普通的实体类,定义了数据库对应的字段,以及set/get方法

Example类是干嘛的呢?用其它项目中的几个例子还说明一下吧

1.比如在一个项目 我们要删除某个小组下某个用户的信息

 public int deleteUserApplyInfo(long user_id,long team_id){
        StudyTeamUserApplyInfoExample ue = new StudyTeamUserApplyInfoExample();
        ue.createCriteria()
                .andUserIdEqualTo(new BigDecimal(user_id))
                .andTeamIdEqualTo(new BigDecimal(team_id));
        return studyTeamUserApplyInfoDAO.deleteByExample(ue);
    }

2.根据小组ID(非主键 更新小组信息)

public int updateStudyTeamInfo(StudyTeamInfo st){
        StudyTeamInfoExample ste = new StudyTeamInfoExample();
        ste.createCriteria().andTeamIdEqualTo(st.getTeamId());
        return studyTeamInfoDAO.updateByExampleSelective(st,ste);
    }

3.(1)模糊查询并且排序 (2)大于等于某个分数 并且小于某个分数的查询

public List<StudyTeamInfo> getStudyTeamInfoByName(String team_name){
        StudyTeamInfoExample se = new StudyTeamInfoExample();
        se.createCriteria().andTeamNameLike("%"+team_name+"%").andEnableEqualTo((short)1);
        se.setOrderByClause("team_score desc");
        List<StudyTeamInfo> ls = studyTeamInfoDAO.selectByExample(se);
        if(ls!=null&&ls.size()>0){
            return ls;
        }
        return null;
    }
public StudyTeamLevel getStudyTeamLevel(long score){
        StudyTeamLevelExample le = new StudyTeamLevelExample();
        le.createCriteria().andNeedScoreLessThanOrEqualTo(score).andUpScoreGreaterThan(score);
        List<StudyTeamLevel> ls = studyTeamLevelDAO.selectByExample(le);
        if(ls!=null&&ls.size()>0){
            return ls.get(0);
        }
        return null;
    }

Example中提供了Critertia,一种面向对象的查询方式,并且根据实体类中字段的属性,生成不同的操作。

当然你也可以根据实际需要直接使用实体类进行增删改查

4一些问题的解决方案

在实际应用中,自己也遇到了一些问题,下面是这些问题的解决方案,欢迎提供更好的方法

1.字段默认值问题

在数据库中,一些字段有默认值,比如c_time,我们在insert操作时,不需要这个字段

public void saveUserStudyTeamApplyInfo(StudyTeamUserApplyInfo uai){
        long ref = studyTeamInfoDAO.getSeqAllRef();
        uai.setRef(new BigDecimal(ref));
        studyTeamUserApplyInfoDAO.insertSelective(uai);
    }

可以调用insertSelective方法,传入实体类,方法会根据实体类中存在值的字段动态拼接sql

2.分页问题

mybatis没有提供分页的解决方法,可能是因为数据库之间分页的差距比较大

通过修改java代码只能做到内存分页,所以还是需要在sqlmap中添加数据库分页

参考了网上某篇博客的解决方法(地址找不到了),加了分页头和分页尾的,这样只用写内部的sql

可以一定程度下减少错误几率

<!-- oracle 分页头 -->
    <sql id="oracle_Pagination_Head" >
        <dynamic >
            <isNotEmpty property="first" >
                <isNotEmpty property="last" >
                    <![CDATA[select * from ( select row_.*, rownum rownum_ from ( ]]>
                </isNotEmpty>
            </isNotEmpty>
        </dynamic>
    </sql>
    <!-- oracle 分页尾 -->
    <sql id="oracle_Pagination_Tail" >
        <dynamic >
            <isNotEmpty property="first" >
                <isNotEmpty property="last" >
                    <![CDATA[) row_ where rownum <= #last# ) where rownum_ > #first#]]>
                </isNotEmpty>
            </isNotEmpty>
        </dynamic>
    </sql>

<select id="findAllStudyTeamMessagePage" parameterClass="java.util.Map"    resultMap="ResultMapWithUserName">
        <!-- 增加oracle分页头部 -->
        <include refid="oracle_Pagination_Head" />
        select a.*,b.user_name,b.photo_name, rownum rn,sysdate
        from user_info b,study_team_user_message a
        where  b.user_id=a.user_id
        and type=0
        <isNotEqual prepend="and" property="team_id" compareValue="0">
            a.team_id=#team_id#
        </isNotEqual>
        order by a.ref desc
        <include refid="oracle_Pagination_Tail" />
    </select>

3.mysql text字段无法识别问题

<!--对应数据库表 mysql可以加入主键自增 字段命名 忽略某字段等-->
        <table tableName="article" domainObjectName="Article" >
            <columnOverride column="content" jdbcType="VARCHAR" />
        </table>

下载:GIT@OSC http://git.oschina.net/lujianing/Mybatis_Generator

ps:2014-3-28

公司用的是ibatis2.3.x 所以使用的 

<context id="DB2Tables" targetRuntime="Ibatis2Java5">
<javaClientGenerator type="SPRING"

如果使用 type=XMLMAPPER (xml直接实现dao)

需要targetRuntime is MyBatis3 而且不向下兼容

http://mybatis.github.io/generator/configreference/javaClientGenerator.html


2014-9-15


<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.0</version>
                <dependencies>
                    <dependency>
                        <groupId>com.oracle</groupId>
                        <artifactId>ojdbc14</artifactId>
                        <version>10.2.0.2.0</version>
                    </dependency>
                </dependencies>
            </plugin>

在pom中可以直接配置依赖的数据库   generatorConfig.xml就不需要再配置数据库的jar了


© 著作权归作者所有

共有 人打赏支持
蛙牛

蛙牛

粉丝 529
博文 46
码字总数 48937
作品 1
朝阳
程序员
私信 提问
加载中

评论(28)

2305289447
2305289447
挺不错的
蛙牛
蛙牛

引用来自“风马少年”的评论

个人觉得生成的Example好像并不是很好用,和其他人合作开发个项目,数据库表偏多,每一个表都生成了Example,但是大多数情况下用不着,看着挺揪心的。对比起Example,本人更喜欢自己写一句sql。博主怎么看?

引用来自“蛙牛”的评论

个人觉得Example 挺好的~ 因为互联网公司大部分业务都是单表查询(生产环境不允许连接查询,由java代码组装业务),如果按照这种思路,mybatis generator完全够用了,写sql不利于后期维护。

引用来自“风马少年”的评论

java代码 组装业务是什么意思呀

引用来自“蛙牛”的评论

没有连接查询,都是单表查询,用java代码去组装业务

引用来自“风马少年”的评论

那是不是得设计的很好。不然的话使用Example的单表查询不都是查询出来所有字段。不会很浪费吗
确实会返回所有字段,不过数据库的瓶颈大部分在检索查询上,返回的字段多影响的不算大。追求极致的话,还是可以自定义的。
风马少年

引用来自“风马少年”的评论

个人觉得生成的Example好像并不是很好用,和其他人合作开发个项目,数据库表偏多,每一个表都生成了Example,但是大多数情况下用不着,看着挺揪心的。对比起Example,本人更喜欢自己写一句sql。博主怎么看?

引用来自“蛙牛”的评论

个人觉得Example 挺好的~ 因为互联网公司大部分业务都是单表查询(生产环境不允许连接查询,由java代码组装业务),如果按照这种思路,mybatis generator完全够用了,写sql不利于后期维护。

引用来自“风马少年”的评论

java代码 组装业务是什么意思呀

引用来自“蛙牛”的评论

没有连接查询,都是单表查询,用java代码去组装业务
那是不是得设计的很好。不然的话使用Example的单表查询不都是查询出来所有字段。不会很浪费吗
蛙牛
蛙牛

引用来自“风马少年”的评论

个人觉得生成的Example好像并不是很好用,和其他人合作开发个项目,数据库表偏多,每一个表都生成了Example,但是大多数情况下用不着,看着挺揪心的。对比起Example,本人更喜欢自己写一句sql。博主怎么看?

引用来自“蛙牛”的评论

个人觉得Example 挺好的~ 因为互联网公司大部分业务都是单表查询(生产环境不允许连接查询,由java代码组装业务),如果按照这种思路,mybatis generator完全够用了,写sql不利于后期维护。

引用来自“风马少年”的评论

java代码 组装业务是什么意思呀
没有连接查询,都是单表查询,用java代码去组装业务
风马少年

引用来自“风马少年”的评论

个人觉得生成的Example好像并不是很好用,和其他人合作开发个项目,数据库表偏多,每一个表都生成了Example,但是大多数情况下用不着,看着挺揪心的。对比起Example,本人更喜欢自己写一句sql。博主怎么看?

引用来自“蛙牛”的评论

个人觉得Example 挺好的~ 因为互联网公司大部分业务都是单表查询(生产环境不允许连接查询,由java代码组装业务),如果按照这种思路,mybatis generator完全够用了,写sql不利于后期维护。
java代码 组装业务是什么意思呀
蛙牛
蛙牛

引用来自“风马少年”的评论

个人觉得生成的Example好像并不是很好用,和其他人合作开发个项目,数据库表偏多,每一个表都生成了Example,但是大多数情况下用不着,看着挺揪心的。对比起Example,本人更喜欢自己写一句sql。博主怎么看?
个人觉得Example 挺好的~ 因为互联网公司大部分业务都是单表查询(生产环境不允许连接查询,由java代码组装业务),如果按照这种思路,mybatis generator完全够用了,写sql不利于后期维护。
风马少年
个人觉得生成的Example好像并不是很好用,和其他人合作开发个项目,数据库表偏多,每一个表都生成了Example,但是大多数情况下用不着,看着挺揪心的。对比起Example,本人更喜欢自己写一句sql。博主怎么看?
蛙牛
蛙牛

引用来自“我不是打酱油滴”的评论

请问那个example类中有有GerneratedCriteria、Criteria和Criterion类,这些类之间的关系,以及这个类的使用方法不是特别的明白,我在其他的地方看到说这个Example类类似于hibernate中的HQL语言,也不是特别的清楚?
对的 要根据条件查询数据 就需要用example对象去构造查询条件~ 可以先会用 再去关心底层如何实现~ 已经好久没用mybatis了
我不是打酱油滴
我不是打酱油滴
请问那个example类中有有GerneratedCriteria、Criteria和Criterion类,这些类之间的关系,以及这个类的使用方法不是特别的明白,我在其他的地方看到说这个Example类类似于hibernate中的HQL语言,也不是特别的清楚?
欧文85
欧文85
XML配置的方式非常灵活,不过对于新手来说有点困难。我专门写了一个带界面的mybatis-generator, github上已经开源:https://github.com/astarring/mybatis-generator-gui 欢迎大家使用并提供改进意见。
数据库逆向生成代码及Maven插件开发

之前使用mybatis,可以用mybatis generator逆向生成dao层代码,详见博客《数据库逆向框架代码生成工具:MyBatis Generator的使用》。公司使用的是自己开发的服务,所以最近抽空写了一个逆向生...

蛙牛
2015/12/20
5.4K
25
【MyBatis框架】mybatis逆向工程自动生成代码

逆向工程 1.什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml、po..) 企业实际开发中,常...

Mysoft
2015/09/21
222
0
使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)

出处:http://www.cnblogs.com/smileberry/p/4145872.html Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis...

qmxzhang
2018/01/02
0
0
使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件

Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件。 1、相关文件 关于Mybat...

筱飞
2016/06/03
71
0
mybatis 通用CRUD的替换方法

http://git.oschina.net/alexgaoyh/MutiModule-parent 代码此次变更较大,使用了mybatis-generator-maven-plugin 插件,把之前多模块项目中的domain部分删除,将这一部分代码整合到persise部...

alexgaoyh
2015/04/22
0
1

没有更多内容

加载失败,请刷新页面

加载更多

外教比较

确定收费的模式 确定授课的模式 确定教学的方式-用什么样的方式能让人更快更好的学会 确定核心竞争力-比如我们的师资是牛津大学的 英语流利说 收费的模式-报特色课程,比如训练营之类的,其实...

V字仇杀
19分钟前
1
0
上下文无关文法介绍

上下文无关文法 上下文无关文法是用来描述程序语言的一种表达方式,通过简单的符号描述语言的集合。正如我们所知道,一个程序即为一个句子(字符串),语言就是所有句子的集合。上下文无关文...

陶小陶
29分钟前
3
0
eggjs与sequelize简单demo

参考 egg 官方文档 安装 // 依赖npm install --save egg-sequelize mysql2// ts 类型npm install --save @types/sequelize 插件,config/plugin.ts import { EggPlugin } from 'egg';......

Geeyu
今天
1
0
看过上百部片子的这个人教你视频标签算法解析

本文由云+社区发表 随着内容时代的来临,多媒体信息,特别是视频信息的分析和理解需求,如图像分类、图像打标签、视频处理等等,变得越发迫切。目前图像分类已经发展了多年,在一定条件下已经...

腾讯云加社区
今天
4
0
2. 红黑树

定义:红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树(Binary Search Tree)。 要理解红黑树,先要了解什么是二叉查找树。在上一章中,我们学习了什么是二叉树,以及二叉树...

火拳-艾斯
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部