Loading

mybatis逆向工程的使用

简述:

  mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、pojo…)可以让程序员将更多的精力放在繁杂的业务逻辑上。之所以强调单表两个字,是因为Mybatis逆向工程生成的Mapper所进行的操作都是针对单表的,也许你可能会觉得那这就有点鸡肋了,但是在大型项目中,很少有复杂的多表关联查询,所以作用还是很大的。

逆向工程的使用:

  逆向工程(摘自官网):http://mybatis.org/generator

翻译过来就是:

  • 从带有XML配置的命令提示符

  • 作为具有XML配置的Ant任务

  • 作为一个Maven插件

  • 从另一个java程序,基于XML配置

  • 从另一个java程序,基于java的配置

  • 通过Eclipse插件

 

代码实现步骤:

  数据库:

Java工程的结构:

  

GeneratorSqlmap.java

 

 1 import java.io.File;
 2 import java.util.ArrayList;
 3 import java.util.List;
 4 import org.mybatis.generator.api.MyBatisGenerator;
 5 import org.mybatis.generator.api.ProgressCallback;
 6 import org.mybatis.generator.config.Configuration;
 7 import org.mybatis.generator.config.xml.ConfigurationParser;
 8 import org.mybatis.generator.internal.DefaultShellCallback;
 9 
10 public class GeneratorSqlmap {
11     public GeneratorSqlmap() {
12     }
13 
14     public void generator() throws Exception {
15         List<String> warnings = new ArrayList();
16         boolean overwrite = true;
17         File configFile = new File("generatorConfig.xml");
18         ConfigurationParser cp = new ConfigurationParser(warnings);
19         Configuration config = cp.parseConfiguration(configFile);
20         DefaultShellCallback callback = new DefaultShellCallback(overwrite);
21         MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
22         myBatisGenerator.generate((ProgressCallback)null);
23     }
24 
25     public static void main(String[] args) throws Exception {
26         try {
27             GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
28             generatorSqlmap.generator();
29         } catch (Exception var2) {
30             var2.printStackTrace();
31         }
32 
33     }
34 }

 

generatorConfig.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE generatorConfiguration
 3   PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
 4   "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
 5 
 6 <generatorConfiguration>
 7     <context id="testTables" targetRuntime="MyBatis3">
 8         <commentGenerator>
 9             <!-- 是否去除自动生成的注释 true:是 : false:否 -->
10             <property name="suppressAllComments" value="true" />
11         </commentGenerator>
12         <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
13         <jdbcConnection driverClass="com.mysql.jdbc.Driver"
14             connectionURL="jdbc:mysql://localhost:3306/mall" userId="root"
15             password="6666">
16         </jdbcConnection>
17         <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 
18             和 NUMERIC 类型解析为java.math.BigDecimal -->
19         <javaTypeResolver>
20             <property name="forceBigDecimals" value="false" />
21         </javaTypeResolver>
22 
23         <!-- targetProject:生成PO类的位置 -->
24         <javaModelGenerator targetPackage="com.mall.pojo"
25             targetProject=".\src">
26             <!-- enableSubPackages:是否让schema作为包的后缀 -->
27             <property name="enableSubPackages" value="false" />
28             <!-- 从数据库返回的值被清理前后的空格 -->
29             <property name="trimStrings" value="true" />
30         </javaModelGenerator>
31         <!-- targetProject:mapper映射文件生成的位置 -->
32         <sqlMapGenerator targetPackage="com.mall.mapper"
33             targetProject=".\src">
34             <!-- enableSubPackages:是否让schema作为包的后缀 -->
35             <property name="enableSubPackages" value="false" />
36         </sqlMapGenerator>
37         <!-- targetPackage:mapper接口生成的位置 -->
38         <javaClientGenerator type="XMLMAPPER"
39             targetPackage="com.mall.mapper" targetProject=".\src">
40             <!-- enableSubPackages:是否让schema作为包的后缀 -->
41             <property name="enableSubPackages" value="false" />
42         </javaClientGenerator>
43         <!-- 指定数据库表 -->
44         <table schema="" tableName="tb_content"></table>
45         <table schema="" tableName="tb_content_category"></table>
46         <table schema="" tableName="tb_item"></table>
47         <table schema="" tableName="tb_item_cat"></table>
48         <table schema="" tableName="tb_item_desc"></table>
49         <table schema="" tableName="tb_item_param"></table>
50         <table schema="" tableName="tb_item_param_item"></table>
51         <table schema="" tableName="tb_order"></table>
52         <table schema="" tableName="tb_order_item"></table>
53         <table schema="" tableName="tb_order_shipping"></table>
54         <table schema="" tableName="tb_user"></table>
55 
56     </context>
57 </generatorConfiguration>

