文章目录

  • Mbatis-Plus 学习笔记
    • 一、基本架构
    • 二、查询方法
      • 2.1、构造条件查询
      • 2.2、嵌入sql查询
      • 2.3、分组查询
      • 2.4、只返回一条数据
      • 2.5、返回指定列数据
      • 2.6、在字段上加上查询实体作为条件
      • 2.7、lambda方式构造查询条件
      • 2.8、分页条件查询
      • 2.9、自定义查询方法
    • 三、更新方法
      • 3.1、基础更新
      • 3.2、传入实体并更新
      • 3.3、快速修改
      • 3.4、lambda的方式修改
    • 四、删除方法
      • 4.1、基础删除
      • 4.2、根据查询条件来删除
      • 4.3、lambda的方式删除
    • 五、添加方法
      • 5.1、基本添加方法
      • 5.2、批量添加方法
    • 六、其他模式
      • 6.1、AR模式
      • 6.2、主键策略
      • 6.3、通用service层
        • **MybatisPlus进阶篇请看:**

Mbatis-Plus 学习笔记

一、基本架构

<!-- mybatis-plus 整合springboot -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1.tmp</version>
</dependency>

启动类:

@SpringBootApplication
// 扫描 mapper 所在的类
@MapperScan(value = "cn.mesmile.mybatisplusdemo.mapper")
public class MybatisplusDemoApplication {public static void main(String[] args) {SpringApplication.run(MybatisplusDemoApplication.class, args);}}

实体类:

