MyBatisPlus-8-自定义全局操作

自定义全局操作

  1. 根据 MybatisPlus 的 AutoSqlInjector 可以自定义各种你想要的 sql ,注入到全局中,相当于自定义 Mybatisplus 自动注入的方法。
  2. 之前需要在 xml 中进行配置的 SQL 语句,现在通过扩展 AutoSqlInjector 在加载 mybatis 环境时就注入。

1.1 AutoSqlInjector

  1. 在 Mapper 接口中定义相关的 CRUD 方法
  2. 扩展 AutoSqlInjector inject 方法,实现 Mapper 接口中方法要注入的 SQL
  3. 在 MP 全局策略中,配置 自定义注入器

2.1 自定义注入全表删除方法 deteleAll

2.1.1 自定义 MySqlInjector 注入类

public class MySqlInjector extends AutoSqlInjector {

    /**
     * 扩展inject 方法,完成自定义全局操作
     */
    @Override
    public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass,
                       Class<?> modelClass, TableInfo table) {
        //将EmployeeMapper中定义的deleteAll, 处理成对应的MappedStatement对象,加入到configuration对象中。

        //注入的SQL语句
        String sql = "delete from " + table.getTableName();
        //注入的方法名   一定要与EmployeeMapper接口中的方法名一致
        String method = "deleteAll";

        //构造SqlSource对象
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);

        //构造一个删除的MappedStatement
        this.addDeleteMappedStatement(mapperClass, method, sqlSource);
    }

}

2.1.2 mapper.java 接口类需要申明使用方法 deleteAll

public interface EmployeeMapper extends BaseMapper<Employee> {

    /**
     * 自定义注入方法
     */
    Integer deleteAll();
}

2.1.3 配置注入启动

<!-- 定义 MP 全局策略,安装集成文档部分结合 -->
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
    .....

  <!-- 自定义注入 deleteAll 方法  -->
  <property name="sqlInjector" ref="mySqlInjector" />
</bean>

<!-- 自定义注入器 -->
<bean id="mySqlInjector" class="com.don.mp.injector.MySqlInjector"/>

2.1.4 测试

    /**
     * 测试自定义全局操作
     */
    @Test
    public void testMySqlInjector() {

        Integer result = employeeMapper.deleteAll();
        System.out.println("result: " + result);

    }

3.1 自定义注入器的应用之逻辑删除

com.baomidou.mybatisplus.mapper.LogicSqlInjector
  1. logicDeleteValue 逻辑删除全局值
  2. logicNotDeleteValue 逻辑未删除全局值
  3. 在 POJO 的逻辑删除字段 添加 @TableLogic 注解
  4. 会在 mp 自带查询和更新方法的 sql 后面,追加『逻辑删除字段』=『LogicNotDeleteValue默认值』 删除方法: deleteById()和其他 delete 方法, 底层 SQL 调用的是 update tbl_xxx set 『逻辑删除字段』=『logicDeleteValue 默认值』

3.1.1 全局配置注入LogicSqlInjector

Java Config方式:

@Bean
public GlobalConfiguration globalConfiguration() {
    GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector());
    conf.setLogicDeleteValue("-1");
    conf.setLogicNotDeleteValue("1");
    conf.setIdType(2);
    return conf;
}

XML配置方式:

<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
    <!-- 注入逻辑删除 -->
    <property name="sqlInjector" ref="logicSqlInjector"/>

    <!-- 注入逻辑删除全局值 -->
    <property name="logicDeleteValue" value="-1"/>
    <property name="logicNotDeleteValue" value="1"/>
    <property name="idType" value="2" />
</bean>

<!-- 逻辑删除 -->
<bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector"/>

修改逻辑删除实体

    ...
    
    @TableLogic   // 逻辑删除属性
    private Integer logicFlag;
    
    ...

测试

    /**
     * 测试逻辑删除
     */
    @Test
    public void testLogicDelete() {
        Integer result = userMapper.deleteById(1);
        System.out.println("result:" + result);

        User user = userMapper.selectById(1);
        System.out.println(user);
    }

结果

    UPDATE tbl_user SET logic_flag=-1 WHERE id=?

3.1.2 Spring Boot配置

mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.don.springboot.entity
  typeEnumsPackage: com.don.springboot.entity.enums
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 2
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    db-column-underline: true
    #逻辑删除配置
    logic-delete-value: 0
    logic-not-delete-value: 1
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector

转载于:https://my.oschina.net/don94/blog/3102324

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatisPlus 是一个基于 MyBatis 的代码生成器和持久层框架的增强工具,它简化了数据访问的开发过程。在 MyBatisPlus 中,自定义数据库操作异常捕获通常涉及到使用其提供的异常处理器或者自定义错误处理策略。 1. **全局异常处理器**:MyBatisPlus 提供了一个全局异常处理器 `GlobalExceptionHandler`,你可以通过配置文件或在代码中设置它,以便在发生数据库操作异常时统一处理。例如: ```java // 配置全局异常处理器 MybatisPlus.me().globalExceptionHandler(new GlobalExceptionHandler() { @Override public void execute(ResultSet rs, String sql, Object parameter, Connection connection, SQLException e) { // 在这里处理异常,如记录日志、返回错误信息等 log.error("Database operation exception: ", e); } }); ``` 2. **自定义异常**:如果你想要更细粒度的控制,可以创建自定义数据库异常并捕获,比如继承 `BaseRuntimeException` 或 `DataAccessException` 类。这样,你可以在具体的业务逻辑中添加异常处理代码: ```java try { // 数据库操作 } catch (DataAccessException e) { throw new CustomDatabaseException("An error occurred during database operation", e); } // 自定义异常类 public class CustomDatabaseException extends DataAccessException { // 构造方法和必要的逻辑 } ``` 3. **异常映射**:在 MyBatisPlus 的 XML 映射文件中,可以为特定的 SQL 语句或 mapper 方法设置异常映射,这样在运行时如果发生预期之外的异常,会自动抛出相应的异常类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值