Mybatis-plus学习-最全细致讲解
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);}}
自动填充
创建时间 . 修改时间! 这些个操作都是自动化完成的,我们不希望手动更新!
阿里巴巴开发手册:所有的数据库表:gmt_create .gmt_modified几乎所有的表都要配置上!而且需要自动化!
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);}
逻辑删除:
物理删除:从数据库中直接移除
逻辑删除: 在数据库中没有被移除,而是通过一个变量来让他失效! deleted=0=>deleted=1
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);}}
代码自动生成器:
dao、pojo、service、controller都给我自己去编写完成!
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、
Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
只需要改实体类名字 和包名 还有 数据库配置即可
Mybatis-plus学习-最全细致讲解相关推荐
- MyBatis基础学习知识点2
本文衔接MyBatis基础学习知识点1,继续对以下两个问题进行探讨 1.dao配置文件主要是用来干什么的?如何进行配置? 2.使用测试方法测试程序运行是如何实现的?每条语句起什么作用? 目录 dao配 ...
- 【区块链学习最全教程】学习 Solidity,全栈 Web3,Javascript 和区块链开发
Chainlink 开发者社区发布了一个关于全栈 web3,solidity 和区块链开发的完整视频教程.本视频教程由 Chainlink 开发者大使 Patrick Collins 讲解.教程由浅入 ...
- Mybatis的学习笔记
MyBatis Mybatis是一款非常优秀的持久层框架,学习的目的是要掌握精通. 那么今天我们就来学习一下这个优秀的框架知识! 此外,由于博主的水平的原因,文章的质量可能不会太高,请酌情观看.如果大 ...
- 深度学习原理-----全连接神经网络
系列文章目录 深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网 ...
- 藤摇椅游戏道具制作全流程讲解视频教程
藤摇杆|一个完整的游戏资产工作流程 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 含工程素材 语言:英语+中文字幕(根据原英文字幕机译更准确)+原英文字幕 | ...
- 【资源放送】机器学习/深度学习最全公开视频大放送!
文章首发于微信公众号<有三AI> [资源放送]机器学习/深度学习最全公开视频大放送! 该篇小记一下机器学习与深度学习的一些好的基础视频资源. 如果你是刚入门的小白,建议细细阅读一下下面将要 ...
- mybatis框架--学习笔记(上)
使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...
- [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP
上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(五):SpringA ...
- Mybatis源码分析: MapperMethod功能讲解
canmengqian </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> ...
最新文章
- Nat. Genet. | 基于遗传学主导的方法定义免疫相关性状的药物靶标
- linux模拟树莓派,树莓派使用入门:树莓派上的模拟器和原生 Linux 游戏
- matlab中ode45如何设置,matlab 中ode45的源代码如何看懂
- 2019 AI Bootcamp·Guangzhou 参会日记
- Innodb ibdata数据文件误删,如何恢复
- oracle查询不等于1000,解决oracle查询时 in 大于1000的办法
- 记一篇使用iframe需要翻阅的帖子
- ImportError: IProgress not found. Please update jupyter and ipywidgets.
- vue.js2.0视频教程
- 高性能MySQL读书笔记——开天辟地
- 大众点评产品分析报告
- 掘金站内 webpack 优秀文章汇总
- 小波变换复习 (Review on Wavelet Transform)
- IGBT的驱动功率计算
- 四、Sails项目的Api文档——集成Swagger解决方案
- mac关闭自动更新提示
- hdu 1757(矩阵快速幂)
- Tomcat服务器的安装使用
- 特斯拉与Uber达成协议,为Uber伦敦司机提供电动汽车
- mysql统计数量函数方法_mySql关于统计数量的SQL查询操作
热门文章
- Chart.xkcd图表库
- MFC图形界面编辑工具
- HTML5支持rpx,css小程序的元素尺寸单位px,rpx及rem
- ai边缘平滑_如何用PS,将图像边缘线条处理圆滑
- 使用echarts画日历热力图
- 2010世界杯赛程表 收藏一下
- 我的世界php motd,MiniMOTD - 服务器列表带有RGB渐变的MOTD插件[1.12.x-1.16.x]【Bukkit】...
- gazebo仿真时在加入差分运动插件后没有cmd_vel话题
- pmap anon 内存泄露
- 我与学霸的距离计算机,你与学霸的距离,可能就差本笔记