目录
6、插件
1、分页插件
2、乐观锁插件(当要更新一条记录的时候,希望这条记录没有被别人更新)
3、SQL执行分析插件,避免出现全表更新和删除
4、非法sql检查插件
7、SQL注入器
8、公共字段填充
https://mp.baomidou.com/guide/auto-fill-metainfo.html
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
在spring.xml文件中添加如下配置引入插件
编写测试类
@Test
public void TestPage(){
Page page = new Page(2,2);
Page page1 = empDao.selectPage(page, null);
List records = page1.getRecords();
for (Object record : records) {
System.out.println(record);
}
System.out.println("==============");
System.out.println("获取总条数:"+page.getTotal());
System.out.println("当前页码:"+page.getCurrent());
System.out.println("总页码:"+page.getPages());
System.out.println("每页显示的条数:"+page.getSize());
System.out.println("是否有上一页:"+page.hasPrevious());
System.out.println("是否有下一页:"+page.hasNext());
}
乐观锁实现方式:
添加配置:
修改实体类添加version字段并在表中添加version字段
spring.xml
·
·
·
===============================================================================
//整合spring和mybatis
//
//
==================================== 添加 =====================================
//分页插件
//乐观锁插件
===============================================================================
//设置下面方式时,可不使用mybatis-config.xml
===============================================================================
===============================================================================
===============================================================================
===============================================================================
MyTest.java
@Test
public void test06(){
Emp emp = new Emp();
emp.setEmpno(18);
emp.seteName("haha");
emp.setSal(10000.0);
emp.setVersion(3);
EmpDao empDao = context.getBean(EmpDao.class);
empDao.updateById(emp);
}
spring.xml
·
·
·
===============================================================================
//整合spring和mybatis
//
//
===============================================================================
//分页插件
//乐观锁插件
==================================== 添加 =====================================
//禁止全表更新和删除操作
===============================================================================
//设置下面方式时,可不使用mybatis-config.xml
===============================================================================
===============================================================================
===============================================================================
===============================================================================
MyTest.java
@Test
public void test07(){
EmpDao empDao = context.getBean(EmpDao.class);
Emp emp = new Emp();
emp.setSal(2222.2);
int update更新 = empDao.update(emp, null);
System.out.println(update);
}
spring.xml
·
·
·
===============================================================================
·
·
·
//分页插件
//乐观锁插件
===============================================================================
//禁止全表更新和删除操作
==================================== 添加 =====================================
===============================================================================
spring.xml
·
·
·
===============================================================================
·
·
·
//分页插件
//乐观锁插件
===============================================================================
//禁止全表更新和删除操作
==================================== 添加 =====================================
//非法sql阻断
===============================================================================
MyTest.java
@Test
public void test08(){
EmpDao empDao = context.getBean(EmpDao.class);
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.or();
List list = empDao.selectList(queryWrapper);
System.out.println(list);
}
//是用来将代码标准化,去掉此代码是可以执行,但要看公司要求
全局配置 sqlInjector
(SQL注入器)
用于注入 ISqlInjector
接口的子类,实现自定义方法注入。也就是说我们可以将配置在xml中的文件使用注入的方式注入到全局中,就不需要再编写sql语句
https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/DefaultSqlInjector.java
在mybatis操作的时候,我们需要自己定义接口中实现的方法,并添加与之对应的EmpDao.xml文件,编写对应的sql语句
在mybatis-plus操作的时候,我们只需要继承BaseMapper接口即可,其中的泛型T表示我们要实际操作的实体类对象
DeleteAll.java(全部删除)
public class DeleteAll extends AbstractMethod抽象方法 {
@Override
public MappedStatement injectMappedStatement(Class> mapperClass, Class> modelClass, TableInfo tableInfo) {
String sql;
MySqlMethod mySqlMethod = MySqlMethod.DELETE_ALL;
if (tableInfo.isLogicDelete()) {
sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), tableInfo,
sqlWhereEntityWrapper(true,tableInfo));
} else {
mySqlMethod = MySqlMethod.DELETE_ALL;
sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(),
sqlWhereEntityWrapper(true,tableInfo));
}
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
return addUpdateMappedStatement(mapperClass, modelClass, mySqlMethod.getMethod(), sqlSource);
}
}
MyInjector.java(我的注入器)
public class MyInjector extends AbstractSqlInjectorjava抽象SQL注入器{
@Override
public List getMethodList(Class> mapperClass) {
return Stream.of(new DeleteAll()).collect(Collectors.toList());
}
}
MySqlMethod.java(我的SQL方法)
//自定义全局删除方法
public enum MySqlMethod {
//删除全部
DELETE_ALL("deleteAll", "根据 entity 条件删除记录", "");
private final String method;
private final String desc;
private final String sql;
MySqlMethod(String method, String desc, String sql) {
this.method = method;
this.desc = desc;
this.sql = sql;
}
public String getMethod() {return method;}
public String getDesc() {return desc;}
public String getSql() {return sql;}
}
EmpDao.java
@Mapper映射
public interface EmpDao extends BaseMapper {
public List selectEmpByCondition();
=================================== 添加 ======================================
Integer deleteAll();
===============================================================================
}
spring.xml
·
·
·
底部:
===============================================================================
=================================== 添加 ======================================
===============================================================================
===============================================================================
MyTest.java
@Test
public void test09(){
EmpDao empDao = context.getBean(EmpDao.class);
Integer integer整数 = empDao.deleteAll();
System.out.println(integer);
}
注解填充字段 @TableField
(.. fill = FieldFill.
INSERT
插入
)
生成器策略部分也可以配置!
metaobject:元对象,是mybatis提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性设置值的一个对象,还会用于包装对象,支持Object,Map,Collection等对象进行包装。本质上metaobject元对象是给对象的属性设置值,最终还是要通过Reflect反射获取到属性的对应方法的invoker调用,最终执行。
MyMetaObjectHandler.java(我的元对象处理)
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "eName", String.class, "lian");
}
//更新
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "eName", String.class, "lian");
}
}
spring.xml
·
·
·
底部:
===============================================================================
//
=================================== 添加 ======================================
===============================================================================
===============================================================================
MyTest.java
@Test
public void test10(){
EmpDao empDao = context.getBean(EmpDao.class);
empDao.insert(new Emp());
}
spring.xml中关掉插件: