mybatis---分页插件&逆向工程
1、分页插件
1.1、分页插件介绍
Mybatis通过提供插件机制,让我们可以根据自己的需要去增强Mybatis的功能,但是,如果没有完全理解Mybatis的运行原理和插件的工作方式,最好不要使用插件,因为会改变mybatis的底层工作原理,给系统带来很大的影响。
1.2、Mybatis的插件典型适用场景
1、分页插件:简单来说就是将查询语句拦截下来,去改变成相应的分页语句即可。
2、公共字段统一赋值:一般的业务都会有创建者,创建时间,修改者,修改时间,mybatis的插件可以在dao层统一拦截进行更新值。
3、性能监控:对与Sql语句的性能监控,拦截sql语句,用日志记录其运行时间。
4、其它:可以在sql执行的各个阶段去拦截并做相应的处理。
1.3、如何适用mybatis分页插件
在github上面搜索mybatis-PageHelper,如下图所示,即可:
1、引入以下jar包
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.1</version>
</dependency>
2、在mybatis的配置文件引入此插件
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>
3、在测试类中引用即可
注意:mapper.xml文件不用写limit参数
package cool.ale.tests;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import cool.ale.mapper.EmpMapper;
import cool.ale.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
private SqlSession session = null;
@Before
public void before() throws IOException {
// 从 xml中构建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// true是设置自动提交
session = sqlSessionFactory.openSession(true);
}
@Test
public void select01() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
// 实现分页功能
PageHelper.startPage(1,10);
Emp emp = new Emp();
//emp.setId(101);
List<Emp> empList = mapper.selectEmp(emp);
// 查询完之后封装成 PageInfo ,这里会有很多参数
PageInfo pageInfo = new PageInfo(empList);
System.out.println(pageInfo);
}
}
2、逆向工程
1、导入相应的jar包
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
2、写配置文件,需要生成那些表,那些文件等
<?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>
<!--数据库驱动
使用dos命令时,需要配置数据库驱动
-->
<!--<classPathEntry location="D:\Java\apache-maven-3.5.4\repository\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar"/>-->
<!-- context配置上下文,配置生成规则
id 任意写
MyBatis3DynamicSql 默认的,会生成带动态sql的CRUD
MyBatis3 生成通用的查询,可以指定动态where的条件
MyBatis3Simple 只生成简单的CRUD
-->
<context id="context" targetRuntime="MyBatis3">
<!-- 注释生成器 -->
<!--<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>-->
<!--数据库链接地址账号密码-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver>
<!--<property name="forceBigDecimals" value="false"/>-->
</javaTypeResolver>
<!--生成Model类存放位置
targetPackage 生成到哪个包下
targetProject 生成到当前文件的哪个对应路径下
-->
<javaModelGenerator targetPackage="cool.ale.pojo" targetProject="src/main/java">
<!--<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>-->
</javaModelGenerator>
<!--生成映射文件存放位置
targetPackage 生成到哪个包下
targetProject 生成到当前文件的哪个对应路径下
-->
<sqlMapGenerator targetPackage="cool.ale.mapper" targetProject="src/main/resources">
<!--<property name="enableSubPackages" value="true"/>-->
</sqlMapGenerator>
<!--生成Dao类存放位置
type 指定生成的方式
1、使用注解的方式生成
2、使用接口绑定的方式生成(一定要配置sqlMapGenerator)
targetPackage 生成到哪个包下
targetProject 生成到当前文件的哪个对应路径下
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="cool.ale.mapper" targetProject="src/main/java">
<!--<property name="enableSubPackages" value="true"/>-->
</javaClientGenerator>
<!--生成对应表及类名
domainObjectName 对应的实体类的名字
mapperName 对应的mapper接口以及mapper.xml文件的名字-->
<table tableName="emp" domainObjectName="Emp" mapperName="EmpMapper"></table>
<table tableName="dept" domainObjectName="Dept" mapperName="DeptMapper"></table>
</context>
</generatorConfiguration>
3、写测试类
package cool.ale.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.internal.DefaultShellCallback;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class MyGeneratorTest {
@Test
public void test01() throws Exception {
//MBG执行过程中的警告信息
List<String> warnings = new ArrayList<String>();
//生成代码重复时,是否覆盖源代码
boolean override = false;
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(in);
DefaultShellCallback callback = new DefaultShellCallback(override);
//创建MBG
MyBatisGenerator mbg = new MyBatisGenerator(config, callback, warnings);
mbg.generate(null);
//输出警告信息
for (String warn : warnings) {
System.out.println(warn);
}
}
}
如果我们使用了mybatis3的方式生成,我们可以使用它给我们生成的动态条件的sql,示例如下:
package cool.ale.test;
import cool.ale.mapper.EmpMapper;
import cool.ale.pojo.Emp;
import cool.ale.pojo.EmpExample;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyMybatisTest {
private SqlSession session = null;
@Before
public void before() throws IOException {
// 从 xml中构建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// true是设置自动提交
session = sqlSessionFactory.openSession(true);
}
@Test
public void select01() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
// 使用mybatis3生成的 EmpExample 实现动态条件语句
EmpExample empExample = new EmpExample();
EmpExample.Criteria criteria = empExample.createCriteria();
criteria.andUserNameLike("%测%")
.andIdEqualTo(2);
List<Emp> empList = mapper.selectByExample(empExample);
System.out.println(empList);
}
}