八、自定义全局操作
8.1.自定义全局实例
自定义全局操作,就是将我们需要的sql在项目启动的时候就注入到全局中,操作步骤如下:
- 在Mapper接口中定义我们需要注入的方法;
- 扩展AutoSqlInjector中的inject方法,实现Mapper中我们自定义方法要注入的sql;
- 最后,在全局配置中,配置我们自定义的注入器即可;
第一步:mapper中定义方法
public interface UserMapper extends BaseMapper<User> {
int deleteAll();
}
第二步:重写inject方法
public class MySqlInjector extends AutoSqlInjector {
@Override
public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
// 构造sql语句
String sql = "delete from " + table.getTableName();
// 构造方法名
String method = "deleteAll";
// 构造SqlSource对象
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
// 构造一个删除的MapperStatement
this.addDeleteMappedStatement(mapperClass,method,sqlSource);
}
}ß
第三步:注入自定义配置
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射-->
<property name="dbColumnUnderline" value="true"></property>
<!-- 全局的主键策略 -->
<property name="idType" value="0"></property>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tbl_"></property>
<!--注入自定义全局操作-->
<property name="sqlInjector" ref="mySqlInjector"></property>
</bean>
<bean class="com.luo.injector.MySqlInjector" id="mySqlInjector"></bean>
测试
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private UserMapper userMapper = ioc.getBean("userMapper",UserMapper.class);
@Test
public void testInject(){
int rs = userMapper.deleteAll();
}
8.2.逻辑删除
所谓逻辑删除,就是不真正的删除数据的记录,而是变为无效状态,在MybatisPlus中,给我们提供logicSqlInjector
第一步:数据库添加逻辑字段
第二步:实体类添加对应属性和注解
@TableLogic
private Integer logicFlag;
第三步:MybatisPlus全局配置中加入logicSqlInjector
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射-->
<property name="dbColumnUnderline" value="true"></property>
<!-- 全局的主键策略 -->
<property name="idType" value="0"></property>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tbl_"></property>
<!--注入自定义全局操作-->
<property ref="logicSqlInjector" name="sqlInjector"></property>
<!--注入逻辑删除全局值-->
<property name="logicDeleteValue" value="-1"></property>
<property name="logicNotDeleteValue" value="1"></property>
</bean>
<!--逻辑删除-->
<bean class="com.baomidou.mybatisplus.mapper.LogicSqlInjector" id="logicSqlInjector"></bean>
测试
@Test
public void testLogin(){
Integer integer = userMapper.deleteById(1);
}
说明:我们做的是删除操作,但是,执行的却是update操作,同时,
查询的时候自动添加了有效判断