【MyBatis】你还不会使用MyBatis逆向工程来提高你的开发效率吗?
文章目录
-
- MyBatis逆向工程
-
- 1、快速入门
- 2、逆向工程配置文件参数详解
- 3、QBC查询
MyBatis逆向工程
- 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表(Hibernate是支持正向工程的)
- 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成 Java实体类、Mapper接口、Mapper映射文件
官方文档:MyBatis Generator
MyBatis官网:mybatis – MyBatis 3 | Introduction
1、快速入门
-
Step1:创建Maven项目
目录结构如下:
-
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:
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 configurationPUBLIC "-//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 generatorConfigurationPUBLIC "-//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:测试
启动逆向工程插件:
-
方式一:
-
方式二(需要下载Maven Help插件):
-
结果如下:
注意:逆向工程生成的pojo类并没有帮我们重写toString
方法,这个需要手动重写一下
2、逆向工程配置文件参数详解
-
context
标签:里面包含所有的逆向工程配置信息- id属性,用于定位逆向工程的配置信息
- targetRuntime属性:设置生成的逆向工程的版本,两种取值
- MyBatis3Simple:生成基本的CRUD(清新简洁版),生成的是基本增、删、改、查的五个方法
- MyBatis3:生成带条件的CRUD(奢华尊享版),生成对单表的所有操作(含带条件的SQL)
-
jdbcConnection
标签:用于设置数据库的连接信息 -
property
标签:设置生成逆向工程的相关配置信息- name属性(关联value属性):
javaFileEncoding
:用于设置生成逆向工程的编码格式suppressAllComments
:设置是否自动生成注释enableDubPackages
:设置是否能使用子包trimStrings
:设置是否去除数据库中表中字段的前后空格(控制pojo类的属性名的生成格式),强烈建议value取值true
- name属性(关联value属性):
-
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
(奢华尊享版),奢华尊享版含有对单表的所有SQLQBC(Query By Criteria)就是指通过使用Criteria对象来进行条件查询
相较于清新简洁版,奢华尊享版会多生成两个类:
奢华尊享版中主要有四种方法:普通方法、选择性方法、条件方法 和 混合方法
-
普通方法:正常方法名,例如:
insert
、update
-
选择性方法:方法名一般以
Selective
结尾,常见的有:insertSelective
(选择性添加)、updateSelective
(选择性修改) -
条件方法:方法名一般以
Example
,常见的有:updateByPrimaryKey
,updateByExample
-
混合方法:主要是条件方法和选择性方法的混合,例如:
updateByPrimaryKeySelective
、updateByExampleSelective
重点:
- 普通方法和选择性方法的区别:选择性方法不会将设置的为null的设置为null,而是遇到设置为null时采用字段的默认值;而普通方法会将设置为null的直接将字段的值设置为null,而不会在乎它的默认值是啥(主要是针对修改和添加两个方法)
- 查询所有的方法,只需要将条件查询
selectByExample()
的条件设置成null就是查询所有了,即:selectByExample(null)
QBC插叙演示:
演示所需环境,可以直接使用快速入门中的配置,但是有一点就是要将逆向工程生成的模式改为奢华尊享版,其他的照常
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 {@Testpublic 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();//②获取条件对象CriteriaEmpExample.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);}
}