Mybatis-Plus(四 )--其他

目录

一.其他功能

1.自动填充

2.逻辑删除

3.通用枚举

4.sql注入器

二.ActiveRecord

三.MybatisX是一款基于IDEA的快速开发插件。

四.代码生成器

五.插件

1、mybatis的插件机制

2.执行分析插件

3.性能分析插件


一.其他功能

1.自动填充

有些时候我们可能会在插入或者更新数据时,希望有些字段可以自动填充数据,比如密码,version等。

【1】添加@TableField注解

@TableField(fill=FieldFill.INSERT)//插入数据时进行填充
private String password;

除了插入数据时进行填充,FieldFill还提供了多种模式选择:

public enum FieldFill{
    //默认不处理
    DEFAULT,
    //插入时填充字段
    INSERT,
    //更新时填充自动
    UPDATE,
    //插入和更新时填充字段
    INSERT_UPDATE
}

【2】编写MyMetaObjectHandler

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        Object password=getFieldValByName("password",metaObject);
        if(null==password){
            //字段为空,可以进行填充
            setFieldValByName("password","123456",metaObject);
        }
    }
    @Override
    public void updateFill(MetaObject metaObject) {

    }
}

2.逻辑删除

开发系统时,有时候在实现功能时,删除操作需要数显逻辑删除,所谓逻辑删除就是将数据标记为删除,二并非正在的物理删除(非DELETE操作),查询时需要携带状态条件,确保被标记的数据不被查询到,这样做的目的就是避免数据被真正的删除。

【1】修改表结构

为tb_user表增加deleted字段,用于表示数据是否被删除,1代表删除,0代表未删除。

ALTER TABLE 'tb_user'
ADD COLUMN 'deleted' int(1) NULL DEFAULT 0 COMMIT '1代表删除,0代表未删除' AFTER 'version';

同时也修改了User实体,增加deleted属性并添加@TableLogic注解

@TableLogic
private Integer deleted;

【2】添加配置

#逻辑已删除值(默认为1)
mybatis-plus.global-config.db-config.logic-delete-value=1
#逻辑未删除值(默认为0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

3.通用枚举

【1】修改表结构

ALTER TABLE 'tb_user'
ADD COLUMN 'sex' int(1) NULL DEFAULT 1 COMMIT '1-男,2-女' AFTER 'deleted';

【2】定义枚举

package com.flyingpig.util;

import com.baomidou.mybatisplus.annotation.IEnum;
import com.fasterxml.jackson.annotation.JsonValue;
public enum SexEnum implements IEnum<Integer> {
    MAN(1,"男"),
    WOMAN(2,"女");
    private int value;
    private String desc;
    @Override
    public Integer getValue() {
        return this.value;
    }
    @Override
    public String toString(){
        return this.desc;
    }
}

【3】配置

#枚举包扫描
mybatis-plus.type-enums-package=com.flyingpig.util

【4】修改实体

private SexEnum sex;

4.sql注入器

在MP中,通过AbstractSqlInjector将BaseMappper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行。
我们需要扩充BaseMapper中的方法,有该如何实现呢?
下面我们以扩展findAll方法为例进行学习。
【1】编写MyBaseMapper

public interface MyBaseMapper<T> extends BaseMapper<T>{
    List<T> findAll();
}

其他的Mapper都可以继承该Mapper,这样实现了统一的扩展。如:

public interface UserMapper extends MyBaseMapper<User>{
}

【2】编写MySqlInjector

如果直接继承AbstractSqlInjector的话,原有的BaseMapper中的方法将失效,所以我们选择继承DefaultSqlInjector 进行扩展。

public class MySqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList() {
        List<AbstractMethod> methodList = super.getMethodList();
        methodList.add(new FindAll());
        // 再扩充自定义的方法
        list.add(new FindAll());
        return methodList;
    }
}

【3】编写FindAll

public class FindAll extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sqlMethod = "findAll";
        String sql = "select * from " + tableInfo.getTableName();
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql,modelClass);
        return this.addSelectMappedStatement(mapperClass, sqlMethod, sqlSource,modelClass, tableInfo);
    }
}

【4】注册到Spring容器

/**
* 自定义SQL注入器
*/
@Bean
public MySqlInjector mySqlInjector(){
    return new MySqlInjector();
}

【5】测试

@Test
public void testFindAll(){
    List<User> users = this.userMapper.findAll();
    for (User user : users) {
        System.out.println(user);
    }
}

二.ActiveRecord

ActiveRecord(简称AR)一直广受动态语言(PHP,Ruby等的喜爱。)作为准静态语言的Java也有所应用。

什么是ActiveRecord?
ActiveRecord也属于ORM(对象惯性映射层),遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性,配合遵循的命名和配置惯例,能构很大程度的快速实现模型的操作,而且简洁易懂。

开启AR之旅

在MP中,开启AR非常简单,只需要将实体对象继承Model即可。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User extends Model<User> {
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;
}

然后使用实体类中继承的方法就可以对数据库进行各种操作。

