Mybatis-Plus入门学习
Mybatis-Plus学习
一、简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
润物无声
只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
效率至上
只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。
丰富功能
热加载、代码生成、分页、性能分析等功能一应俱全。
二、创建并初始化数据库
2.1、创建数据库
mybatis_plus
2.2、创建user表
其对应的数据库 Schema 脚本如下:
CREATE TABLE USER``(`` id BIGINT(20)NOT NULL COMMENT '主键ID',`` NAME VARCHAR(30)NULL DEFAULT NULL COMMENT '姓名',`` age INT(11)NULL DEFAULT NULL COMMENT '年龄',`` email VARCHAR(50)NULL DEFAULT NULL COMMENT '邮箱',`` PRIMARY KEY (id)``);
其对应的数据库 Data 脚本如下:
INSERT INTO user (id, name, age, email)VALUES``(1, 'Jone', 18, 'test1@baomidou.com'),``(2, 'Jack', 20, 'test2@baomidou.com'),``(3, 'Tom', 28, 'test3@baomidou.com'),``(4, 'Sandy', 21, 'test4@baomidou.com'),``(5, 'Billie', 24, 'test5@baomidou.com');
三、初始化工程
3.1、引入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--lombok用来简化实体类--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>
3.2、编写配置
在 application.properties 配置文件中添加 MySQL 数据库的相关配置:
spring boot 2.0(内置jdbc5驱动)
#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring boot 2.1及以上(内置jdbc8驱动)
注意:driver和url的变化
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=root
注意:
1、这里的 url 使用了 ?serverTimezone=GMT%2B8 后缀,因为8.0版本的jdbc驱动需要添加这个后缀,否则运行测试用例报告如下错误:
java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more
2、这里的 driver-class-name 使用了 com.mysql.cj.jdbc.Driver ,在 jdbc 8 中 建议使用这个驱动,否则运行测试用例的时候会有 WARN 信息
3.3、启动类
在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹
@SpringBootApplication
@MapperScan("com.atguigu.demomptest.mapper")
public class DemomptestApplication {public static void main(String[] args) {SpringApplication.run(DemomptestApplication.class, args);}}
3.4、编写实体类
创建包 entity 编写实体类 User.java(此处使用了 Lombok 简化代码)
@Data
public class User {private Long id;private String name;private Integer age;private String email;
}
3.5、 添加mapper
@Repository
public interface UserMapper extends BaseMapper<User> {}
3.6、测试
添加测试类,进行功能测试:
@SpringBootTest
class DemomptestApplicationTests {@Autowiredprivate UserMapper userMapper;/*** 查询全部用户*/@Testvoid findAll() {// 查询全部用户(里面的参数是筛选条件,可不选)List<User> users = userMapper.selectList(null);System.out.println(users);}
}
注意:
IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。
为了避免报错,可以在 dao 层 的接口上添加 @Repository 注
通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!
查看控制台输出:
3.7、查看sql日志输出
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
四、主键策略
1、插入操作
//添加
@Test
public void testAdd() {User user = new User();user.setName("lucy");user.setAge(20);user.setEmail("1243@qq.com");int insert = userMapper.insert(user);System.out.println(insert);
}
注意:数据库插入id值默认为:全局唯一id
2、MP的主键策略
2.1、ASSIGN_ID
MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
雪花算法:分布式ID生成器
雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
核心思想:
长度共64bit(一个long型)。
首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
2.2、AUTO自增策略
需要在创建数据表的时候设置主键自增
实体字段中配置 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;
要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
五、自动填充和乐观锁
1、更新操作
注意:update时生成的sql自动是动态sql:UPDATE user SET age=? WHERE id=?
//修改
@Test
public void testUpdate() {User user = new User();user.setId(1340868235401764865L);user.setName("lucymary");int count = userMapper.updateById(user);System.out.println(count);
}
2、自动填充
需求描述:
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作
2.1、数据库修改
在User表中添加datetime类型的新的字段 create_time、update_time
2.2、实体类修改
实体上增加字段并添加自动填充注解
@TableField(fill = FieldFill.INSERT)
private Date createTime; //create_time@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; //update_time
1.3实现元对象处理器接口
注意:不要忘记添加 @Component 注解
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {//mp执行添加操作,这个方法执行@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}//mp执行修改操作,这个方法执行@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime",new Date(),metaObject);}
}
3、乐观锁
适用场景
**主要适用场景:**当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
乐观锁实现方式:
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
接下来介绍如何在Mybatis-Plus项目中,使用乐观锁:
4、乐观锁实现流程
4.1、修改实体类
/*** 乐观锁version* 更新时version会自动加一*/
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
4.2、创建配置文件
创建包config,创建文件MybatisPlusConfig.java
此时可以删除主类中的 @MapperScan 扫描注解
@Configuration
@MapperScan("com.atguigu.demomptest.mapper")
public class MpConfig {/*** 乐观锁插件*/@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}
}
六、查询与分页
1、查询
1.1、通过多个id批量查询
完成了动态sql的foreach的功能
//多个id批量查询
@Test
public void testSelect1() {List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));System.out.println(users);
}
1.2、简单的条件查询
通过map封装查询条件
注意:map中的key对应数据库中的列名。如:数据库user_id,实体类是userId,这时map的key需要填写user_id
//简单条件查询
@Test
public void testSelect2() {Map<String, Object> columnMap = new HashMap<>();columnMap.put("name","Jack");columnMap.put("age",20);List<User> users = userMapper.selectByMap(columnMap);System.out.println(users);
}
2、分页
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能
添加分页插件
配置类中添加@Bean配置
/*** 分页插件*/
@Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}
测试分页功能
//分页查询
@Test
public void testSelectPage() {Page<User> page = new Page(1,3);Page<User> userPage = userMapper.selectPage(page, null);//返回对象得到分页所有数据long pages = userPage.getPages(); //总页数long current = userPage.getCurrent(); //当前页List<User> records = userPage.getRecords(); //查询数据集合long total = userPage.getTotal(); //总记录数boolean hasNext = userPage.hasNext(); //下一页boolean hasPrevious = userPage.hasPrevious(); //上一页System.out.println(pages);System.out.println(current);System.out.println(records);System.out.println(total);System.out.println(hasNext);System.out.println(hasPrevious);
}
七、删除与逻辑删除
1、删除
/*** 根据id删除用户(物理删除)*/
@Test
public void testDeleteById(){int result = userMapper.deleteById(5L);System.out.println(result);
}/*** 批量删除*/
@Test
public void testMultipleDelete(){int i = userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));System.out.println(i);
}/*** 简单的条件删除*/
@Test
public void testDeleteByMap(){// 第二个参数要用对象Map<String, Object> map = new HashMap<>();map.put("age",20);map.put("name","可爱发");int i = userMapper.deleteByMap(map);System.out.println(i);
}
2、逻辑删除
2.1、物理删除与逻辑删除
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
逻辑删除的使用场景:
可以进行数据恢复
有关联数据,不便删除
2.2、逻辑删除实现流程
数据库修改
实体类修改
@TableLogic
private Integer deleted;
配置(可选)
application.properties 加入以下配置,此为默认值,如果你的默认值和mp默认的一样,该配置可无
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
测试
测试后发现,数据并没有被删除,deleted字段的值由0变成了1
测试后分析打印的sql语句,是一条update
注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作
@Test
public void testLogicDelete() {int result = userMapper.deleteById(1L);system.out.println(result);
}
MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断
八、条件构造器和常用接口
1、Wrapper介绍
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper(主要用的) : 查询条件封装
UpdateWrapper : Update 条件封装
AbstractLambdaWrapper : 使用Lambda 语法
LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
2、查询方式
1、查询方式
查询方式 | 说明 |
---|---|
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 + WHERE 条件 |
and | AND 语句,拼接 + AND 字段=值 |
andNew | AND 语句,拼接 + AND (字段=值) |
or | OR 语句,拼接 + OR 字段=值 |
orNew | OR 语句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 内容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last(“LIMIT 1”) |
3、测试
ge、gt、le、lt、isNull、isNotNull
@Test
public void testQuery() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNull("name").ge("age", 12).isNotNull("email");int result = userMapper.delete(queryWrapper);System.out.println("delete return count = " + result);
}
eq、ne
注意:seletOne()返回的是一条实体记录,当出现多条时会报错
@Test
public void testSelectOne() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "Tom");Useruser = userMapper.selectOne(queryWrapper);//只能返回一条记录,多余一条则抛出异常System.out.println(user);
}
between、notBetween
包含大小边界
@Test
public void testSelectCount() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.between("age", 20, 30);Integer count = userMapper.selectCount(queryWrapper); //返回数据数量System.out.println(count);
}
like、notLike、likeLeft、likeRight
selectMaps()返回Map集合列表,通常配合select()使用
@Test
public void testSelectMaps() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("name", "age").like("name", "e").likeRight("email", "5");List<Map<String, Object>>maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表maps.forEach(System.out::println);
}
orderBy、orderByDesc、orderByAsc
@Test
public void testSelectListOrderBy() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("age", "id");List<User>users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
Mybatis-Plus入门学习相关推荐
- 1、MyBatis框架入门学习CRUD
文章目录 框架前言 名词辨析 JavaWeb阶段回顾 框架介绍 ORM框架 MyBatis简介 MyBatis入门案例 1.环境准备 2.新建普通Maven项目,导入依赖 3.MyBatis核心配置文 ...
- (转)MyBatis框架的学习(二)——MyBatis架构与入门
http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图: 下面作简要概述: ...
- mybatis入门学习之环境的搭建——helloworld
Mybatis框架环境的搭建 首先,我是一名走java后端的大二菜鸟,我写博客一方面是用来记录我学习中遇到的问题,另一方面是希望和更多的人分享经验.如果我写的内容有不严谨的地方,还请大佬们纠正一下. ...
- MyBatis入门学习(二)
在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...
- MyBatis入门学习教程
MyBatis入门学习教程 1. MyBatis 原生使用入门篇 1.1 什么是MyBatis? 1.2 原生使用安装方法 1.3 使用示例 1.3.1 创建一个学习项目 1.3.1 添加依赖 1.3 ...
- MyBatis学习总结(1)——MyBatis快速入门
2019独角兽企业重金招聘Python工程师标准>>> 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所 ...
- MyBatis学习笔记(一)——MyBatis快速入门
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...
- c++框架有哪些_Java Mybatis框架入门教程_v20200726
MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...
- Java入门学习注意事项有哪些?
想要学好java技术,做好学习规划路线和注意事项是非常重要的,尤其是零基础学员,Java涉及到的知识点非常多,我们需要制定合理的Java学习路线图,这样会事半功倍,下面小编和大家总结一下Java入门学 ...
- Mybatis底层原理学习(二):从源码角度分析一次查询操作过程
在阅读这篇文章之前,建议先阅读一下我之前写的两篇文章,对理解这篇文章很有帮助,特别是Mybatis新手: 写给mybatis小白的入门指南 mybatis底层原理学习(一):SqlSessionFac ...
最新文章
- CentOS7之新建用户与SSH登陆
- 【网页前端设计Front end】JavaScript教程.下(看不懂你来打我)
- 通过案例对 spark streaming 透彻理解三板斧之一: spark streaming 另类实验
- 类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类
- python旅游推荐系统_如何用Python搭建一个简单的推荐系统?
- Python 2.x 与Python 3.x的差别总结
- 基于 Webpack2、Vue2、iView2 的可视化脚手架 iView Cli 发布 2.0 版本
- zz backgroundworker C#
- 海阔凭鲲跃 天高任鹏飞——从一场大赛看华为云的鲲鹏之“智”
- 前端开发常用网站整理
- 使用JAVA开发连连看游戏
- Java 中国大陆身份证处理
- ansys安装注意事项
- C++:乱码之字符串编码
- 【职场心路】一个老DBA的自白
- ipv6 dns修改方法
- PADS学习之路09-PADS LOGIC创建原理图工程文件
- Nginx到底能干嘛?!Nginx是做什么用的?通俗易懂,前端必看!
- Redis的Java客户端之Jedis(Jedis)
- css学习笔记-盒子的样式