【MyBatis】你还不会使用MyBatis逆向工程来提高你的开发效率吗?

MyBatis逆向工程

  • 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表(Hibernate是支持正向工程的)
  • 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成 Java实体类、Mapper接口、Mapper映射文件

官方文档:MyBatis Generator

MyBatis官网:mybatis – MyBatis 3 | Introduction

1、快速入门

创建Maven项目
导入依赖
编写MyBatis配置文件
编写逆向工程配置文件
测试
  • Step1:创建Maven项目

    目录结构如下:

    image-20220911195422947

  • Step2:导入依赖

    pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>day04_mybatis</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <!--添加项目依赖-->
        <dependencies>
            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.16</version>
            </dependency>
            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.10</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
        </dependencies>
    
        <!--添加项目所需的插件-->
        <build>
            <plugins>
                <!--mybatis逆向工程的插件-->
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.0</version>
    
                    <!-- 插件的依赖 -->
                    <dependencies>
                        <!-- 逆向工程的核心依赖 -->
                        <dependency>
                            <groupId>org.mybatis.generator</groupId>
                            <artifactId>mybatis-generator-core</artifactId>
                            <version>1.3.2</version>
                        </dependency>
                        <!-- MySQL驱动 -->
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>8.0.16</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
  • Step3:编写MyBatis配置文件

    jdbc.properties:

    扫描二维码关注公众号,回复: 14902875 查看本文章
    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql:///ssm?useSSL=false&characterEncoding=utf8&useServerPrepStmts=true&serverTimezone=UTC
    jdbc.username=root
    jdbc.password=32345678
    

    mybatis-config.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!--
        MyBatis核心配置文件中,标签的顺序:
        properties?,settings?,typeAliases?,typeHandlers?,
        objectFactory?,objectWrapperFactory?,reflectorFactory?,
        plugins?,environments?,databaseIdProvider?,mappers?
    -->
        <!--引入properties文件-->
        <properties resource="jdbc.properties"/>
        <!--开启一些全局设置-->
        <settings>
            <!--开启格式转换-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
            <!--开启懒加载-->
            <setting name="lazyLoadingEnabled" value="true"/>
            <!--关闭完整加载-->
            <setting name="aggressiveLazyLoading" value="false"/>
        </settings>
        <!--给实体类所在包起别名,简化书写-->
        <typeAliases>
            <package name="com.hhxy.pojo"/>
        </typeAliases>
        <!--数据库连接环境配置-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!--数据库的连接信息-->
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
        <!--指定SQL映射文件-->
        <mappers>
            <!--使用包扫描方式,简化mapper文件的加载-->
            <package name="com.hhxy.mapper"/>
        </mappers>
    </configuration>
    
  • Step4:编写逆向工程文件

    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>
        <!--	
        targetRuntime: 执行生成的逆向工程的版本,两种取值
            - MyBatis3Simple: 生成基本的CRUD(清新简洁版)
            - MyBatis3: 生成带条件的CRUD(奢华尊享版)
        -->
        <context id="DB2Tables" targetRuntime="MyBatis3Simple">
            <!--定义生成的java类的编码格式-->
            <property name="javaFileEncoding" value="UTF-8"/>
            <!-- 是否去除自动生成的注释 -->
            <commentGenerator>
        	<property name="suppressAllComments" value="true"/>
            </commentGenerator>
            <!-- 数据库的连接信息 -->
            <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                            connectionURL="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"
                            userId="root"
                            password="32345678">
            </jdbcConnection>
            <!-- javaBean的生成策略-->
            <!--
            相关配置参数:
            targetPackage:根据数据生成的实体类的包
            targetProject:生成的路径
            enableSubPackages:是否能使用子包(如果是false,则只会解析第一个.,后面的.无法解析,强烈建议设置为true)
            trimStrings:是否去除数据库中表中字段的前后空格
            -->
            <javaModelGenerator targetPackage="com.hhxy.pojo"
                                targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
            <!-- SQL映射文件的生成策略 -->
            <sqlMapGenerator targetPackage="com.hhxy.mapper"
                             targetProject=".\src\main\resources">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
            <!-- Mapper接口的生成策略 -->
            <javaClientGenerator type="XMLMAPPER"
                                 targetPackage="com.hhxy.mapper" targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
            <!-- 逆向分析的表 -->
            <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
            <!-- domainObjectName属性指定生成出来的实体类的类名 -->
            <table tableName="t_emp" domainObjectName="Emp"/>
            <table tableName="t_dept" domainObjectName="Dept"/>
        </context>
    </generatorConfiguration>
    
  • Step5:测试

    启动逆向工程插件:

    • 方式一:

      image-20220911194812501

    • 方式二(需要下载Maven Help插件):

      image-20220911194714454

结果如下:

image-20220911193138860

image-20220911200509171

注意:逆向工程生成的pojo类并没有帮我们重写toString方法,这个需要手动重写一下

