MyBatis逆向工具(Mybatis-Generator )【简单易懂!】

一、配置逆向工具

  1. 配置插件信息【mybatis-generator 逆向工具插件,固定写法】
<plugins>
          <!--      mybatis-generator 逆向工具插件   -->
          <!-- mybatis代码生成插件 -->
          <plugin>
              <groupId>org.mybatis.generator</groupId>
              <artifactId>mybatis-generator-maven-plugin</artifactId>
              <version>1.3.7</version>
              <configuration>
                  <!--配置文件的位置-->
                  <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                  <verbose>true</verbose>
                  <overwrite>true</overwrite>
              </configuration>
              <executions>
                  <execution>
                      <id>Generate MyBatis Artifacts</id>
                      <goals>
                          <goal>generate</goal>
                      </goals>
                  </execution>
              </executions>
              <dependencies>
                  <dependency>
                      <groupId>org.mybatis.generator</groupId>
                      <artifactId>mybatis-generator-core</artifactId>
                      <version>1.3.7</version>
                  </dependency>
              </dependencies>
          </plugin>
      </plugins>
  1. 在resources目录下创建配置文件generatorConfig.xml【主配置文件,必须要有,他的位置已经在插件中声明,可以自己修改】
    插件中的位置:
<configuration>
     <!--配置文件的位置-->
     <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
     <verbose>true</verbose>
     <overwrite>true</overwrite>
</configuration>

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>
    <!--mysql 连接数据库jar 这里选择自己本地位置;
    如果不知道maven本地仓库地址,可以使用EveryThing工具全局搜索mysql-connector-java,找到jar包位置;
    也可以手动下载一个jar放在指定位置,进行引用。
    -->
    <classPathEntry location="D:\work\maven\maven_repository\mysql\mysql-connector-java\5.1.9\mysql-connector-java-5.1.9.jar"/>

    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释,true:是,false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/smstwo"
                        userId="root"
                        password="ht520520">
        </jdbcConnection>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
           NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 指定javaBean生成的位置
            targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
            targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
         -->
        <javaModelGenerator targetPackage="com.SMS.domain" targetProject="src/main/java">
            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false;如果多个数据库改为true分目录 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--  指定mapper映射文件生成的位置
           targetPackage、targetProject同javaModelGenerator中作用一样-->
        <sqlMapGenerator targetPackage="com.SMS.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 指定mapper接口生成的位置
         targetPackage、targetProject同javaModelGenerator中作用一样
         -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.SMS.dao"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 指定数据库表
        domainObjectName:生成的domain类的名字,当表名和domain类的名字有差异时一定要设置,如果不设置,直接使用表名作为domain类的名字;
        可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面;
        -->
        <table tableName="t_userlogin" domainObjectName="User"></table>
        <table tableName="t_class" domainObjectName="MyClass"></table>
        <table tableName="t_course" domainObjectName="Course"></table>
        <table tableName="t_dept" domainObjectName="Dept"></table>
        <table tableName="t_leave" domainObjectName="Leave"></table>
        <table tableName="t_student" domainObjectName="Student"></table>
        <table tableName="t_tearcher" domainObjectName="Tearcher"></table>
    </context>
</generatorConfiguration>
  1. 插件以及主配置文件,直接复制修改即可。到此基本配置以及完成。

二、自动生成代码

  1. 配置代码自动生成的maven工具
  2. 在配置Tomcat那个地方,配置maven工具,点击+号新建maven工具在这里插入图片描述
  3. 基本配置在这里插入图片描述
    name:就是给这个配置项取个名。
    Working directory:给哪一个项目(工程或者是Model)添加逆向代码工具
    Command line:mybatis-generator:generate -e【这个是逆向工具的核心指令,生成逆向代码必须项】
  4. 配置完毕以后。直接在配置的项目中点击运行即可。会自动生成所需代码。在这里插入图片描述

三、如何进行查询

1、Generator提供的简单查询

  1. 根据主键进行查询
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = (UserMapper) ac.getBean("userMapper");
User user = userMapper.selectByPrimaryKey(1l);
System.out.println(user);

sql语句+运行结果在这里插入图片描述

  1. 插入用户【每个字段都不能为空,否则报错】int result= userMapper.insert(user);

  2. 修改用户userMapper.updateByPrimaryKey(user);

  3. 删除用户【根据主键】userMapper.deleteByPrimaryKey(1l);

2、如何使用Generator进行复杂查询【重点内容】

1、如何进行复杂查询

UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();

1、使用criteria 来进行参数设置。
2、使用逆向生成的userMapper.selectByExample(UserExample example);进行查询
3、增删改查都会有这个参数example。
4、这只是基本步骤,光看这个肯定是看不懂的。往后看!

2、代码分析【源码分析】

  1. 关于自动生成在和实体类并列的那个UserException类分析
    属性分析:
    1、protected String orderByClause:asc是正序,desc是逆序。
    比如:根据年龄的逆序:example.setOrderByClause(age desc)
    2、protected boolean distinct:是否去除重复,true是去除,false是不去除
    比如:去除查询结果重复:example.setDistinct(true);
    3、protected List oredCriteria:一个集合。
    在无参构造中进行了参数赋值:oredCriteria = new ArrayList<Criteria>();
    自定义条件的查询,条件之间通过or连接,riteria的集合,集合中对象是由or连接。
    4、关于静态内部类
public static class Criteria extends GeneratedCriteria {
              protected Criteria() {
                  super();
              }
        }

