浅谈MyBatis-Plus学习之自定义全局操作及逻辑删除
一、自定义全局操作介绍
MP中提供扩展AutoSqlInjector可以自定义各种想要的 sql ,注入到全局中,相当于自定义MP 自动注入的方法。
也就是说继承BaseMapper<T>接口时就带有的方法,在加载相应的配置环境时就会注入。
二、实现自定义全局操作如下
2.1、在实现的Mapper接口中定义方法
public interface EmployeeMapper extends BaseMapper<Employee> { /** * 自定义注入方法 * @return */ int deleteAll(); }
2.2、继承AutoSqlInjector,并重写内部的inject方法
public class DeleteAllInject extends AutoSqlInjector{ @Override public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass, Class<?> modelClass, TableInfo table) { /** * 核心就是将sql语句和mapper接口中的方法进行映射 * 封装成一个MapperStatement对象 * 然后初始化时Configuration对象自动加载 */ String sql = "delete from " + table.getTableName(); String method = "deleteAll"; SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); this.addDeleteMappedStatement(mapperClass, method, sqlSource); } }
2.3、最后在将该Bean注入到全局配置策略中
<!-- mybatis-plus全局配置策略 ,这样避免重复在每一个实体中使用注解进行配置--> <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <property name="dbColumnUnderline" value="true"></property> <!-- 2.3版本后默认配置数据库下划线--> <!-- 指定数据库ID生成策略 0:数据库自增--> <property name="idType" value="0"></property> <!-- 指定数据库表前缀 --> <property name="tablePrefix" value="tbl_"></property> <!-- 注入全局配置方法 --> <property name="sqlInjector" ref="deleteAllInject"></property> </bean> <bean id="deleteAllInject" class="cn.hjj.mp.inject.DeleteAllInject"></bean>
2.4、测试代码如下
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class TestAutoSqlInject {
@Autowired
private EmployeeMapper employeeMapper;
@Test
public void testDeleteAll() {
employeeMapper.deleteAll();
}
}
三、逻辑删除简介
逻辑删除:就是并不是真正的将数据从数据库中删除,因为数据是宝贵的。只是将数据库中的该删除的记录的逻辑删除字段设置为删除状态
四、实现逻辑删除操作如下
4.1、创建一个新的实体,并在对应的数据库中创建相应的表数据
注意标志字段要使用@TableLogic标识告诉MP知道哪个是标识字段
public class User { @TableId(type=IdType.AUTO) private Integer id; private String name; @TableLogic //标志是一个逻辑标识符号 private Integer deleteFlag; // get Methods // set Methods }
4.2、在配置文件中进行配置相应的Bean以及参数
applicationContext.xml
<!-- mybatis-plus全局配置策略 ,这样避免重复在每一个实体中使用注解进行配置--> <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <property name="dbColumnUnderline" value="true"></property> <!-- 2.3版本后默认配置数据库下划线--> <!-- 指定数据库ID生成策略 0:数据库自增--> <property name="idType" value="0"></property> <!-- 指定数据库表前缀 --> <property name="tablePrefix" value="tbl_"></property> <!-- 注入逻辑删除 --> <property name="sqlInjector" ref="logicSqlInjector"></property> <!-- 逻辑删除全局值 --> <property name="logicDeleteValue" value="-1"></property> <!-- 逻辑未删除全局值 --> <property name="logicNotDeleteValue" value="1"></property> </bean> <!-- 配置逻辑删除注入的Bean --> <bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector"></bean>
4.3、测试代码如下
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:applicationContext.xml"}) public class TestLogicDelete { @Autowired private UserMapper userMapper; @Test public void testDelete() { Integer res = userMapper.deleteById(1); System.out.println("res: " + res); } @Test public void testSelect() { User user = userMapper.selectById(1); System.out.println("res: " + user); } }
本质:会在进行删除和查询的时候的时候附带逻辑删除字段,删除操作其实是一个更新语句,将当前要删除的记录的逻辑状态更新为配置的“逻辑删除全局值”