使用mybatis plus 操作数据库
mybatis plus 是基于mybatis 的一个增强包,比 mybatis 更加容易使用。
特点:
1.分页支持
2.支持自定义查询。
3.简单的情况下,不需要写map.xml 文件
4.支持租户过滤
下面介绍一下 它的使用方法
1.引入jar包。
在 pom.xml 增加
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2.配置使用数据源
spring:
datasource:
url: jdbc:mysql://localhost:3306/wuxianji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
max-pool-prepared-statement-per-connection-size: 20
filters: stat,wall
use-global-data-source-stat: true
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 配置监控服务器
stat-view-servlet:
login-username: admin
login-password: 123456
reset-enable: false
url-pattern: /druid/*
# 添加IP白名单
#allow:
# 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
#deny:
web-stat-filter:
# 添加过滤规则
url-pattern: /*
# 忽略过滤格式
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
这里我们使用 druid 作为数据源
3.配置 mybatis plus
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
refresh: true # 刷新xml文件
db-config:
logic-delete-value: 1 #默认值1
logic-not-delete-value: 0 #默认值0
这里指定了mapper xml 文件的位置。
4. 创建mybatis plus 配置java 文件
package com.example.config; import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.core.parser.ISqlParser;
import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
import net.sf.jsqlparser.expression.LongValue;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue; import java.util.ArrayList;
import java.util.List; @Configuration
@MapperScan("com.example.demo.dao")
public class MybatisPlusConfig { @Bean
public PerformanceInterceptor performanceInterceptor(){
return new PerformanceInterceptor();
} @Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
} /**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor= new PaginationInterceptor(); List<ISqlParser> sqlParserList = new ArrayList<>();
TenantSqlParser tenantSqlParser = new TenantSqlParser();
tenantSqlParser.setTenantHandler(new TenantHandler() {
@Override
public Expression getTenantId() {
return new LongValue(1L);
} @Override
public String getTenantIdColumn() {
return "tenant_id";
} @Override
public boolean doTableFilter(String tableName) {
// 这里可以判断是否过滤表 if ("User_".equals(tableName)) {
return true;
}
return false;
}
});
sqlParserList.add(tenantSqlParser);
paginationInterceptor.setSqlParserList(sqlParserList);
return paginationInterceptor;
}
}
这里支持性能分析,逻辑删除,租户过滤,物理分页。
5.下面以一个操作一个用户表为例,介绍一下 具体的用法。
5.1 创建一个用户表
CREATE TABLE `user_` (
`id_` bigint(11) NOT NULL DEFAULT '',
`name_` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(100) DEFAULT NULL,
`isDelete` int(11) DEFAULT NULL,
PRIMARY KEY (`id_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5.2 创建对应的User.java类
package com.example.demo.model; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName; @TableName(value = "User_")
public class User { @TableId(value="id_")
private Long id; @TableField(value="name_")
private String name;
private Integer age;
private String address;
@TableLogic
@TableField(value="isDelete")
private Integer isDelete; }
这里去掉了get 和 set 方法。
5.3 创建 DAO操作数据库
package com.example.demo.dao; import com.example.demo.model.*;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import java.util.Map; public interface UserMapper extends BaseMapper<User> { int updName(Map<String,Object> params);
}
这个类继承了 BaseMapper 接口,自动有增查改删操作。
5.4 开始测试
1.列表查询
private UserMapper userMapper;
//@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
Assert.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
2.增加用户
public void add() {
User user=new User();
user.setId(14L);
user.setName("关羽");
user.setAge(12);
userMapper.insert(user);
}
3.更新实体对象
public void upd() {
User user=new User();
user.setId(13L);
user.setName("zyg");
user.setAge(13);
userMapper.updateById(user);
}
4.自定义条件更新
public void updWrap() {
User user=new User();
user.setAddress("广州");
user.setAge(23);
userMapper.update(user,new UpdateWrapper<User>().eq("name_","a").or().eq("name_","b"));
}
这个意思是他会根据姓名 为 a 或 b 的用户更新他的地址和年龄字段。
5.根据 MAP 传值更新
public void updName() {
Map<String,Object> params=new HashMap<>();
params.put("id",14);
params.put("name","趙雲");
int i= userMapper.updName(params);
System.err.println(i);
}
这里我们需要在 User.xml 中增加
<update id="updName" parameterType="java.util.HashMap">
update user_ set name_=#{name} where id_=#{id}
</update>
也需要在UserMapper 内中增加方法
int updName(Map<String,Object> params);
6.分页获取数据
public void getPage(){
Page<User> page = new Page<>(1, 5);
IPage<User> userIPage = userMapper.selectPage(page, null);
System.err.println(userIPage.getRecords());
}
这个需要配合MybatisPlusConfig 的分页配置,才可以生效。
7.当分页返回的数据不是 User 对象时,我们可以返回 Map对象。
public void getPageMap(){
Page page = new Page<>(1, 5);
Wrapper wrapper=new QueryWrapper();
((QueryWrapper) wrapper).ge("id_",2);
IPage<Map<String,Object>> userIPage = userMapper.selectMapsPage(page,wrapper);
System.err.println(userIPage.getRecords());
}
这里我们查询Id_ 大于 2的用户分页列表。
8.逻辑删除用户
如果平台中数据不需要做实际删除,我们可以配置逻辑删除
配置方法如下:
MybatisPlusConfig 中指定了
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
配置这个就支持逻辑删除
application.yml配置如下:
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
refresh: true # 刷新xml文件
db-config:
logic-delete-value: 1 #默认值1
logic-not-delete-value: 0 #默认值0
这里指定逻辑删除 删除标记 为1 表示删除 为0 表示正常。
User 对象 需要指定
@TableLogic
@TableField(value="isDelete")
指定逻辑删除字段。
删除代码
public void delById(){
userMapper.deleteById(1L);
}
这样我们执行这个删除时,后端并不执行删除操作。
Time:9 ms - ID:com.example.demo.dao.UserMapper.deleteById
Execute SQL:UPDATE User_ SET isDelete = 1 WHERE id_ = 1 AND isDelete = 0
后端执行的语句为 将 删除标记更新为1
9.分页配置根据租户查询。
需要配置
List<ISqlParser> sqlParserList = new ArrayList<>();
TenantSqlParser tenantSqlParser = new TenantSqlParser();
tenantSqlParser.setTenantHandler(new TenantHandler() {
@Override
public Expression getTenantId() {
return new LongValue(1L);
} @Override
public String getTenantIdColumn() {
return "tenant_id";
} @Override
public boolean doTableFilter(String tableName) {
// 这里可以判断是否过滤表 if ("User_".equals(tableName)) {
return true;
}
return false;
}
});
sqlParserList.add(tenantSqlParser);
paginationInterceptor.setSqlParserList(sqlParserList);
1.指定租户ID字段
2.返回租户ID值
@Override
public Expression getTenantId() {
return new LongValue(1L);
}
3.允许表过滤
有些表是不需要通过租户过滤的,可以修改方法
@Override
public boolean doTableFilter(String tableName) {
// 这里可以判断是否过滤表
if ("User_".equals(tableName)) {
return true;
}
return false;
}
10.乐观锁支持
乐观锁的原理是,每一条数据都带有一个版本。
比如当前都版本为1.
在更新数据时,会将版本加一进行更新,如果A 进行更新,那么这个时候版本变为 2,如果B 同A一起发起更新,那么这个时候就更新不到,给出提示。
配置方法:
@Version
private Integer version;
User 类中增加一个字段 为 version
配置增加乐观锁
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
编写更新代码
public void upd() {
User user=new User();
user.setId(13L);
user.setName("zyg");
user.setAge(13);
user.setVersion(1);
if( userMapper.updateById(user)>0){
System.err.println("更新成功");
}
else {
System.err.println("被其他人更新");
}
}
执行上面的代码
Time:7 ms - ID:com.example.demo.dao.UserMapper.updateById
Execute SQL:UPDATE User_ SET name_ = 'zyg', age = 13, version = 2 WHERE id_ = 13 AND version = 1
这里我们可以看到他会自动将版本字段加1,如果执行成功就变成了2,当第二个人执行更新的时候,还是用版本1 进行更新,数据就更新不到了。
使用mybatis plus 操作数据库的更多相关文章
- JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- mybatis的操作数据库基础
1.domain类 package com.xiaostudy.mybatis.domain; /** * @desc domain类 * @author xiaostudy * */ public ...
- Mybatis注解方法操作数据库
Java中使用Mybatis操作数据库主要有两种方法:注解和xml配置,注解相对比较简单和方便,两种方式的效果一致.本文以注解的方式说明用Mybatis访问数据库的方法 一.创建数据表(MySql) ...
- JavaWeb_(Spring框架)整合Mybatis加入事务操作数据库
整合Mybatis a)导包: i.Spring:基本包.aop.aspects.jdbc.tx.test: ii.Mybatis:mybatis-3.4.6 iii.整合包:mybatis-spri ...
- JAVA - SpringBoot项目引用MyBatis操作数据库
JAVA - SpringBoot项目引用MyBatis操作数据库 1. 创建SpringBoot项目,参考:https://www.cnblogs.com/1285026182YUAN/p/1232 ...
- mybatis 操作数据库(05)
类型转换.动态排序,查询接口与mapper对应关系说明及其注意事项 一.MyBatis 自带写常见类型转换器.例如:java 类中 String 对应 mySQL中的varchar 二.自定义类型转换 ...
- MyBatis知多少(22)MyBatis删除操作
本节从表中使用MyBatis删除记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, f ...
- MyBatis知多少(20)MyBatis读取操作
上篇展示了如何使用MyBatis执行创建操作表.本章将告诉你如何使用MyBatis来读取表. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT ...
- MyBatis返回主键,MyBatis Insert操作返回主键
MyBatis返回主键,MyBatis Insert操作返回主键 >>>>>>>>>>>>>>>>> ...
随机推荐
- linux下打压缩解压
tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...
- HQL中左连接,右连接、内连接
左连接:left join 如A left join B 即取出A表的所有数据,由on条件关联的B表数据,有则显示,没有则为空: 右连接:right join 如 A right join B 即取出 ...
- 定时器&改变定时器的执行频率
static System.Threading.Timer timer; static void Main(string[] args) { Console.WriteLine("Press ...
- dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件
该问题是由于电脑环境变量配置错误所导致.最初在网上查找的方法,是在系统环境变量path中添加以下语句: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\ ...
- vim高级工能入门
一.多文件编辑 1.vim 1.txt 2.txt 3.txt同时打开3个文件在vim缓冲区, 命令模式下输入:n 切换到下一个文件,可以加!:n! 强制切换,之前那个没有保存,仅仅是切换. ...
- AttributeError: 'LoginForm' object has no attribute 'is_bound' , object has no attribute 'is_bound'
'LoginForm' object has no attribute 'is_bound' 可能原因: 啥子问题?? 都是 jquery.js 文件.....
- ES6学习笔记(let,const,变量的解构赋值)
1.let: ; i < 3; i++) { let i = 'abc'; console.log(i); } // abc // abc // abc 不存在变量提升,它所声明的变量一定要在声 ...
- 登录注册页面(连接MySQL8.0.15版本)
原文链接:https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483779&idx=1&sn=e23e68e96 ...
- Spring Boot HikariCP 一 ——集成多数据源
其实这里介绍的东西主要是参考的另外一篇文章,数据库读写分离的. 参考文章就把链接贴出来,里面有那位的代码,简单明了https://gitee.com/comven/dynamic-datasource ...
- 2018-2019-2 20165315 《网络对抗技术》Exp3 免杀原理与实践
2018-2019-2 20165315 <网络对抗技术>Exp3 免杀原理与实践 一.实验内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion ...