MyBatis Generator可逆向生成持久层的代码

摘要  通过MyBatis Generator可逆向生成持久层的代码,与Spring实现无缝融合,本文是基于Intellij+Maven实现。

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,不能去掉生成的注释)

?
1
2
3
4
5
6
7
8
9
10
< 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<? 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.比如在一个项目 我们要删除某个小组下某个用户的信息

?
1
2
3
4
5
6
7
  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(非主键 更新小组信息)

?
1
2
3
4
5
public  int  updateStudyTeamInfo(StudyTeamInfo st){
         StudyTeamInfoExample ste =  new  StudyTeamInfoExample();
         ste.createCriteria().andTeamIdEqualTo(st.getTeamId());
         return  studyTeamInfoDAO.updateByExampleSelective(st,ste);
     }

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

?
1
2
3
4
5
6
7
8
9
10
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 ;
     }
?
1
2
3
4
5
6
7
8
9
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操作时,不需要这个字段

?
1
2
3
4
5
public  void  saveUserStudyTeamApplyInfo(StudyTeamUserApplyInfo uai){
         long  ref = studyTeamInfoDAO.getSeqAllRef();
         uai.setRef( new  BigDecimal(ref));
         studyTeamUserApplyInfoDAO.insertSelective(uai);
     }

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

2.分页问题

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!-- 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字段无法识别问题

?
1
2
3
4
<!--对应数据库表 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 所以使用的 

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

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

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

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


2014-9-15


?
1
2
3
4
5
6
7
8
9
10
11
12
< 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了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值