Mybatis的升级版

首先说一下这个Mybatis-plus他自己集成了所有的CRUD方法,所以我们先简单的写一个小测试:

启动类:

package com.example.Demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.Demo.mapper")
public class MybatisPlusStudyApplication {public static void main(String[] args) {SpringApplication.run(MybatisPlusStudyApplication.class, args);}}

Mapper层:只需要继承接口

package com.example.Demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.Demo.pojo.User;
import org.springframework.stereotype.Repository;@Repository
public interface UserMapper extends BaseMapper<User> {}

实体类:

package com.example.Demo.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String name;private Integer age;private String email;
}

测试:

package com.example.Demo;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class MybatisPlusStudyApplicationTests {@Autowiredprivate UserMapper userMapper;@Testvoid contextLoads() {List<User> users = userMapper.selectList(null);users.forEach(System.out::println);}}

配置文件:


server.port=7099
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=rootmybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.id-type=auto
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

测试结果:

需要注意的一个问题:

注意:主启动类扫描所有接口

插入+主键生成策略:

一旦手动写id必须写setid

public enum IdType {AUTO(0),//数据库ID自增  NONE(1),//该类型为未设置主键类型      INPUT(2),//用户输入ID//该类型可以通过自己注册自动填充插件进行填充  //以下3种类型、只有当插入对象ID 为空,才自动填充。     ID_WORKER(3),//全局唯一ID (idWorker)      UUID(4),//全局唯一ID (UUID)          ID_WORKER_STR(5);//字符串全局唯一ID (idWorker 的字符串表示)    

CRUD操作:

package com.example.Demo;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class MybatisPlusStudyApplicationTests {@Autowiredprivate UserMapper userMapper;/*** 查询测试*/@Testvoid contextLoads() {List<User> users = userMapper.selectList(null);users.forEach(System.out::println);}/*** 测试插入*/@Testpublic  void testInstert(){User user = new User();user.setName("邓家佳");user.setEmail("2534625115@qq.com");user.setAge(3);int result = userMapper.insert(user);System.out.println(result);System.out.println(user);}/*** 测试更新*/@Testpublic  void  TestUpdate(){User user = new User();user.setId(9L);user.setName("范涛之");int i = userMapper.updateById(user);System.out.println(i);}}

自动填充

1:首先,新建字段写好注解:

package com.example.Demo.pojo;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.omg.CORBA.IDLType;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {/*** 第一个注解:逐渐自增*/@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;/*** 第二个注解:自动插入数据*/@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;}

2:编写处理器:

package com.example.Demo.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;/*** 时间自动填充处理器*/
@Slf4j
@Component
public class MyDataHandler implements MetaObjectHandler {// 插入时的填充策略@Overridepublic void insertFill(MetaObject metaObject) {log.info("开始执行插入.........");this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}// 更新时的填充策略@Overridepublic void updateFill(MetaObject metaObject) {log.info("开始执行更新.........");this.setFieldValByName("updateTime",new Date(),metaObject);}}

乐观锁的处理:

1:数据库添加字段默认为1:

实体类增加字段:

3:配置乐观锁插件:

// 注册乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}

测试:乐观锁成功:单一线程

测试:乐观锁失败:

/*** 测试乐观锁失败:多线程*/@Testpublic  void  TestClocker2() {// 线程一://查询用户信息User user = userMapper.selectById(5L);user.setName("kuangshen111");user.setEmail("124621515@qq.com");// 线程二:模拟另外一个用户执行插队操作User user2 = userMapper.selectById(5L);user2.setName("kuangshen222");user2.setEmail("124621515@qq.com");// 自旋锁尝试多次提交userMapper.updateById(user2); //如果没有乐观锁就回覆盖插队线程的值}

查询操作:批量查询

    /*** 查询测试*/@Testpublic void  TestSelect(){List<User> users = userMapper.selectBatchIds(Arrays.asList(5, 6, 7));users.forEach(System.out::println);}

查询:按条件:适用Map

/*** 条件查询*/@Testpublic  void  testTJ(){HashMap<String, Object> map = new HashMap<>();// 自定义查询map.put("name","邓家佳");List<User> users = userMapper.selectByMap(map);users.forEach(System.out::println);}

分页查询:

1:配置分页插件:

    // 分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false// paginationInterceptor.setOverflow(false);// 设置最大单页限制数量,默认 500 条,-1 不受限制// paginationInterceptor.setLimit(500);return paginationInterceptor;}

2:直接使用Page对象

    /*** 分页查询*/@Testpublic  void  TestPage(){// 参数一:当前页  参数二:页面大小Page<User> page = new Page<>(1,4);userMapper.selectPage(page,null);page.getRecords().forEach(System.out::println);}

删除操作:根据ID删除

  /*** 删除操作:*/@Testpublic void testDeleteById(){userMapper.deleteById(12L);}/*** 批量删除通过id*/public  void testDeleteByBatchId(){userMapper.deleteBatchIds(Arrays.asList(5L,8L,9L));}/*** 条件删除*/*/public  void testDeleteByMap(){HashMap<String, Object> map = new HashMap<>();map.put("name","哈哈哈");userMapper.deleteByMap(map);}

逻辑删除:

1:数据库中增加字段:

2:实体类增加属性:

  /*** 逻辑删除*/@TableLogicprivate  Integer deleted;

3:配置组件:

  // 逻辑删除组件@Beanpublic ISqlInjector sqlInjector() {return new LogicSqlInjector();}

配置文件的修改:

# 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

测试:

性能分析插件

1:增加插件:

    /*** SQL 执行性能分析插件* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长*/@Bean@Profile({"dev","test"})// 设置 dev test 环境开启public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行performanceInterceptor.setFormat(true);return performanceInterceptor;}

配置文件增加:spring.profiles.active=dev

条件构造器:Wrapper 六个测试

手写一些复杂sql

package com.example.Demo;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;
import java.util.Map;@SpringBootTest
public class WrapperTest {@Autowiredprivate UserMapper userMapper;/*** 测试一:查询name不为空并且邮箱不为空的用户 ,同时年龄大于等于12岁*/@Testvoid  TestWr(){QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.isNotNull("name").isNotNull("email").ge("age",12);userMapper.selectList(wrapper).forEach(System.out::println);  //和我们学习的map对比一下}/*** 测试二:名字等于范涛之的*/@Testvoid test2(){QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","范涛之");User user = userMapper.selectOne(wrapper);System.out.println(user);}/*** 测试三:查询年龄在20-30岁之间的用户*/@Testvoid test3(){QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.between("age",20,30);Integer count = userMapper.selectCount(wrapper);//查询结果数System.out.println(count);}/*** 测试四:模糊查询:名字里面不包含范的*/@Testvoid test4(){QueryWrapper<User> wrapper = new QueryWrapper<>();// 左和右:百分号在哪边 这个就相当于:t%也就是t开头wrapper.notLike("name","范").likeRight("email","t");List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);maps.forEach(System.out::println);}/*** 测试五:子查询*/@Testvoid test5(){QueryWrapper<User> wrapper = new QueryWrapper<>();// id在子查询中查出来wrapper.inSql("id","select id from user where id<3");List<Object> objects = userMapper.selectObjs(wrapper);objects.forEach(System.out::println);}/*** 测试六:排序:通过id进行排序*/@Testvoid test6(){QueryWrapper<User> wrapper = new QueryWrapper<>();// id在子查询中查出来wrapper.orderByDesc("id");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}}

代码自动生成器:

Mybatis-plus学习-最全细致讲解相关推荐

  1. MyBatis基础学习知识点2

    本文衔接MyBatis基础学习知识点1,继续对以下两个问题进行探讨 1.dao配置文件主要是用来干什么的?如何进行配置? 2.使用测试方法测试程序运行是如何实现的?每条语句起什么作用? 目录 dao配 ...

  2. 【区块链学习最全教程】学习 Solidity,全栈 Web3,Javascript 和区块链开发

    Chainlink 开发者社区发布了一个关于全栈 web3,solidity 和区块链开发的完整视频教程.本视频教程由 Chainlink 开发者大使 Patrick Collins 讲解.教程由浅入 ...

  3. Mybatis的学习笔记

    MyBatis Mybatis是一款非常优秀的持久层框架,学习的目的是要掌握精通. 那么今天我们就来学习一下这个优秀的框架知识! 此外,由于博主的水平的原因,文章的质量可能不会太高,请酌情观看.如果大 ...

  4. 深度学习原理-----全连接神经网络

    系列文章目录 深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网 ...

  5. 藤摇椅游戏道具制作全流程讲解视频教程

    藤摇杆|一个完整的游戏资产工作流程 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 含工程素材 语言:英语+中文字幕(根据原英文字幕机译更准确)+原英文字幕 | ...

  6. 【资源放送】机器学习/深度学习最全公开视频大放送!

    文章首发于微信公众号<有三AI> [资源放送]机器学习/深度学习最全公开视频大放送! 该篇小记一下机器学习与深度学习的一些好的基础视频资源. 如果你是刚入门的小白,建议细细阅读一下下面将要 ...

  7. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

  8. [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP

    上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(五):SpringA ...

  9. Mybatis源码分析: MapperMethod功能讲解

    canmengqian </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> ...

最新文章

  1. Nat. Genet. | 基于遗传学主导的方法定义免疫相关性状的药物靶标
  2. linux模拟树莓派,树莓派使用入门:树莓派上的模拟器和原生 Linux 游戏
  3. matlab中ode45如何设置,matlab 中ode45的源代码如何看懂
  4. 2019 AI Bootcamp·Guangzhou 参会日记
  5. Innodb ibdata数据文件误删,如何恢复
  6. oracle查询不等于1000,解决oracle查询时 in 大于1000的办法
  7. 记一篇使用iframe需要翻阅的帖子
  8. ImportError: IProgress not found. Please update jupyter and ipywidgets.
  9. vue.js2.0视频教程
  10. 高性能MySQL读书笔记——开天辟地
  11. 大众点评产品分析报告
  12. 掘金站内 webpack 优秀文章汇总
  13. 小波变换复习 (Review on Wavelet Transform)
  14. IGBT的驱动功率计算
  15. 四、Sails项目的Api文档——集成Swagger解决方案
  16. mac关闭自动更新提示
  17. hdu 1757(矩阵快速幂)
  18. Tomcat服务器的安装使用
  19. 特斯拉与Uber达成协议,为Uber伦敦司机提供电动汽车
  20. mysql统计数量函数方法_mySql关于统计数量的SQL查询操作

热门文章

  1. Chart.xkcd图表库
  2. MFC图形界面编辑工具
  3. HTML5支持rpx,css小程序的元素尺寸单位px,rpx及rem
  4. ai边缘平滑_如何用PS,将图像边缘线条处理圆滑
  5. 使用echarts画日历热力图
  6. 2010世界杯赛程表 收藏一下
  7. 我的世界php motd,MiniMOTD - 服务器列表带有RGB渐变的MOTD插件[1.12.x-1.16.x]【Bukkit】...
  8. gazebo仿真时在加入差分运动插件后没有cmd_vel话题
  9. pmap anon 内存泄露
  10. 我与学霸的距离计算机,你与学霸的距离,可能就差本笔记