mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充

目录

 

6、插件

1、分页插件

2、乐观锁插件(当要更新一条记录的时候,希望这条记录没有被别人更新)

3、SQL执行分析插件,避免出现全表更新和删除

4、非法sql检查插件

7、SQL注入器

8、公共字段填充


6、插件

https://mp.baomidou.com/guide/auto-fill-metainfo.html

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第1张图片

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

1、分页插件

在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());
  }

2、乐观锁插件(当要更新一条记录的时候,希望这条记录没有被别人更新)

乐观锁实现方式:

  1. 取出记录时,获取当前version
  2. 更新时,带上这个version
  3. 执行更新时, set version = newVersion where version = oldVersion
  4. 如果version不对,就更新失败

添加配置:

修改实体类添加version字段并在表中添加version字段

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第2张图片

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第3张图片

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);
    }

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第4张图片 //当前方式被限制

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第5张图片

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第6张图片

3SQL执行分析插件,避免出现全表更新和删除

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);
    }

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第7张图片 //这样是全表更新操作

spring.xml

·
·
·
===============================================================================
·
·
·
        
            
                //分页插件
                
                //乐观锁插件
                
===============================================================================
                //禁止全表更新和删除操作
                
==================================== 添加 =====================================  
                    
                        
                            
                        
                    
===============================================================================
            
        
     

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第8张图片

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第9张图片 //成功

4、非法sql检查插件

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);
    }

 //是用来将代码标准化,去掉此代码是可以执行,但要看公司要求

7、SQL注入器

       全局配置 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表示我们要实际操作的实体类对象

自定义注入器:mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第10张图片

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);
    }

8、公共字段填充

注解填充字段 @TableField(.. fill = FieldFill.INSERT插入) 生成器策略部分也可以配置!

metaobject:元对象,是mybatis提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性设置值的一个对象,还会用于包装对象,支持Object,Map,Collection等对象进行包装。本质上metaobject元对象是给对象的属性设置值,最终还是要通过Reflect反射获取到属性的对应方法的invoker调用,最终执行。

编写自定义的公共字段填充:

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第11张图片

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第12张图片

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());
    }

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第13张图片 //Default就是拒绝?

spring.xml中关掉插件:

  1. 乐观锁插件
  2. 禁止全表更新和删除操作
  3. 非法sql阻断
  4. mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第14张图片

mybatis -- 12、mybatis-plus的插件、SQL注入器、公共字段填充_第15张图片

 

 

你可能感兴趣的:(mybatis,mybatis)