@Test
public void testAR() {
    User user = new User();
    //根据主键查询
    user.setId(2L);
    User user2 = user.selectById();
    System.out.println(user2);
    //新增数据
    user.setName("刘备");
    user. setAge(30);
    user.setPassword("123456");
    user.setUserName("liubei");
    user.setEmail("liubei@itcast.cn");
    boolean insert = user.insert();
    System.out.println(insert);
    //更新操作
    user.setId(8L);
    user.setAge(35);
    boolean update = user.updateById();
    System.out.println(update);
    //删除操作
    user.setId(7L);
    boolean delete = user.deleteById();
    System.out.println(delete);
    //根据条件查询
    Querywrapper<User> userQuerywrapper = new Querywrapper»();
    userQuerywrapper.le("age","20");
    List<User> users = user.selectList(userQuerywrapper);
    for (User user1 : users) {
        System.out.println(user1);
    }
}

三.MybatisX是一款基于IDEA的快速开发插件。


安装方法:打开IDEA,进入File->Setting->Plugins->Browse Repositories,输入mybatisX搜索并安装。
功能:
Java与XML的调回跳转
Mapper方法自动生成XML

四.代码生成器

AutoGenerator是MyBatis-Plus的代码生成器,通过AutoGenerator可以快速生成Entity,Mapper,Mapper XML,Service,Controller等各个模块的代码,极大的提升了开发效率。

【1】pom.xml中添加依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3.1</version>
</dependency>

【2】编写MysqlGenerator类

public class MysqlGenerator {
    //读取控制台内容
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入"+tip+":");
        System.out.println(help.tostring());
        if (scanner.hasNext()){
            String ipt = scanner.next();
            if (Stringutils.isNotEmpty(ipt)){
                return ipt;
            }
        }
        throw new MybatisplusException("请输入正确的"+tip+"!");
}
/**
* RUN THIS
*/
public static void main(String[] args){
    //代码生成器
    AutoGenerator mpg = new AutoGenerator();
    //全局配置
    GlobalConfig gc = new GlobalConfig();
    String projectPath = System.getproperty("user.dir");
    gc.setoutputDir(projectPath + "/src/main/java");
    gc.setAuthor("itcast");
    gc.setopen(false);
    mpg.setGlobalConfig(gc);
    ∥数据源配置
    DataSourceConfig dsc = new DatasourceConfig();
    dsc.setur1("jdbc:mysq1://127.0.0.1:3306/mp?
    useunicode=true&usesSL=false&characterEncoding=utf8");
    // dsc.setSchemaName("public");
    dsc.setDriverName("com.mysq1.jdbc.Driver");
    dsc.setUsername("root");
    dsc.setPassword("root");
    mpg. setDataSource(dsc);
    //包配置
    PackageConfig pc = new PackageConfig();
    pc.setModuleName(scanner("模块名"));
    pc.setParent("cn.itcast.mp.generator");
    mpg.setPackageInfo (pc);
    //自定义配置
    Injectionconfig cfg = new Injectionconfig(){
        @Override
        public void initMap() {
            // to do nothing
        }
    };
    List<FileoutConfig> focList = new ArrayList<>();
    focList.add(new FileoutConfig("/templates/mapper.xm1.ftl") {
        @Override
        public String outputFile(TableInfo tableInfo) {
        //自定义输入文件名称
        return projectPath + "/itcast-mp-
generator/src/main/resources/mapper/" + pc.getModuleName()+ "/"+ tableInfo.getEntityName()+ "Mapper"+StringPoo1.DOT_XML;
        }
    });
    cfg.setFileoutConfigList(focList);
    mpg.setcfg(cfg);
    mpg.setTemplate(new TemplateConfig().setxm1(nu11));
    //策略配置
    StrategyConfig strategy = new StrategyConfig();
    strategy.setNaming(NamingStrategy.underline_to_camel);
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");
    strategy.setEntityLombokModel(true);
//strategy.setSupercontrollerClass("com.baomidou.mybatisplus.samples.generator.common.Basecontroller");
    strategy.setInclude(scanner("表名"));
    strategy.setSuperEntityColumns("id");
    strategy.setcontrollerMappingHyphenStyle(true);
    strategy.setTablePrefix(pc.getModuleName() + "_");
    mpg.setStrategy(strategy);
    //选择freemarker引擎需要指定如下加,注意 pom依赖必须有!
    mpg.setTemplateEngine(new FreemarkerTemplateEngine(O);
    mpg.execute();
    }
}

测试:

 生成的代码:

 其中的实体对象:

五.插件

1、mybatis的插件机制

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法 调用包括:
1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
2. ParameterHandler (getParameterObject, setParameters)
3. ResultSetHandler (handleResultSets, handleOutputParameters)
4. StatementHandler (prepare, parameterize, batch, update, query)
我们看到了可以拦截Executor接口的部分方法,比如update,query,commit,rollback等方法,还有其他接口的 一些方法等。
总体概括为:
1. 拦截执行器的方法
2. 拦截参数的处理
3. 拦截结果集的处理
4. 拦截Sql语法构建的处理

2.执行分析插件

在MP中提供了对SQL执行的分析的插件,可用作阻断全表更新、删除的操作,注意:该插件仅适用于开发环境,不 适用于生产环境。

3.性能分析插件

性能分析拦截器,用于输出每条 SQL 语句及其执行时间,可以设置最大执行时间,超过时间会抛出异常。
该插件只用于开发环境,不建议生产环境使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值