目录
mybatis三剑客
- MyBatis Generator mybatis逆向工程,根据数据表自动生成实体类、mapper接口、xml映射文件
- MyBatis-Plugin IDEA插件,可以实现mapper接口方法、xml映射文件元素之间的快速跳转
- MyBatis-PageHelper mybatis的分页组件
MyBatis Generator(MBG 代码生成器)
方式一 maven插件(推荐)
1、pom.xml中添加mbg的maven插件
<build>
<plugins>
<!-- mbg的插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<!-- 覆盖同名文件 -->
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
2、resources下新建mbg的配置文件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>
<!-- 数据库驱动的jar包 -->
<classPathEntry location="F:/maven/repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar" />
<!-- context配置环境 -->
<context id="myMBG" targetRuntime="MyBatis3">
<!-- xml文件不追加。配置同名文件覆盖时,默认只覆盖mapper接口、实体类,xml映射文件会以追加方式写入 -->
<!-- 使用此插件后,不管生成多少次,同名xml映射文件都是直接覆盖 -->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"></plugin>
<!--配置生成的注释-->
<commentGenerator>
<!-- 去掉方法注释,默认会生成大量的方法说明注释,很不友好 -->
<property name="suppressAllComments" value="true"/>
<!-- 去掉注释中的时间戳 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 数据库连接信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/db_user?serverTimezone=UTC"
userId="chy"
password="abcd">
</jdbcConnection>
<!-- 配置表字段、java之间的类型转换-->
<javaTypeResolver >
<!-- 是否将Numeric、Decimal全部转换为BigDecimal类型,设置为false,会根据表字段的长度转换响应的类型,Short <5,Integer 5~9,Long 10~18,BigDecimal >18 -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 配置pojo类的生成规则,主要配置实体类存放的包、该包的位置 -->
<!-- mapper、实体类这些包、文件夹不需要我们手动创建,会自动创建 -->
<javaModelGenerator targetPackage="com.chy.mall.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<!-- 是否去掉String两端的空格,这个可要可不要,缺省时默认为false -->
<!--<property name="trimStrings" value="true" />-->
</javaModelGenerator>
<!-- 配置xml映射文件的生成规则 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 配置mapper接口的生成规则 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.chy.mall.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 配置要使用的数据表,需要配置mapper接口、映射文件名以及实体类名,不然tb_user生成的默认是TbUserMapper、TbUser -->
<!-- 默认会生成大量的example相关的东西,不需要,禁用所有的example选项 -->
<!-- 字段会自动完成映射,比如user_id会自动映射为userId -->
<table tableName="tb_user" mapperName="UserMapper" domainObjectName="User" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false" selectByExampleQueryId="false" />
<table tableName="tb_permission" mapperName="PermissionMapper" domainObjectName="Permission" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false" selectByExampleQueryId="false" />
</context>
</generatorConfiguration>
执行插件时默认加载资源根目录下的generatorConfig.xml,文件名不能是其它的。
数据库驱动添加到classpath中都不行,必须要在配置文件中指定路径。
3、执行maven插件mybatis-generator,生成文件
方式二 maven依赖
1、pom.xml中添加mbg的依赖(需要数据库驱动、mybatis依赖)
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- mbg -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
2、resources下新建mbg的配置文件generatorConfig.xml
- 文件名任意,因为是在java代码中指定mbg配置文件的位置。
- 配置文件内容和方式一的相同,只是不需要指定数据库驱动的路径。
<!-- 数据库驱动的jar包 -->
<!--<classPathEntry location="F:/maven/repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar" />-->
3、新建并执行主类,生成代码
package 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.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
List<String> warnings = new ArrayList<String>();
//生成文件时如果已存在同名文件,会覆盖
boolean overwrite = true;
//指定mbg配置文件的位置
InputStream configFile = Test.class.getResourceAsStream("/generatorConfig.xml");
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);
}
}
MyBatis-Plugin mapper接口、xml映射文件之间的跳转
IDEA的一个插件,可以实现mapper接口中的方法、xml映射文件中相应元素之间的快速定位。
直接搜索 mybatis plugin ,安装下载次数最多的那个,目前该插件全名是 Free MyBatis plugin。
MyBatis-PageHelper 分页
国人开源的mybatis分页组件,方便易用,兼容多种主流数据库,实现了分页查询的数据库无关性。
pom.xml
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<!--springboot项目也可以使用下面的依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
service
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
/**
* 分页查询
*
* @param pageNum 页码
* @param pageSize 每页条数
* @param userQo 查询条件
* @return 分页数据
*/
public Page<UserPo> page(int pageNum, int pageSize, UserQo userQo) {
Page<UserPo> page = PageMethod.startPage(pageNum, pageSize);
//执行查询,数据会自动回填到page中
userMapper.listByQo(userQo);
return page;
}
}
//页码、每页记录数
int pageNum = page.getPageNum();
int pageSize = page.getPageSize();
//符合条件的总记录数、总页数
long total = page.getTotal();
int pages = page.getPages();
//当前页的结果集
List<JpAvPo> userPos = page.getResult();
//可以指定是否开启分页统计,开启才统计 total、pages,默认true
PageMethod.startPage(pageNum, pageSize, true);
//可以指定排序方式,排序方式可以是 null、空串
PageMethod.startPage(pageNum, pageSize, "id asc");
原理:调用dao层查询方法时进行拦截
- 先
select count(...) from t_xxx where...
查询满足条件的记录数,得到total、pages信息。如果false关闭分页统计则不进行这一步 - 然后在目标sql末尾根据数据库类型拼接 limit、top之类的分页参数进行分页查询。注意:目标sql末尾不要加分号,PageHelper是直接拼接在sql末尾的,不会自动去除目标sql末尾的分号。