=========================================================
四、详细拆解CRUD
在测试之前需要注意一些要点,如下放代码所示需要在yml配置文件中加入下面的代码块。这样在测试的时候会在控制台打印sql语句供参考:
//#在控制台打印sql语句
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
baseMapper中的方法:
insert
deleteById deleteByMap delete deleteBatchIds
updateById update
selectById selectBatchIds selectByMap selectOne selectCount
selectList selectMaps selectObjs selectPage selectMapsPage
/**
* 分页查询测试
*/
@Test
public void selectPageLoads() {
Page<User> page = new Page<>(1,5);
IPage<User> lstUser = mapper.selectPage(page, null);//null代表的是条件构造器
System.out.println("return selectPageLoads value = " + lstUser);
}
想实现mybatis-plus分页首先需要确定配置了分页插件配置方法
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
在配置类或启动类中增加上面的bean就可以使用了,如不不添加分页不成功查询所有内容
baseMapper源码介绍的都是基本的CRUD :
package com.baomidou.mybatisplus.core.mapper;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
/**
* <p>
* Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
* </p>
* <p>
* 这个 Mapper 支持 id 泛型
* </p>
*
* @author hubin
* @since 2016-01-23
*/
public interface BaseMapper<T> {
/**
* <p>
* 插入一条记录
* </p>
*
* @param entity 实体对象
*/
int insert(T entity);//√
/**
* <p>
* 根据 ID 删除
* </p>
*
* @param id 主键ID
*/
int deleteById(Serializable id);//√
/**
* <p>
* 根据 columnMap 条件,删除记录
* </p>
*
* @param columnMap 表字段 map 对象
*/
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);//√
/**
* <p>
* 根据 entity 条件,删除记录
* </p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* <p>
* 删除(根据ID 批量删除)
* </p>
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);//√
/**
* <p>
* 根据 ID 修改
* </p>
*
* @param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) T entity);//√
/**
* <p>
* 根据 whereEntity 条件,更新记录
* </p>
*
* @param entity 实体对象 (set 条件值,不能为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
/**
* <p>
* 根据 ID 查询
* </p>
*
* @param id 主键ID
*/
T selectById(Serializable id);//√
/**
* <p>
* 查询(根据ID 批量查询)
* </p>
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);//√
/**
* <p>
* 查询(根据 columnMap 条件)
* </p>
*
* @param columnMap 表字段 map 对象
*/
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);//√
/**
* <p>
* 根据 entity 条件,查询一条记录
* </p>
*
* @param queryWrapper 实体对象
*/
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* <p>
* 根据 Wrapper 条件,查询总记录数
* </p>
*
* @param queryWrapper 实体对象
*/
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* <p>
* 根据 entity 条件,查询全部记录
* </p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* <p>
* 根据 Wrapper 条件,查询全部记录
* </p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* <p>
* 根据 Wrapper 条件,查询全部记录
* 注意: 只返回第一个字段的值
* </p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* <p>
* 根据 entity 条件,查询全部记录(并翻页)
* </p>
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);//√
/**
* <p>
* 根据 Wrapper 条件,查询全部记录(并翻页)
* </p>
*
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类
*/
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
原文链接:https://blog.csdn.net/m0_37034294/article/details/82908527
=========================================================
五、强大的条件构造器queryWrapper、updateWrapper
1、条件构造器关系介绍

Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
2、条件构造器表达式