@Data
@TableName("user")
public class User extends Model<User> {/***  IdType.AUTO  数据库id 自增*  IdType.NONE  该类型为未设置主键类型(注解里等于跟随全局),若传入id 则以传入的id为准*  IdType.INPUT 用户输入ID   <p>该类型可以通过自己注册自动填充插件进行填充</p>*//* 以下3种类型、只有当插入对象ID 为空,才自动填充。*     ASSIGN_ID    雪花算法    主键类型为number或string*     ASSIGN_UUID  UUID        string*     局部策略 优于  全局策略*  @TableId   指定主键,若没有 @TableId 指定主键,则默认找到名字叫 id 为主键* */@TableId(type= IdType.NONE)private Long id;/***  insertStrategy = FieldStrategy.NOT_NULL*  配置策略,插入数据的时候,不为空,若为空则不会出现该字段*  *  condition = SqlCondition.LIKE*  实体查询条件,用于实体作为查询条件*/@TableField(condition = SqlCondition.LIKE,insertStrategy = FieldStrategy.NOT_NULL)private String name;private Integer age;private String email;private Date birthday;/*** 映射字段指明 数据库中的列名称*/@TableField(value = "group_name")private String groupName;// 静态字段不会持久化到数据库private static String remark;public static String getRemark() {return remark;}public static void setRemark(String remark) {User.remark = remark;}// 不会持久化到数据@TableField(exist = false)private String ingest;}

mapper类:

/*** 继承 BaseMapper<实体类>*   自动拥有CRUD方法*/
public interface UserMapper extends BaseMapper<User>{}

二、查询方法

测试基本的CRUD:

/*** 基本的CRUD测试*/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisplusDemoApplicationTests {@Autowiredprivate UserMapper userMapper;// 简单查询@Testpublic void testSelect() {// 直接查询的出结果List<User> list = new QueryChainWrapper<User>(userMapper).list();// 两种方式构造查询条件 wrapperQueryWrapper<User> queryWrapper = new QueryWrapper<>();QueryWrapper<User> queryWrapper2 = Wrappers.query();// 这里传入 wrapper 查询条件, 这里也可以传入 null  ,传入null则认为没有限制查询条件List<User> userList = userMapper.selectList(queryWrapper);}}

2.1、构造条件查询

// 通过自带的构造条件查询
// 两种方式构造查询条件 wrapper
// QueryWrapper<User> queryWrapper = new QueryWrapper<>();QueryWrapper<User> queryWrapper2 = Wrappers.query();String testStr = "user";/*构造查询条件like       LIKE '%值%'likeLeft   LIKE '%值'likeRight  LIKE '值%'更多构造查询条件,请看官网                      https://mybatis.plus/guide/wrapper.html#abstractwrapper第一个参数是判断,是否加入到sql条件中*/queryWrapper2.like(StrUtil.isNotEmpty(testStr), "name", testStr).eq(true,"age",18);List<User> users = userMapper.selectList(queryWrapper2);QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();/**  查询 【生日是 2020-03-20 或 年龄大于 28 岁】 并且 【姓名 里面有 ‘%测试%’】*/QueryWrapper<User> birthday = userQueryWrapper.and(wq -> wq.eq("birthday", DateUtil.parse("2020-03-20", "yyyy-MM-dd")).or().gt("age",28)).and(wq -> wq.like("name","测试"));List<User> userList = userMapper.selectList(birthday);

2.2、嵌入sql查询

 // 嵌入sql查询QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();/**  查询生日是 2020-02-01 并且 它的id 等于嵌入sql 查询*/QueryWrapper<User> id = userQueryWrapper// 时间解析,用这种方式两个参数避免了sql注入.apply("date_format(birthday,'%Y-%m-%d')={0}", "2020-02-01")// 这种方式一个参数的时候容易出现 sql 注入风险//.apply("date_format(birthday,'%Y-%m-%d')= '2020-02-01' or true or true")// sql.inSql("id", "select id from user where id = 1236680720026488833");List<User> users = userMapper.selectList(id);

2.3、分组查询

// 分组查询QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();// 查询平均年龄、最小年龄、最大年龄// SELECT avg(age) avg_age,min(age) min_age,max(age) max_age// FROM user GROUP BY group_name HAVING sum(age) > ?QueryWrapper<User> group = userQueryWrapper.select("avg(age) avg_age", "min(age) min_age", "max(age) max_age").groupBy("group_name").having("sum(age) > {0}", 70);List<Map<String, Object>> maps = userMapper.selectMaps(group);

2.4、只返回一条数据

 /**   批量查询   有sql 注入风险*   .last("limit 1")  只返回一条数据*/ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();QueryWrapper<User> age = userQueryWrapper.in("age", Arrays.asList(18, 20, 21,40)).last("limit 1");List<User> users = userMapper.selectList(age);users.forEach(System.out::println);

2.5、返回指定列数据

   /** 只查询出映射的字段  id,name*/QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();QueryWrapper<User> gt = userQueryWrapper.select("id", "name").gt("age", 18);List<User> users = userMapper.selectList(gt);QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();// 返回指定列  SELECT id,name,birthday,group_name FROM userQueryWrapper<User> id = userQueryWrapper.select(User.class, info -> !info.getColumn().equals("age") &&!info.getColumn().equals("email"));List<User> users = userMapper.selectList(id);

2.6、在字段上加上查询实体作为条件

    User whereUser = new User();/**  实体作为查询条件*   @TableField(condition = SqlCondition.LIKE)*   private String name;*   这里就相当于在在对名字进行模糊查询*/whereUser.setName("测试");// 若不在 字段上设置值,默认则为 eqwhereUser.setAge(28);// 将实体作为默认查询条件QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(whereUser);List<User> users = userMapper.selectList(userQueryWrapper);

2.7、lambda方式构造查询条件

  // lambda的方式   这种方法,防止了 误写,三中方式生成 lambdaWrapper
//  LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
//  LambdaQueryWrapper<User> objectLambdaQueryWrapper = Wrappers.<User>lambdaQuery();LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();// 查询 姓名中有 测试 的,年龄 小于 30 的userLambdaQueryWrapper.like(User::getName, "测试").lt(User::getAge, 30).eq(User::getGroupName,"C");List<User> users = userMapper.selectList(userLambdaQueryWrapper);// 这里需要传入 userMapper 对象List<User> users = new LambdaQueryChainWrapper<User>(userMapper).likeLeft(User::getName, "测试").le(User::getAge, 30).list();users.forEach(System.out::println);

2.8、分页条件查询

写分页配置类:

@Slf4j
@Configuration
public class MybatisPlusConfig {/***  mybatis-plus 的配置  分页配置* @return*/@Beanpublic PaginationInterceptor paginationInterceptor() {// 分页插件return new PaginationInterceptor();}}

进行分页查询:

        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();userLambdaQueryWrapper.gt(User::getAge,18).like(User::getName,"测试");// 第 3 个参数 , false 为 不查询总条数 ,默认为 true 为要查询总条数// 第 3 个参数 , 不填写默认为 truePage<User> userPage = new Page<>(1, 3,true);Page<User> result = userMapper.selectPage(userPage, userLambdaQueryWrapper);long current = result.getCurrent();List<User> records = result.getRecords();long size = result.getSize();long total = result.getTotal();long pages = result.getPages();log.info("当前页 {} , 每页显示条数 {} , 总共条数 {} , 总共页数 {}", current, size , total , pages);

2.9、自定义查询方法

public interface UserMapper extends BaseMapper<User> {/***  自定义查询方法* @param wrapper* @return*/// @Select("select * from user ${ew.customSqlSegment}")List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);/***  自定义分页查询方法* @param page* @param wrapper* @return*/Page<User> selectUserPage(Page<User> page, @Param(Constants.WRAPPER)Wrapper<User> wrapper);}

如果要用xml,需要在配置文件中,指定xml地址

# 配置 xml 文件所在位置
mybatis-plus:mapper-locations: classpath*:/mapper/**/*.xml

例xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.mesmile.mybatisplusdemo.mapper.UserMapper"><!--自定义查询方法--><select id="selectAll" resultType="cn.mesmile.mybatisplusdemo.domain.User">select * from user ${ew.customSqlSegment}</select><!--自定义分页查询方法--><select id="selectUserPage" resultType="cn.mesmile.mybatisplusdemo.domain.User">select * from user ${ew.customSqlSegment}</select>
</mapper>

三、更新方法

3.1、基础更新

        // 修改方式一下User user = new User();user.setId(1L);user.setName("test");user.setAge(20);// 传入实体的id 需有值int i = userMapper.updateById(user);

3.2、传入实体并更新

        UpdateWrapper<User> updateWrapper = Wrappers.update();// 构造条件updateWrapper.eq("id", 1L);// 修改参数User user = new User();user.setName("test2");user.setEmail("test@qq.com");// 第一参数是实体,第二个参数是条件int update1 = userMapper.update(user, updateWrapper);

3.3、快速修改

        // 简便修改方式boolean update = new UpdateChainWrapper<User>(userMapper).eq("id", 1L).set("name", "user").update();

3.4、lambda的方式修改

        // lambda 构造条件的方式LambdaUpdateWrapper<User> lambdaUpdateWrapper = Wrappers.lambdaUpdate();LambdaUpdateWrapper<User> world = lambdaUpdateWrapper.eq(User::getId, 1L).set(User::getName, "world");int update = userMapper.update(null, world);// lambda 直接修改boolean hello_world = new LambdaUpdateChainWrapper<User>(userMapper).eq(User::getId, 1L).set(User::getName, "hello world").update();

四、删除方法

4.1、基础删除

  // 删除一条数据int i = userMapper.deleteById(12L);// 批量删除int i = userMapper.deleteBatchIds(Arrays.asList(23, 1237223696960188417L, 89));

4.2、根据查询条件来删除

 HashMap<String, Object> map = new HashMap<>(2);map.put("id" , 1237224478493155329L);map.put("name", "测试一波4");// 多条件之间是 and 的关联,并且每个条件之间值 eq 关系int i = userMapper.deleteByMap(map);

4.3、lambda的方式删除

LambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.lambdaQuery();lambdaQueryWrapper.eq(User::getId, 1237226278776565762L).or().eq(User::getName, "测试一波5");int delete = userMapper.delete(lambdaQueryWrapper);LambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.lambdaQuery();lambdaQueryWrapper.and(info -> info.eq(User::getId, 1237227238806626306L).eq(User::getName, "测试一波5")).or().eq(User::getEmail, "test22@qq.com");int delete = userMapper.delete(lambdaQueryWrapper);

五、添加方法

5.1、基本添加方法

 User user = new User();user.setAge(23);user.setEmail("test@qq.com");int insert = userMapper.insert(user);userService.save(user);

5.2、批量添加方法


userService.saveBatch(Arrays.asList(new User()));

六、其他模式

6.1、AR模式

AR 模式  ① 实体类继承 Model   ② 继承 BaseMapper
@TableName("user")
public class User extends Model<User> {}

AR模式的基本使用:

User user = new User();user.setAge(23);user.setEmail("test@qq.com");user.setName("测试一波5");user.setIngest("sdfasdf");user.setBirthday(new Date());user.setGroupName("C");User.setRemark("dsfajsklfja");// 实体类直接调用方法boolean insert = user.insert();// 单例模式User user1 = user.selectById(1237245719815929858L);// 插入或者保存boolean insertOrUpdate = user.insertOrUpdate();

6.2、主键策略

   /***  IdType.AUTO  数据库ID自增*  IdType.NONE  该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)*  IdType.INPUT 用户输入ID   <p>该类型可以通过自己注册自动填充插件进行填充</p>*//** 以下2种类型、只有当插入对象ID 为空,才自动填充。*     ASSIGN_ID    雪花算法    主键类型为number或string*     ASSIGN_UUID  UUID        string*     局部策略 优于  全局策略*  @TableId   指定主键,若没有 @TableId 指定主键,则默认找到名字叫 id 为主键* */@TableId(type= IdType.NONE)private Long id;

在springboot中的配置:

# 配置全局的 主键策略,默认为 ASSIGN_ID 默认为 【雪花算法】
mybatis-plus:global-config:db-config:id-type: assign_id# 开启驼峰命名 默认开启驼峰命名configuration:map-underscore-to-camel-case: true

配置全局的表名前缀:

# 配置全局的表名前缀
mybatis-plus:global-config:db-config:table-prefix: xx_

6.3、通用service层

service层:

public interface UserService extends IService<User> {}

service实现层:

@Transactional(rollbackFor = Exception.class, propagation = Propagation.SUPPORTS, readOnly = true)
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}

通用service的通用层基本方法:

 // lambda 方式查询List<User> list = userService.lambdaQuery().gt(User::getAge, 25).list();// lambda方式修改boolean update = userService.lambdaUpdate().eq(User::getAge, 23).set(User::getAge, 25).update();

MybatisPlus进阶篇请看:

Mybatis-Plus进阶之扩展插件

Mbatis-Plus整合springboot详细学习笔记相关推荐

  1. SpringBoot整合第三方技术学习笔记(自用)

    SpringBoot整合第三方技术学习笔记 搬运黑马视频配套笔记 KF-4.数据层解决方案 KF-4-1.SQL 回忆一下之前做SSMP整合的时候数据层解决方案涉及到了哪些技术?MySQL数据库与My ...

  2. 8. SpringBoot基础学习笔记

    SpringBoot基础学习笔记 课程前置知识说明 1 SpringBoot基础篇 1.1 快速上手SpringBoot SpringBoot入门程序制作 1.2 SpringBoot简介 1.2.1 ...

  3. 重要性采样(Importance Sampling)详细学习笔记

    重要性采样(Importance Sampling)详细学习笔记 文章目录 重要性采样(Importance Sampling)详细学习笔记 前言: 参考主体: on-policy 和 off-pol ...

  4. 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)

    Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...

  5. 【SpringBoot】最新版2019Spring Boot配置解析,源码解析(速成SpringBoot)——学习笔记版【2】

    SpringBoot配置文件 文章目录 SpringBoot配置文件 四.配置文件 1.简介 2.YAML用法 2.1 简介 2.2语法 3.为属性注入值 3.1使用.yml配置文件 3.1编写.ym ...

  6. Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)

    所有示例使用的数据表均为Oracle提供的SQL基础数据表(t_employees.sql dept.sql emp.sql salgrade.sql) 熟练掌握多多练习即可达到完成后端开发所需具备的 ...

  7. 陈宝林《最优化理论与算法》超详细学习笔记 (八)————最优性条件

    陈宝林<最优化理论与算法>超详细学习笔记 (八)----最优性条件 无约束问题的极值条件 必要条件 二阶充分条件 充要条件 约束极值问题的最优性条件 不等式约束的一阶最优性条件 无约束问题 ...

  8. 陈宝林《最优化理论与算法》超详细学习笔记 (七)————第五章 运输问题

    陈宝林<最优化理论与算法>超详细学习笔记 (七)----第五章 运输问题 第1节 运输问题的数学模型 第2节 表上作业法 2.1 确定初始基可行解 2.2 最优解的判别 2.3 改进的方法 ...

  9. 陈宝林《最优化理论与算法》超详细学习笔记 (四)————第四章 对偶理论

    陈宝林<最优化理论与算法>超详细学习笔记 (四)----第四章 对偶理论 1. 对偶问题的提出 2. 线性规划的对偶理论 2.1 原问题与对偶问题的关系 2.2 对偶问题的基本性质 3. ...

最新文章

  1. Python的WeRoBot框架开发公众号
  2. 机器学习:协方差矩阵
  3. 大掌柜商业管理系统服务器地址,大掌柜软件通用版操作说明.doc
  4. 聊一聊js中的null、undefined与NaN
  5. sdut-3102小鑫追女神
  6. oracle redo删除,意外删除redo的恢复
  7. Longest k-Good Segment CodeForces - 616D(尺取法)
  8. 洛谷P1346-电车【日常图论,最短路,SPFA】
  9. 【CodeForces - 278C 】Learning Languages(并查集,思维)
  10. dalvik.system.PathClassLoader[DexPathList[[zip file /data/app/comda.xfdsafda.activdity-1/base.apk]
  11. php必填参数校验,laravel请求参数校验方法
  12. 《HTTP权威指南》读书笔记---HTTP概述
  13. Python url的编码转换
  14. 计算机文化与计算机技术有什么区别,什么是计算机文化?
  15. 2015QS世界大学排名-[转]
  16. Android启动模式分析
  17. supervisor 管理后台进程
  18. 新唐NUC980使用记录:自制开发板(基于NUC980DK61YC)
  19. xingtai -飞机大战2。0
  20. 一次不常见的等待事件:RECO进程enq: DR - contention

热门文章

  1. 关于个人数据泄露通知的示例 Published by EDPB
  2. nginx 实现根据访问端跳转指定页面
  3. Revit初试水之点击按钮打开网页
  4. 160809310袁韬淳
  5. c语言第一行include,[C语言]为什么要有include?——从Hello World说起
  6. springboot 做表白墙_基于微信云开发 SayLove 表白墙微信小程序V1.0
  7. 收好了!来自摩根大通的算法交易机器学习指南
  8. ACM中java的使用(各种比赛中)
  9. microbit题目和规范文档
  10. win32模态与非模态对话框