MyBatis 逆向工程
MyBatis 是半自动化的 ORM 框架,SQL 语句需要开发者自定义,SQL 需要单独定义在 Mapper.xml中,与 Mapper 接口对应,使用MyBatis 进行开发的基本配置:
实体类
Mapper 接⼝
Mapper.xml
这种方法的缺陷是如果参与业务的表太多,每张表的业务都需要自定义 SQL、创建实体类、Maper 接口,工作量较大。
MyBatis 框架可以自动根据数据表,帮助开发者生成实体类、Mapper 接口、Mapper.xml,这就是逆向工程。
逆向工程概念
逆向工程是 MyBatis 提供的⼀种自动化配置⽅案,针对数据表自动生成 MyBatis 所需要的各种资源(实体类、Mapper 接口、Mapper.xml),但是逆向工程只针对于单表,如果数据表之间有级联关系,逆向工程无自动生成级联关系。
使用逆向工程
MyBatis 逆向工程的组件是 MyBatis Generator,简称 MBG,是专为 MyBatis 框架定制的代码自动生成解决方案,MBG 可以根据数据表结构快速生成对应的实体类、Mapper接口、Mapper.xml,并且支持基本的 CRUD 操作,但是业务逻辑相对复杂的操作就需要开发者手动完成。
1、创建 Maven 工程,pom.xml 添加相关依赖。
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
2、创建目标表 t_account。
create table `t_account`(
`id` int(11) not null primary key auto_increment,
`name` varchar(11),
`password` varchar(11),
`age` int(11) )
3、创建 MBG 配置⽂件 generatorConfig.xml
jdbcConnection 配置数据库连接信息
javaModelGenerator 配置 JavaBean 的生成策略
sqlMapGenerator 配置 SQL 映射文件生成策略
javaClientGenerator 配置 Mapper 接口的生成策略
table 配置要逆向解析的数据表(tableName:表名,domainObjectName;实体类名)
<?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>
<context id="testTables" targetRuntime="MyBatis3">
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test?
useUnicode=true&characterEncoding=UTF-8"
userId="root"
password="root"
></jdbcConnection>
<javaModelGenerator targetPackage="com.southwind.entity"
targetProject="./src/main/java"></javaModelGenerator>
<sqlMapGenerator targetPackage="com.southwind.repository"
targetProject="./src/main/java"></sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.southwind.repository" targetProject="./src/main/java">
</javaClientGenerator>
<table tableName="t_account" domainObjectName="Account"></table>
</context>
</generatorConfiguration>
4、创建 GeneratorMain 类,执行自动生成资源的代码。
package com.southwind.test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class GeneratorMain {
public static void main(String[] args) {
List<String> warings = new ArrayList<String>();
boolean overwrite = true;
String genCig = "/generatorConfig.xml";
File configFile = new
File(GeneratorMain.class.getResource(genCig).getFile());
ConfigurationParser configurationParser = new
ConfigurationParser(warings);
Configuration configuration = null;
try {
configuration =
configurationParser.parseConfiguration(configFile);
} catch (IOException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
}
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = null;
try {
myBatisGenerator = new
MyBatisGenerator(configuration,callback,warings);
} catch (InvalidConfigurationException e) {
e.printStackTrace();
}
try {
myBatisGenerator.generate(null);
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MyBatis 延迟加载
1、创建实体类
package com.southwind.entity;
import lombok.Data;
import java.util.List;
@Data
public class Customer {
private Integer id;
private String name;
private List<Order> orders; }
package com.southwind.entity;
import lombok.Data;
@Data
public class Order {
private Integer id;
private String name;
private Customer customer; }
2、config.xml 中开启打印 SQL
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
3、创建 OrderRepository
package com.southwind.repository;
import com.southwind.entity.Order;
public interface OrderRepository {
public Order findById(Integer id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.southwind.repository.OrderRepository">
<resultMap id="orderMap" type="com.southwind.entity.Order">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<association
property="customer"
javaType="com.southwind.entity.Customer"
select="com.southwind.repository.CustomerRepository.findById"
column="cid"
></association>
</resultMap>
<select id="findById" parameterType="java.lang.Integer" resultMap="">
select * from orders where id = #{id}
</select>
</mapper>
4、创建 CustomerRepository
package com.southwind.repository;
import com.southwind.entity.Customer;
public interface CustomerRepository {
public Customer findById(Integer id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.southwind.repository.CustomerRepository">
<select id="findById" parameterType="java.lang.Integer"
resultType="com.southwind.entity.Customer">
select * from customer where id = #{id}
</select>
</mapper>
5、config.xml 中开启延迟加载
<!-- 延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
MyBatis 延迟加载机制,是实际开发中使用频率较高的⼀个功能,正确地使用延迟加载,可以有效减少Java Application 和数据库的交互次数,从而提高整个系统的运行效率,延迟加载是为了提高程序运行效率的⼀种手段,⼀般应用于多表关联查询的业务场景