一个内部类,调用了父类的无参构造。父类的无参构造创建了,criteria = new ArrayList();自定义条件的查询,条件之间通过and连接。

3、基本CRUD实现【前面不懂不要紧,看了这个你就很清晰了,再去看前面的就明白了这前后的关系了】

以User为例:

UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();
  1. 查询用户数量:long count = UserMapper.countByExample(example);
    底层sql代码+执行结果在这里插入图片描述
  2. where条件查询或多条件查询【and查询】
    用户登录,传入username,userpwd,usertype:
        UserExample example = new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        user.setUsername("admin");
        user.setUserpwd("123");
        user.setUsertype(0);
        if (StringUtils.isNotBlank(user.getUsername())){
            criteria.andUsernameEqualTo(user.getUsername());
        }
        if (StringUtils.isNotBlank(user.getUserpwd())){
            criteria.andUserpwdEqualTo(user.getUserpwd());
        }
        if (StringUtils.isNotBlank(String.valueOf(user.getUsertype()))){
            criteria.andUsertypeEqualTo(user.getUsertype());
        }
        List<User> users = userMapper.selectByExample(example);
        System.out.println(users);
        System.out.println(users.size());

执行结果+sql代码
sql代码:select uid, username, userpwd, date, usertype from t_userlogin WHERE ( username = ? and userpwd = ? and usertype = ? )在这里插入图片描述
关于AND的总结:
1、criteria是多个Criterion的集合。
2、criteria是用来做And连接的。
3、使用andUsertypeEqualTo方法进行具体字段值的设置。
4、查询结果封装在List中。
5、可以这样理解:多个criterion存储在一个集合中,一个criterion就是代表一个具体的字段的赋值。如果放在一个集合中,他们的关系就是and

  1. where条件查询或多条件查询【or查询】
    1、第一种or查询
		user.setUsername("admin");
        user.setUserpwd("123");
        user.setUsertype(1);
        UserExample example = new UserExample();
        UserExample.Criteria criteria1 = example.createCriteria();
        UserExample.Criteria criteria2 = example.createCriteria();
        UserExample.Criteria criteria3 = example.createCriteria();
        criteria1.andUsernameEqualTo(user.getUsername());
        criteria2.andUserpwdEqualTo(user.getUserpwd());
        criteria3.andUsertypeEqualTo(user.getUsertype());
        example.or(criteria2);
        example.or(criteria3);
        List<User> users = userMapper.selectByExample(example);
        System.out.println(users);
        System.out.println(users.size());
  • 每一个Criteria是一个查询条件。
  • 从第二个条件开始通过example.or(Criteria);来进行or连接
  • sql代码:select uid, username, userpwd, date, usertype from t_userlogin WHERE ( username = ? ) or( userpwd = ? ) or( usertype = ? )
  • 查询结果截图在这里插入图片描述
    2、第二种or查询
		example.or().andUsernameEqualTo(user.getUsername());
        example.or().andUserpwdEqualTo(user.getUserpwd());
        example.or().andUsertypeEqualTo(user.getUsertype());

  • example.or()后面直接跟上参数即可。
  • sql代码跟上面一模一样
  • 截图也是一样

4、and,or复合查询

		user.setUsername("admin");
        user.setUserpwd("123");
        user.setUsertype(1);
        UserExample example = new UserExample();
        UserExample.Criteria criteria1 = example.createCriteria();
        UserExample.Criteria criteria2 = example.createCriteria();
        
        criteria1.andUsernameEqualTo(user.getUsername());
        criteria1.andUserpwdEqualTo(user.getUserpwd());

        criteria2.andUsernameEqualTo("1002");
        criteria2.andUserpwdEqualTo("123");

        example.or(criteria2);
        List<User> users = userMapper.selectByExample(example);
        System.out.println(users);
        System.out.println(users.size());

结果:

  • sql代码:select uid, username, userpwd, date, usertype from t_userlogin WHERE ( username = ? and userpwd = ? ) or( username = ? and userpwd = ? )
  • 执行结果在这里插入图片描述
    总结分析:
  • 同一个Criteria之间就是and,不同的Criteria之间就是or。
  • and之间通过andUsernameEqualTo直接连接
  • or通过example.or(Criteria)进行连接。配合使用就是or和and的复合使用

5、模糊查询

		UserExample example = new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        String sql = "ad";
        criteria.andUsernameLike("%"+sql+"%");
        List<User> users = userMapper.selectByExample(example);
        System.out.println(users);
        System.out.println(users.size());

结果:

  • sql代码:select uid, username, userpwd, date, usertype from t_userlogin WHERE ( username like ? )
  • 执行结果在这里插入图片描述
    总结:
  • 使用criteria.andUsernameLike("%"+sql+"%");进行模糊查询
  • sql是模糊查询的条件

四、关于MyBatis-Generator需要注意的地方

1、如果使用1.3.7版本之前的mybatis-generator。每次新增一个数据库表和对应的实体类。如果之前的没有取消,则会再次生成文件并追加在后面。
比如:一开始已经生成了UserMapper.xml文件
内容是abc。
如果再次编译,这个文件就变成了了abcabc直接在后面追加了
因此使用1.3.7版本以后的逆向工具并且设置属性
mybatis-generator官方给出的解决方法如下:
https://github.com/mybatis/generator/pull/311
2、再次运行插件会覆盖上一次的xml文件数据,可以采用备份的方式。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值