一、Mybatis-Plus。
(1)ActiveRecord。
简介:ActiveRecord 是一种常见的设计模式之一。ActiveRecord 是一种面向对象的数据库操作模式,它将数据库表映射为类,将表中的行映射为对象。在 ActiveRecord 模式中,每个类都对应了数据库中的一张表,而每个实例则代表了该表中的一行数据。通过这种方式,可以直接在实例上调用增删改查方法,来完成与数据库的交互。
注意:虽然在使用 Model 类中的方法时不需要显式地调用 UserMapper 接口或其他 Mapper 接口的方法,但是这些接口仍然是 Model 类方法底层实现所必需的,不能删除。
@Test
public void testSelectById() {
User user = new User();
user.setId(2L);
User user1 = user.selectById();
System.out.println(user1);
}
@Test
public void testInsert() {
User user = new User();
user.setUserName("liubei");
user.setPassword("123456");
user.setAge(30);
user.setName("刘备");
user.setMail("liubei@itcast.cn");
//调用AR的insert方法进行插入数据
boolean insert = user.insert();
System.out.println("result => "+insert);
}
@Test
public void testUpdateById() {
User user = new User();
user.setId(13L);//查询条件
user.setAge(31);//更新数据
boolean result = user.updateById();
System.out.println("result => "+result);
}
@Test
public void testDelete() {
User user = new User();
user.setId(13L);
boolean delete = user.deleteById();
System.out.println("result => "+delete);
}
@Test
public void testSelect() {
User user = new User();
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ge("age",30);//大于等于30岁的用户查询出来
List<User> userList = user.selectList(wrapper);
for (User user1 : userList) {
System.out.println(user1);
}
}
(2)Oracle 主键Sequence。( 没学过oracle,了解即可)
(3)插件。
(3.1) MybatisPlusInterceptor插件主体。
(3.2)mybatis的插件机制。
如果默认支持的拦截器无法满足特定的需求时,也可以在 Executor、ParameterHandler、ResultSetHandler 和 StatementHandler 接口的实现类中编写自定义的方法,并通过拦截器进行拦截和增强。但是这样做需要开发者具备较高的 MyBatis 以及 Java 技术水平以及对 SQL 执行细节的理解。
package mp.plugins;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import java.util.Properties;
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class MyInterceptor implements Interceptor {
@Override//执行1次
public Object intercept(Invocation invocation) throws Throwable {
//拦截方法,具体业务逻辑编写的位置
return invocation.proceed();
}
@Override//执行了四次,分别拦截了:Executor、ParameterHandler、ResultSetHandler、StatementHandler这四个对象
public Object plugin(Object target) {
//创建target对象的代理对象,目的是将当前拦截器加入到该对象中
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
//属性设置
}
}
(3.3)防全表更新与删除插件。
注意:该插件仅适用于开发环境,不 适用于生产环境。
注意!
- 多个插件使用的情况,请将分页插件放到
插件执行链
最后面。如在租户插件前面,会出现COUNT
执行SQL
不准确问题。
@Configuration
@MapperScan("mp.mapper") //设置mapper接口的扫描包
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//这里是添加分页查询的拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//这里是添加阻止恶意的全表更新删除的拦截器
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
//注入自定义的拦截器(插件)
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
}
(3.4)性能插件(在 Mybatis-Plus 3.4.0 版本中被官方废弃)。
注意:该插件只用于开发环境,不建议生产环境使用。
1、PerformanceInterceptor
类在 Mybatis-Plus 3.4.0 版本中被官方废弃。原因是该拦截器会在每次 SQL 执行时都输出一些日志信息,对性能会有一定的消耗。
2、官方建议使用 p6spy
或者其他 SQL 监控工具来监控 SQL 执行效率,以替代 PerformanceInterceptor
。
3、如果您仍然希望在项目中使用 PerformanceInterceptor
,可以将其版本锁定在 Mybatis-Plus 3.3.2 及以下版本。
(3.5)乐观锁插件。
mybatis的核心xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">
<property name="@page" value="com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor"/>
</plugin>
</plugins>
</configuration>
springboot:
@Configuration
@MapperScan("mp.mapper") //设置mapper接口的扫描包
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//这里是添加分页查询的拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//这里是添加阻止恶意的全表更新删除的拦截器
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
//配置乐观锁
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
//注入自定义的拦截器(插件)
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
}
<bean class="com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor" id="optimisticLockerInnerInterceptor"/>
<bean id="mybatisPlusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">
<property name="interceptors">
<list>
<ref bean="optimisticLockerInnerInterceptor"/>
</list>
</property>
</bean>