导入Mybatis-Plus框架后,我们可以使用Mybatis-Plus自带的事务,只需要在配置文件中配置即可
使用配置方式开启日志,设置日志输出方式为标准输出
mybatis-plus:
global-config:
db-config:
table-prefix: tb_
id-type: auto
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
只有最后一行有用
分页操作需要设定分页对象IPage,Page第一个参数当前页码值,第二个是每一页中条数
@Test
void testPage(){
IPage page = new Page(2,2);
bookDao.selectPage(page,null);
System.out.println(page.getRecords());
}
IPage对象中封装了分页操作中的所有数据
数据
当前页码值
每页数据总量
最大页码值
数据总量
这样就直接实现分页了吗?
答案是否定的
分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,
因此需要增强对应的功能,使用MyBatisPlus拦截器实现
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
执行测试代码
@Test
void testPage(){
IPage page = new Page(1,2);
bookDao.selectPage(page,null);
System.out.println(page.getRecords());
}
可以看出执行了两次查询,第一次执行的查询获取了总条数,为下面的分页做准备
上面的分页查询中 bookDao.selectPage(page,null);
第二个参数赋成null,你可能好奇它的功能是什么,那里是用来放条件对象QueryWrapper的。
QueryWrapper解析
QueryWrapper 是 MyBatis-Plus 的一个核心功能,它是用来构造 SQL 查询语句的。MyBatis-Plus 是一款 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
QueryWrapper 主要提供了以下几个功能:
链式调用: QueryWrapper 支持链式调用,使得代码更加简洁易读。
条件构造器: QueryWrapper 提供了丰富的条件构造方法,如 eq (等于)、ne (不等于)、gt (大于)、ge (大于等于)、lt (小于)、le (小于等于) 等。
SQL函数支持: QueryWrapper 支持 SQL 函数,比如 count、sum、avg 等。
子查询支持: QueryWrapper 支持子查询,可以在查询条件中嵌套子查询。
排序支持: QueryWrapper 支持 orderBy 方法进行排序。
下面是一个事例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三")
.ne("age", 20)
.like("email", "test")
.orderByAsc("age");
等价于SQL语句
SELECT * FROM user WHERE name = '张三' AND age != 20 AND email LIKE '%test%' ORDER BY age ASC;
了解完基础知识点,下面是实际使用
@Test
void testGetBy(){
QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","Spring");
List list = bookDao.selectList(queryWrapper);
}
执行结果
缺点:有的时候我们可能会打错,比如将name打成了nmae,有没有什么可以解决呢?有LambdaQueryWrapper。
LambdaQueryWrapper 是 MyBatis-Plus 提供的一个查询条件构造器,它是 QueryWrapper 的一个变种,主要使用 Java 8 的 Lambda 表达式语法。
LambdaQueryWrapper 提供了与 QueryWrapper 类似的功能,包括链式调用、条件构造器、SQL函数支持、子查询支持、排序支持等。
相比于 QueryWrapper,LambdaQueryWrapper 的主要优点在于:
类型安全:LambdaQueryWrapper 使用了 Java 8 的 Lambda 表达式,使得其具有类型安全的特性。你可以在编译时检查到类型错误,而 QueryWrapper 在编译时无法检查到类型错误,只能在运行时通过抛出异常来发现错误。
代码可读性更强:由于使用了 Lambda 表达式,LambdaQueryWrapper 的代码可读性更强。你可以直接看到正在操作的是哪个字段,而不需要通过字符串来指定字段名,这样也避免了因为字段名拼写错误导致的问题。
例如,我们可以使用 LambdaQueryWrapper 构造如下的查询语句:
LambdaQueryWrapper<User> lambdaQuery = new QueryWrapper<User>().lambda();
lambdaQuery.eq(User::getName, "张三")
.ne(User::getAge, 20)
.like(User::getEmail, "test")
.orderByAsc(User::getAge);
等价于SQL语句
SELECT * FROM user WHERE name = '张三' AND age != 20 AND email LIKE '%test%' ORDER BY age ASC;
User::getName 表示字段名是 "name",其他的类推,这样我们就不会因为因为不小心而出错了。
实战如下
@Test
void testGetBy2(){
LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(Book::getName,"Spring");
List list = bookDao.selectList(queryWrapper);
}
执行结果如下
仅学习记录,如有错误欢迎指正~