Mybatis-Plus 是一款 Mybatis 动态 SQL 自动注入 Mybatis 增删改查 CRUD 操作中间件, 减少你的开发周期优化动态维护 XML 实体字段,无入侵全方位 ORM 辅助层让您拥有更多时间陪家人。
http://mp.baomidou.com/
https://github.com/baomidou/mybatis-plus
目前最新版本:3.0 alpha/beta,升级 JDK 8 + 优化性能 Wrapper 支持 lambda 语法等等, Wrapper 也更改为 QueryWrapper和UpdateWrapper,网上的攻略已经不行了,这里提供一个新版本的入门采坑手册,并附上spring-cloud-study-mybatisplus开源学习项目。那么教程开始了。
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plusartifactId>
<version>3.0-betaversion>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.0-betaversion>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>1.3.2version>
dependency>
官方给的配置,有报错,集中报错在IDGenerator那边,于是暂时屏蔽了,mysql是不需要的,如果用在oracle上应该是需要配置,等官方更新demo配置。
server:
port: 3333
servlet:
context-path: /mybatisplus
tomcat:
remote-ip-header: x-forward-for
uri-encoding: UTF-8
max-threads: 10
background-processor-delay: 30
spring:
http:
encoding:
force: true
charset: UTF-8
application:
name: spring-cloud-study-mybatisplus
freemarker:
request-context-attribute: req
#prefix: /templates/
suffix: .html
content-type: text/html
enabled: true
cache: false
charset: UTF-8
allow-request-override: false
expose-request-attributes: true
expose-session-attributes: true
expose-spring-macro-helpers: true
#template-loader-path: classpath:/templates/
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
driver-class-name: com.mysql.jdbc.Driver
platform: mysql
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
filters: stat,wall,log4j
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
instance:
ip-address: ture
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/com/softdev/system/demo/entity/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.softdev.system.*.entity
global-config:
db-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: UUID
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: NOT_EMPTY
#驼峰下划线转换
table-underline: true
#mp2.3+ 全局表前缀 mp_
#table-prefix: mp_
#刷新mapper 调试神器
#refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
# Sequence序列接口实现类配置
#key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
#逻辑删除配置(下面3个配置)
logic-delete-value: 1
logic-not-delete-value: 0
#sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
#自定义填充策略接口实现
#meta-object-handler: com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
configuration:
#配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
map-underscore-to-camel-case: true
cache-enabled: false
#配置JdbcTypeForNull, oracle数据库必须配置
jdbc-type-for-null: 'null'
Mapper只需要extends BaseMapper
就可以完美实现增删改查等一系列操作,非常方便
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User>{
}
这里Entity省略setter和getter方法,可以用lombok的@Data代替
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String userId;
private String userName;
private String passWord;
private String name;
private String tell;
private int status;
}
这里随便写个init方法和find方法,init就不用说了,初始化一些数据进去,find使用了QueryWrapper构造器,很方便。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/init")
public ApiReturnObject init(){
List userList=new ArrayList();
for (int i = 0; i < 10; i++) {
int n=RandomUtil.randomInt(10000,99999)+i;
User user=new User();
user.setId(n);
user.setName(n+"");
user.setPassWord(n+"");
user.setStatus(1);
user.setUserId(n+"");
user.setUserName(n+"");
userMapper.insert(user);
userList.add(user);
user=null;
}
return ApiReturnUtil.success(userList);
}
@GetMapping("/find")
public ApiReturnObject find(){
IPage userList=userMapper.selectPage(
new Page(1, 10),
new QueryWrapper().like("name","1")
);
return ApiReturnUtil.success(userList.getRecords());
}
}
访问数据初始化 http://127.0.0.1:1111/mybatisplus/user/init
{
"errorCode": "00",
"errorMessage": "success",
"returnObject": [
{
"id": 52585,
"name": "52585",
"passWord": "52585",
"status": 1,
"userId": "52585",
"userName": "52585"
},
{
"id": 33432,
"name": "33432",
"passWord": "33432",
"status": 1,
"userId": "33432",
"userName": "33432"
}
。。。这里省略其他的
]
}
访问构造器查询 http://127.0.0.1:3333/mybatisplus/user/find
{
"errorCode": "00",
"errorMessage": "success",
"returnObject": [
{
"id": 41618,
"name": "41618",
"passWord": "41618",
"status": 1,
"userId": "41618",
"userName": "41618"
},
{
"id": 17804,
"name": "17804",
"passWord": "17804",
"status": 1,
"userId": "17804",
"userName": "17804"
}
。。。省略其他包含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 |
orderByAsc(有变化,中间有By) | ASC 排序 ORDER BY |
orderByDesc(有变化,中间有By) | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last(“LIMIT 1”) |
已经在springboot注入mybatis的分页插件,直接使用Page参数
IPage userList=userMapper.selectPage(
new Page(1, 10),
new QueryWrapper().like("name","1")
);
Wrapper分为QueryWrapper、UpdateWrapper、LambdaQueryWrapper、LambdaUpdateWrapper了,EntityWrapper已经废弃了
Ipage
的子类(下面会有详细使用说明)Wrapper
实现类的改动
1.
EntityWrapper
更名为QueryWrapper
2.新增一个实现类UpdateWrapper
用于update
方法
BaseMapper
的改动
1.去除了
insertAllColumn(T entity)
方法
2.去除了updateAllColumn(T entity)
方法
3.新增update(T entity, Wrapper
方法updateWrapper)
Wrapper
使用QueryWrapper
与UpdateWrapper
共有方法方法名 | 说明 |
---|---|
allEq | 基于 map 内容等于= |
eq | 等于 = |
ne | 不等于 <> |
gt | 大于 > |
ge | 大于等于 >= |
lt | 小于 < |
le | 小于等于 <= |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
like | LIKE ‘%值%” |
notLike | NOT LIKE ‘%值%’ |
likeLeft | LIKE ‘%值’ |
likeRight | LIKE ‘值%’ |
——– | ——– |
isNull | NULL 值查询 |
isNotNull | NOT NULL 值查询 |
in | IN 查询 |
notIn | NOT IN 查询 |
inSql | IN 查询(sql注入式) |
notInSql | NOT IN 查询(sql注入式) |
groupBy | 分组 GROUP BY |
orderByAsc | ASC 排序 ORDER BY |
orderByDesc | DESC 排序 ORDER BY |
orderBy | 排序 ORDER BY |
having | HAVING 关键词(sql注入式) |
——– | ——– |
or | or 拼接 |
apply | 拼接自定义内容(sql注入式) |
last | 拼接在最后(sql注入式) |
exists | EXISTS 条件语句(sql注入式) |
notExists | NOT EXISTS 条件语句(sql注入式) |
——– | ——– |
and(Function) | AND (嵌套内容) |
or(Function) | OR (嵌套内容) |
nested(Function) | (嵌套内容) |
QueryWrapper
特有方法
方法名 | 说明 |
---|---|
select | SQL 查询字段内容,例如:id,name,age(重复设置以最后一次为准) |
UpdateWrapper
特有方法
方法名 | 说明 |
---|---|
set | SQL SET 字段(一个字段使用一次) |
IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
以上面的方法为例,入参一个
IPage
接口的子类(可以使用mp自带的一个叫Page
的子类), 返回一个IPage
,其实这个返回的分页类==入参的分页类
, 如果你需要自定义一个分页方法只需要注意一点:入参第一位放置你使用的IPage
子类!
update(T entity, Wrapper updateWrapper)
使用只需要注意,入参第一位是需要update的实体类,
updateWrapper
里的实体类是用于生成where条件的