• 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逆向工程中的常见的一些知识点总结,希望大家有一些帮助,更希望大家可以一起学习进步!

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

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

  • 相关阅读:
    C语言程序设计I—第四周教学
    C语言程序设计I—第三周教学
    C语言程序设计I—第一周教学
    软工实践(四)——热词统计
    软工实践(三)——结对第一次作业(原型设计)
    软工实践(二)——构建之法读后感
    软工实践(一)——目标和规划
    庄子修身养性哲学
    $Matrix-Tree$定理-题目
    $Matrix-Tree$定理-理论
  • 原文地址:https://www.cnblogs.com/dyywht/p/13996442.html
Copyright © 2020-2023  润新知