介绍网址:Introduction to MyBatis Generator
Generator ,一个用于 MyBatis 的代码生成工具,可以根据数据库表结构自动生成对应的实体类、DAO 接口和 SQL 映射文件,提高开发效率和代码质量。同时,MyBatis Generator 还支持自定义生成规则,可以按照自己的需求进行配置。
简单示例:
首先,在 pom.xml 中添加依赖
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.4.0version>
dependency>
接着,在 resources 目录下创建一个 Generator 的配置文件 mybatis_generator.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="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true" />
commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatisdemo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC"
userId="root"
password="0123" />
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
javaTypeResolver>
<javaModelGenerator targetPackage="cn.edu.MyBatisDemo.model" targetProject=".\src\main\java" />
<sqlMapGenerator targetPackage="cn.edu.MyBatisDemo.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.edu.MyBatisDemo.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
javaClientGenerator>
<table tableName="mybatis_generator"
domainObjectName="MyBatisGenerator"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false" />
context>
generatorConfiguration>
然后,只需在数据库中创建一个数据表 mybatis_generator 。表名称需要与 mybatis_generator.xml 的 table 标签中的 tableName 属性值对应
表结构信息如图:
最后,测试结果
package cn.edu.MyBatisDemo.test;
import org.junit.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 MyBatisGeneratorTest {
@Test
public void mbgTest() throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 只需修改 Generator 的配置文件名称即可
String path = this.getClass().getClassLoader().getResource("mybatis_generator.xml").getPath();
File configFile = new File(path);
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
结果如图(实体类、接口与映射文件会自动生成在设定的目录下):
接口中声明一系列方法介绍如图:
在上面案例的基础下,简单实现批量操作与分页查询。
首先,在实体类 MyBatisGenerator 中添加无参构造方法、有参构造方法与 toString() 方法
public MyBatisGenerator() {
super();
}
public MyBatisGenerator(Integer id, String name, Integer age, String hobby, String career) {
this.id = id;
this.name = name;
this.age = age;
this.hobby = hobby;
this.career = career;
}
@Override
public String toString() {
return "MyBatisGenerator{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", hobby='" + hobby + '\'' +
", career='" + career + '\'' +
'}';
}
然后,在测试类 MyBatisGenerator 中添加批量操作测试方法
@Test
public void test() throws IOException {
//1.根据配置文件创建数据库连接会话的工厂类
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//获取工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.通过工厂类获取数据库连接的会话
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
//3.通过 sqlSession 操作数据库
try {
MyBatisGeneratorMapper myBatisGeneratorMapper = sqlSession.getMapper(MyBatisGeneratorMapper.class);
for (int i = 0 ; i < 36 ; i++){
//实体类的名字 MyBatisGenerator 与导入的 org.mybatis.generator.api.MyBatisGenerator 名字重复。故此写上 cn.edu.MyBatisDemo.model.
myBatisGeneratorMapper.insert(new cn.edu.MyBatisDemo.model.MyBatisGenerator(20230901+i,"Q"+i,18,"看书","歌手"));
}
sqlSession.commit();
} finally {
sqlSession.close();
}
}
注:在创建会话中传入参数 ExecutorType.BATCH(设定采用批量操作的方式执行 SQL 语句)
最后,测试结果
MyBatis 分页插件 PageHelper 作者 — isea533
Mybatis-PageHelper 网址
首先,在 pom.xml 中添加依赖
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>5.3.2version>
dependency>
接着,在全局配置文件 mybatis.xml 中配置插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">plugin>
plugins>
然后,在接口 MyBatisGeneratorMapper 中声明获取所有用户信息的方法。同时,在映射文件 MyBatisGeneratorMapper.xml 中实现方法
<select id="selectAll" resultType="myBatisGenerator" >
select
<include refid="Base_Column_List" />
from mybatis_generator
select>
最后,测试结果
在 MySQL调优 文章中,了解过存储过程。接下来,简单介绍 MyBatis 如何调用存储过程。
首先,创建一个存储过程 mybatis_generator_storedProcedure
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `mybatisdemo`.`mybatis_generator_storedProcedure`(IN start_id INT,IN end_id INT)
BEGIN
SELECT `id`,`name`,`age`,`hobby`,`career` FROM `mybatis_generator` WHERE `id` >= start_id AND `id` <= end_id;
END$$
DELIMITER ;
然后,在接口 MyBatisGeneratorMapper 中声明通过调用存储过程获取指定用户信息的方法。同时,在映射文件 MyBatisGeneratorMapper.xml 中实现方法
public List<MyBatisGenerator> selectByStoredProcedure(@Param("start_id") int start_id,@Param("end_id") int end_id); //通过调用存储过程获取指定用户的信息
<select id="selectByStoredProcedure" resultType="myBatisGenerator" statementType="CALLABLE" >
{call mybatis_generator_storedProcedure(
#{start_id,mode=IN,jdbcType=INTEGER},
#{end_id,mode=IN,jdbcType=INTEGER}
)}
select>
最后,测试结果