- 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表(Hibernate是支持正向工程的)
- 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成 Java实体类、Mapper接口、Mapper映射文件
官方文档:MyBatis Generator
MyBatis官网:mybatis – MyBatis 3 | Introduction
Step1:创建Maven项目
目录结构如下:
Step2:导入依赖
pom.xml:
<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.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>day04_mybatisartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.16version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.10version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<version>1.3.0version>
<dependencies>
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.3.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.16version>
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:
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<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>
<mappers>
<package name="com.hhxy.mapper"/>
mappers>
configuration>
Step4:编写逆向工程文件
generatorConfig.xml:
DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<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>
<javaModelGenerator targetPackage="com.hhxy.pojo"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
javaModelGenerator>
<sqlMapGenerator targetPackage="com.hhxy.mapper"
targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true"/>
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.hhxy.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
javaClientGenerator>
<table tableName="t_emp" domainObjectName="Emp"/>
<table tableName="t_dept" domainObjectName="Dept"/>
context>
generatorConfiguration>
Step5:测试
启动逆向工程插件:
结果如下:
注意:逆向工程生成的pojo类并没有帮我们重写toString
方法,这个需要手动重写一下
context
标签:里面包含所有的逆向工程配置信息
jdbcConnection
标签:用于设置数据库的连接信息
property
标签:设置生成逆向工程的相关配置信息
javaFileEncoding
:用于设置生成逆向工程的编码格式suppressAllComments
:设置是否自动生成注释enableDubPackages
:设置是否能使用子包trimStrings
:设置是否去除数据库中表中字段的前后空格(控制pojo类的属性名的生成格式),强烈建议value取值truejavaModelGenerator
标签:JavaBean类的生成设置
sqlMapGenerator
标签:设置SQL映射文件的生成策略
JavaClientgenerator
标签:设置Mapper接口的生成策略
table
标签:用于设置数据库中表名所对应的实体类的类名(一个表经过逆向工程可以生成一个与之对应的实体类,这个标签就是用来设置生成的实体类的类名)
在前面的快速入门中,我们使用逆向工程生成是清新简洁版的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 {
@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 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);
}
}