原文链接:https://blog.csdn.net/m0_37034294/article/details/82917234
=========================================================
六、实现多表联查分页3.X版本
MP推荐使用的是一种苞米豆团队自己封装好的分页插件,也就是PaginationInterceptor分页拦截器,那么下面集成分页插件
1、配置分页插件
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@Configuration
@MapperScan("com.lqf.multitable.dao.*")
public class MybatisPlusConfig {
/**
* mybatis-plus SQL执行效率插件【生产环境可以关闭】
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/*
* 分页插件,自动识别数据库类型 多租户,请参考官网【插件扩展】
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
由于在多表联查的情况下可能会出现返回不同表的字段,当自动生成的表不能满足你的返回条件时,需要我们自动生成一个返回实体。
2、创建返回实体
import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRoleVo {
private Long userId;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 修改时间
*/
private LocalDateTime updateTime;
/**
* 账号
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 姓名
*/
private String realname;
/**
* 性别(0为女 1为男)
*/
private Integer sex;
/**
* 手机号
*/
private String mobile;
/**
* 密码加密串
*/
private String passwordMd5;
/**
* 开账号人
*/
private Long parentId;
/**
* 是否禁用 0否 1是
*/
private Integer status;
/**
* 授权大区
*/
private String authArea;
/**
* 授权城市
*/
private String authCity;
private Integer role;
/**
* 用户剩余卡数
*/
private Integer residueCardNumber;
/**
* 最后登录时间
*/
private LocalDateTime lastLoginTime;
/**
* 最后登录ip地址
*/
private String lastLoginIp;
/**
* 最后登录次数
*/
private Integer lastLoginCount;
/**
* 渠道
*/
private String authChannel;
/**
* 0 外网 1 内网
*/
private Integer internet;
/**
* 金币
*/
private Long goldCoin;
private Long id;
/**
* 状态
*/
private String statusId;
/**
* 角色名
*/
private String roleName;
/**
* 角色值
*/
private String roleValue;
/**
* 能添加的下属角色值
*/
private String addibleValue;
}
3、测试Test
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.UserRoleVo;
import com.lqf.multitable.service.crm.FyUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMybatisPlusMultiTableApplicationTests {
@Autowired
private FyUserService service;
/**
* 联表查询并分页
*/
@Test
public void contextLoads() {
// 当前页,总条数 构造 page 对象
Page<UserRoleVo> page = new Page<>(1, 10);
page.setRecords(service.selectUserListPage(page));
System.out.println(page);
}
}
4、service层
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.FyUser;
import com.lqf.multitable.bean.crm.UserRoleVo;
import com.lqf.multitable.dao.crm.FyUserMapper;
import com.lqf.multitable.service.crm.FyUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 服务实现类
*/
@Service
public class FyUserServiceImpl extends ServiceImpl<FyUserMapper, FyUser> implements FyUserService {
@Override
public List<UserRoleVo> selectUserListPage(Page<UserRoleVo> page) {
return this.baseMapper.selectUserListPage(page);
}
}
5、mapper层
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.FyUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lqf.multitable.bean.crm.UserRoleVo;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Mapper 接口
*/
@Repository
public interface FyUserMapper extends BaseMapper<FyUser> {
@Select("SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id")
List<UserRoleVo> selectUserListPage(Page<UserRoleVo> pagination);
}
6、测试结果
==> Preparing: SELECT COUNT(1) FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id
==> Parameters:
<== Columns: COUNT(1)
<== Row: 391
==> Preparing: SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10
==> Parameters:
<== Columns: user_id, create_time, update_time, username, password, realname, sex, mobile, password_md5, parent_id, status, auth_area, auth_city, role, residue_card_number, last_login_time, last_login_ip, last_login_count, auth_channel, internet, gold_coin, id, status_id, create_time, update_time, role_name, role_value, addible_value
********* 这里是查询到的信息,有隐私就不打印了
<== Total: 10
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@63c12e52]
com.baomidou.mybatisplus.extension.plugins.pagination.Page@5d2828c9
Time:61 ms - ID:com.lqf.multitable.dao.crm.FyUserMapper.selectUserListPage
Execute SQL:SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10
测试结果可以看出,总查询条数391条,分页后查询limit 0,10, 查询耗时 61ms。
原文链接:https://blog.csdn.net/m0_37034294/article/details/82935436
作者:「青蛙与大鹅」
来源:CSDN