配置文件需要修改的内容: 

  • 数据库驱动、地址、用户名、密码
  • POJO类、mapper接口、mapper映射文件生成的位置
  • 指定数据表

  注:配置完成之后运行GeneratorSqlmap.java中的main方法就会生成对应数据表的代码,生成后记得右键项目名刷新。如果需要再次生成,一定要记得先把原来生成的删除。

生成的代码:

  

 

  

如果有N张表,就会生成2N个POJO,N个mapper.java以及N个mapper.xml,也许你会问,为什么会生成2N个POJO呢?那是因为他除了常规的POJO之外还生成了用于设置条件的xxxExample。

          

                               代码的使用


 

查询:  

方法1:selectByExample(TbItemDescExample  example)        

返回值:List<TbItemDesc>

作用:通过特定限制条件查询信息,example用于生成一个Criteria对象来设置查询条件

例:

 1 TbItemDescExample example = new TbItemDescExample();
 2 cn.e3mall.pojo.TbItemDescExample.Criteria criteria = example.createCriteria();
 3 long minId = 0;
 4 long maxId = 50;
 5 criteria.andItemIdBetween(minId, maxId); // 设置条件:ItemId在 0 和 50 之间
 6         
 7 List<Long> ids = new ArrayList<>();
 8 ids.add((long)20);
 9 ids.add((long)40);
10 ids.add((long)60);
11 criteria.andItemIdIn(ids);    // 设置条件:ItemId等于 20 或 40 或 60
12         
13 criteria.andCreatedIsNotNull(); // 设置条件:Created列属性不为空
14         
15 long id = 40;
16 criteria.andItemIdEqualTo(id); // 设置条件:ItemId等于40
17         
18 // 执行查询
19 List<TbItemDesc> selectByExample = itemDescMapper.selectByExample(example);

   具体可设置的条件很多很多,根据表的结构的不同会有不同的可限制条件,比如:

   

 

方法2:selectByExampleWithBLOBs(TbItemDescExample  example)

返回值:List<TbItemDesc>

作用:根据特定限制条件查询,返回值包含类型为text的列(默认查询并不会返回该列的信息)。example用于生成一个Criteria对象来设置查询条件,具体使用方法和方法1是一样的,唯一的把不同就是返回值是所有列。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

插入:

 

  插入很简单,只有两个方法,方法传入的参数都是POJO,返回值都是int类型的受影响的行数。不同之处在于insert会插入所有的信息,如果传入的对象某一属性为空,则插入空,如果数据库中设置了默认值,默认值就失效了。而insertSelective不同,他只会插入含有数据的属性,对于为空的属性,不予以处理,这样的话如果数据库中设置有默认值,就不会被空值覆盖了。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

删除:

    

方法1:根据特定限制条件删除,具体使用的方法和查询的时候是一样的。

 方法2:根据主键删除。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

更新:

    

 

  更新在这里有6个方法,可以分为2组:

第一组:根据特定限制条件进行更新

        参数1:TbItemDesc  record  ->  要更新的对象

        参数2:TbItemDescExample example  ->  生成一个Criteria对象来设置查询条件

            方法1:updateByExample(TbItemDesc  record, TbItemDescExample example)

                    作用:根据特定的限制条件进行更新除了text类型(数据库)的所有列。

            方法2:updateByExampleSelective(TbItemDesc  record, TbItemDescExample example)

                    作用:根据特定的限制条件更新所有设置了值的列。

第二组:根据ID进行更新

        参数:TbItemDesc  record  ->  要更新的对象

            方法1:updateByPrimaryKey(TbItemDesc  record)

                    作用:通过ID更新除了text类型(数据库)的所有列

            方法2:updateByPrimaryKeySelective(TbItemDesc  record)

                    作用:通过ID更新所有设置了值的列。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 计数:

    

  计数就一个方法,根据限制条件计数

 


 

总结:

    mybatis逆向工程非常强大,可以大大提高工作效率,而且也不会出现数据库表与实体类对不上号的情况。

    以上就是我在学习过程中对于Mybatis逆向工程中的常见的一些知识点总结,希望大家有一些帮助,更希望大家可以一起学习进步!

    作为一名即将成为程序员的我来说,每天坚持的东西就是写代码,我坚信坚持了就一定会有收获。

    那些看似波澜不惊的日复一日,会突然在某一天让你看到坚持的意义。

posted @ 2020-11-17 20:57  戴戴代代  阅读(251)  评论(0编辑  收藏  举报