2、逆向工程配置文件参数详解

  • context标签:里面包含所有的逆向工程配置信息

    • id属性,用于定位逆向工程的配置信息
    • targetRuntime属性:设置生成的逆向工程的版本,两种取值
      • MyBatis3Simple:生成基本的CRUD(清新简洁版),生成的是基本增、删、改、查的五个方法
      • MyBatis3:生成带条件的CRUD(奢华尊享版),生成对单表的所有操作(含带条件的SQL)
  • jdbcConnection标签:用于设置数据库的连接信息

  • property标签:设置生成逆向工程的相关配置信息

    • name属性(关联value属性):
      • javaFileEncoding:用于设置生成逆向工程的编码格式
      • suppressAllComments:设置是否自动生成注释
      • enableDubPackages:设置是否能使用子包
      • trimStrings:设置是否去除数据库中表中字段的前后空格(控制pojo类的属性名的生成格式),强烈建议value取值true
  • javaModelGenerator标签:JavaBean类的生成设置

    • targetPackage属性:用于设置生成的JavaBean所在包名
    • targetProject属性:用于设置生成JavaBean的所在位置
  • sqlMapGenerator标签:设置SQL映射文件的生成策略

    • targetPackage属性:用于设置生成的SQL映射文件所在文件目录
    • targetProject属性:用于设置生成SQL映射文件的所在位置
  • JavaClientgenerator标签:设置Mapper接口的生成策略

    • type属性:设置XML和Mapper接口的映射方式,取值XMLMAPPER表示接口和XML完全分离(强烈推荐使用)
    • targetPackage属性:用于设置生成的Mapper所在包
    • targetProject属性:用于设置生成Mapper接口的所在位置
  • table标签:用于设置数据库中表名所对应的实体类的类名(一个表经过逆向工程可以生成一个与之对应的实体类,这个标签就是用来设置生成的实体类的类名)

    • tableName:表名
    • domainObjectName:实体类名

3、QBC查询

  在前面的快速入门中,我们使用逆向工程生成是清新简洁版的SQL,功能较为单一,只有增、删、改、查五种方法。如果想要使用逆向工程生成更加复杂的SQL,就需要将targetRuntime属性设置成MyBatis3(奢华尊享版),奢华尊享版含有对单表的所有SQL

  QBC(Query By Criteria)就是指通过使用Criteria对象来进行条件查询

相较于清新简洁版,奢华尊享版会多生成两个类:

image-20220911230416592

奢华尊享版中主要有四种方法:普通方法选择性方法条件方法混合方法

  • 普通方法:正常方法名,例如:insertupdate

  • 选择性方法:方法名一般以Selective结尾,常见的有:insertSelective(选择性添加)、updateSelective(选择性修改)

  • 条件方法:方法名一般以Example,常见的有:updateByPrimaryKeyupdateByExample

  • 混合方法:主要是条件方法和选择性方法的混合,例如:updateByPrimaryKeySelectiveupdateByExampleSelective

重点

  • 普通方法和选择性方法的区别:选择性方法不会将设置的为null的设置为null,而是遇到设置为null时采用字段的默认值;而普通方法会将设置为null的直接将字段的值设置为null,而不会在乎它的默认值是啥(主要是针对修改和添加两个方法)
  • 查询所有的方法,只需要将条件查询selectByExample()的条件设置成null就是查询所有了,即:selectByExample(null)

QBC插叙演示

演示所需环境,可以直接使用快速入门中的配置,但是有一点就是要将逆向工程生成的模式改为奢华尊享版,其他的照常

image-20220912131821182

import com.hhxy.mapper.EmpMapper;
import com.hhxy.pojo.Emp;
import com.hhxy.pojo.EmpExample;
import com.hhxy.utils.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import java.util.List;

/**
 * 逆向工程(奢华尊享版)测试类
 * @author ghp
 * @date 2022/9/12
 */
public class MBGTest {
    
    

    @Test
    public void MBGTest() {
    
    
        //1、获取SqlSessionFactory对象
        SqlSessionFactory sqlSF = SqlSessionFactoryUtil.getSqlSF();
        //2、获取SqlSession对象
        SqlSession sqlS = sqlSF.openSession();
        //3、获取Mapper接口对象
        EmpMapper mapper = sqlS.getMapper(EmpMapper.class);
        //4、执行SQL
        /*
        //1)根据Id进行查询
        Emp emp = mapper.selectByPrimaryKey(3);
        System.out.println(emp);
        //2)查询所有
        List<Emp> emps = mapper.selectByExample(null);
        emps.forEach(System.out::println);
        */

        //3)QBC查询,查询员工姓名是张三的
        //①获取Example对象
        EmpExample empExample = new EmpExample();
        //②获取条件对象Criteria
        EmpExample.Criteria criteria = empExample.createCriteria();
        //③设置条件

        String empName = "张三";
        //设置单条件(姓名为张三)
//        criteria.andEmpNameEqualTo(empName);

        //设置多条件
        //and连接词,通过链式编程实现(查询姓名为张三 并且 年龄在18~22之间):
//        criteria.andEmpNameEqualTo(empName).andAgeBetween(18,22);
        //or连接词(查询姓名为张三 或 李四)
        criteria.andEmpNameEqualTo("张三");
        empExample.or().andEmpNameEqualTo("李四");

        //④进行QBC查询
        List<Emp> emps = mapper.selectByExample(empExample);
        emps.forEach(System.out::println);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_66345100/article/details/130113820