MyBatis-Plus之简介、快速入门、insert、update
MyBatis-Plus简介
顾名思义,MyBatis-Plus是一个MyBatis的增强工具,是用来简化JDBC操作的,它可以大量节省我们的工作时间,因为所有的CRUD代码它都可以自动化完成,与MyBatis-Plus类似的组件还有JPA、tk-mapper
官网:https://mp.baomidou.com
参考教程:https://mp.baomidou.com/guide
MyBatis-Plus快速入门
参考教程:https://mp.baomidou.com/guide/quick-start.html
步骤:
1、使用MySQL创建数据库mybatis_plus
2、创建user表并加些数据
注:在真实开发中,一般表设计还得有version(乐观锁)、deleted(逻辑删除)、create_time、update_time字段
DROP TABLE IF EXISTS user;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)
);
DELETE FROM user;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、编写项目,初始化一个SpringBoot项目
4、往项目里加入以下依赖
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
<!-- 数据库驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus -->
<!-- mybatis-plus 是自己开发,并非官方的! -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version>
</dependency>
5、在application.properties文件里配置数据库连接信息
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注:如果spring.datasource.url后面不加“&serverTimezone=GMT%2B8”会出现如下异常
6、编写相关测试代码
pojo层:
package com.ue.pojo;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String name;private Integer age;private String email;
}
mapper接口层:
package com.ue.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ue.pojo.User;
import org.springframework.stereotype.Repository;/*** 在对应的Mapper上面继承基本的类BaseMapper,* 继承后所有的CRUD操作都已经编写完成了,不需要像以前一样写一大堆配置文件* @Author LiJun* @Date 2020/07/21* @Time 16:23*/
@Repository
public interface UserMapper extends BaseMapper<User> {}
注:需要在主启动类上去扫描mapper包下的所有接口
然后在测试类里进行测试:
package com.ue;import com.ue.mapper.UserMapper;
import com.ue.pojo.User;
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.SpringJUnit4ClassRunner;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MybatisPlusApplication.class)
public class MybatisPlusApplicationTests {//继承了BaseMapper后所有的方法都来自父类,但也可以编写自己的扩展方法@Autowiredprivate UserMapper userMapper;@Testpublic void queryAll(){//查询全部用户,参数是一个Wrapper(条件构造器)List<User> users = userMapper.selectList(null);users.forEach(System.out::println);}
}
测试结果如下:
MyBatis-Plus日志配置
目前所有的SQL是不可见的,如果希望知道它是怎么执行的,需要配置日志输出:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
对MyBatis-Plus新增操作的分析
- 测试代码如下:
@Test
public void testInsert(){User user = new User();user.setAge(18);user.setEmail("635275@qq.com");user.setName("哈利油");System.out.println(userMapper.insert(user));System.out.println(user);
}
测试结果如下:
- MyBatis-Plus的主键生成策略
注:使用AUTO策略时需要在数据库设置主键自增
分布式系统唯一id生成方案
对Mybatis-Plus修改操作的分析
- 测试代码如下:
@Test
public void testUpdate(){User user = new User();user.setAge(18);user.setEmail("635275@qq.com");user.setId(1L);System.out.println(userMapper.updateById(user));
}
测试结果如下:
- MyBatis-Plus的自动填充策略
使用场景:对表里创建时间、修改时间字段的维护一般都是自动化完成的,我们不希望手动去更新
自动填充方式一:数据库级别的操作(不推荐)
在表里给创建时间、修改时间加上默认值,使之自动填充:
自动填充方式二:代码级别的操作
先在实体类的属性上加上以下注解:
然后编写处理器来处理这个注解:
package com.ue.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;/*** 处理自动填充的处理器* @author LiJun* @Date 2020年07月22日* @Time 17:42*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill.....");this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill.....");this.setFieldValByName("updateTime",new Date(),metaObject);}
}
最后测试插入跟更新,观察数据库里的时间字段即可
- MyBatis-Plus的乐观锁机制
在面试的过程中,经常会被问到乐观锁、悲观锁,这个其实非常简单:乐观锁:顾名思义十分乐观,它总是认为不会出现问题,无论干什么都不会上锁,如果出现问题,则再次更新值悲观锁:顾名思义十分悲观,它总是认为会出现问题,无论干什么都会上锁,然后再操作
Mybatis-Plus里面就用到了乐观锁机制,其实现方式如下:
- 更新前取出记录,获取当前version(版本号)
- 更新时,带上这个version
- 执行更新时,set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
测试Mybatis-Plus乐观锁机制步骤如下:
给数据库中增加version字段
在实体类加上对应的字段以及注解
写配置类注册乐观锁组件
package com.ue.config;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** @author LiJun* @Date 2020年07月22日* @Time 18:58*/
@MapperScan("com.ue.mapper")
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {//注册乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor(){return new OptimisticLockerInterceptor();}
}
进行测试
//测试乐观锁成功
@Test
public void testOptimisticLocker(){//1、查询用户信息User user = userMapper.selectById(2L);//2、修改用户信息user.setName("TOM");user.setEmail("145736525@qq.com");//3、执行更新操作userMapper.updateById(user);
}//测试乐观锁失败(多线程下)
@Test
public void testOptimisticLocker2(){//线程1User user = userMapper.selectById(3L);user.setName("刘备111");user.setEmail("746382455@qq.com");//模拟另外一个线程2执行插队操作User user2 = userMapper.selectById(3L);user2.setName("刘备222");user2.setEmail("9458473345@qq.com");userMapper.updateById(user2);//如果没有乐观锁就会覆盖插队线程的值userMapper.updateById(user);
}
测试结果如下:
MyBatis-Plus之简介、快速入门、insert、update相关推荐
- MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
Mybatis简介 原始jdbc操作(查询数据) Connection connection = null;PreparedStatement preparedStatement = null;Res ...
- 【MyBatis】第一章 快速入门
第一章 快速入门 文章目录 第一章 快速入门 一.介绍 1.使用 JDBC 的缺陷 2.MyBatis 框架解决的主要问题 二.入门案例 1.准备数据库 2.创建实体类 3.创建持久层 DAO 接口 ...
- mybatis学习笔记——mybatis-plus快速入门
一.快速入门 MyBatis-plus (简称mp)是一款 Mybatis 增强工具,用来简化开发.增强效率.本文结合Spring Boot来实现mp的快速入门. 注:本文演示mp版本为当前最新的3. ...
- javaee互联网轻量级框架整合开发_整合MyBatis的关键点及快速入门
对于从事Web应用开发人员,Java EE平台如今已经成为电信.金融.电子商务.保险.证券等各行业的大型应用系统的首选开发平台.在企业级应用的开发选择上,.NET已趋式微,PHP通常只用于开发一些企业 ...
- Zookeeper简介/快速入门——特别详细
ZooKeeper是一个集中的服务,用于维护配置信息.命名.提供分布式同步和提供组服务.所有这些类型的服务都以某种形式被分布式应用程序使用.每次它们被实现时,都会有大量的工作来修复不可避免的错误和竞争 ...
- 运动控制器编程_快速入门 | 篇二十一:运动控制器ZHMI组态编程简介一
点击上方"正运动小助手",随时关注新动态! 运动控制器ZHMI组态编程简介一 今天我们来学习一下,运动控制器的ZHMI组态编程简介.本文主要从产品概述.控制器连接触摸屏使用.HM ...
- Html与CSS快速入门01-基础概念
Web前端技术一直是自己的薄弱环节,经常为了调节一个简单的样式花费大量的时间.最近趁着在做前端部分的开发,果断把这部分知识成体系的恶补一下.内容相对都比较简单,很类似工具手册的学习,但目标是熟练掌握. ...
- 联邦学习框架 FederatedScope(1)快速入门
新鲜出炉的框架--两个月,暂时没什么教程,全程跟着官方文档走. 框架与文档可能存在一点小问题,以后肯定会改进,一切以当下事实为准. 文章目录 简介 快速入门 下载安装 文档的坑 安装依赖时 独立模式运 ...
- MyBatis 01 快速入门
MyBatis 01 快速入门 文章目录 MyBatis 01 快速入门 一.学习目标 二.为什么需要框架技术 三.框架技术介绍 四.主流框架介绍 五.持久化与ORM 六.MyBatis简介 七.搭建 ...
最新文章
- 容器使用之vector
- mxnet统计运算量
- GridView如何设置View的初始样式
- 腾讯开源软件镜像站上线
- P2114-[NOI2014]起床困难综合症【位运算】
- 解决:-bash: unzip: command not found (Linux 中 unZip/Zip 的安装及使用)
- 和与余数的和同余理解_余数与同余解析
- pythonmysqlconnector_python操作mysql——mysql.connector
- bzoj 1059: [ZJOI2007]矩阵游戏(二分匹配)
- python双向链表以及双向循环链表
- 在ASP.NET中获取参数POST和GET方式提交的参数
- js去掉url中的域名
- java+poodle漏洞修复_SSLv3 Poodle攻击漏洞检测工具
- 1034-乘积小于 K 的子数组
- JS-函数进阶笔记二次总结
- android rom包修改工具,自己修改安卓的ROM包(非官方) | 寒山烟雨
- Python中rect属性
- modelzoo,WDSR模型训练脚本问题
- java snakeyaml_JAVA使用SnakeYAML解析与序列化YAML
- 在github/gitlab上下载单个文件