4.1.3 typeAliasesPackage
MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)
SpringBoot:
mybatis-plus: type-aliases-package: com.rg.boot.bean
SpringMVC:
< bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> <property name="typeAliasesPackage" value=com.rg.boot.bean"/> </bean>
4.1.4mapUnderscoreToCamelCase
- 类型:
boolean
- 默认值:
true
是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射。注意:此属性在 MyBatis 中原默认值为 false
# 关闭自动驼峰映射,该参数不能和mybatis-plus.config-location同时存在,因为这个配置也可以在文件中进行,所以两者可能进行冲突! mybatis-plus: # config-location: classpath:mybatis-config.xml configuration: map-underscore-to-camel-case: false cache-enabled: false
4.1.5 cacheEnabled
- 类型: boolean
- 默认值: true
全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true。
mybatis-plus: configuration: cache-enabled: false
4.2 DB 策略配置
4.3.1、idType
- 类型: com.baomidou.mybatisplus.annotation.IdType
- 默认值: ID_WORKER
AUTO 数据库ID自增 INPUT 用户输入ID ID_WORKER 全局唯一ID,Long类型的主键 ID_WORKER_STR 字符串全局唯一ID 多少位取决于数据库表的设计 UUID 全局唯一ID,UUID类型的主键 32位字符串类型 NONE 该类型为未设置主键类型
全局默认主键类型,设置后,即可省略实体对象中的@TableId(type = IdType.AUTO)配置。
SpringBoot:
mybatis-plus.configuration.map-underscore-to-camel-case=false
<!-- 这里使用MP提供的sqlSessionFactory,完成了Spring与MP的整合--> <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="globalConfig"> <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig"> <property name="dbConfig"> <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig"> <property name="idType" value="AUTO"/> </bean> </property> </bean> </property> </bean>
4.3.2、tablePrefix
- 类型: String
- 默认值: null
表名前缀,全局配置后可省略 @TableName()配置。
SpringBoot:
mybatis-plus.global-config.db-config.table-prefix =tb_
SpringMVC:
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="globalConfig"> <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig"> <property name="dbConfig"> <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig"> <property name="idType" value="AUTO"/> <property name="tablePrefix" value="tb_"/> </bean> </property> </bean> </property> </bean>
5 条件构造器
在MP中,Wrapper接口的实现类关系如下:
可以看到, AbstractWrapper和AbstractChainWrapper是重点实现,接下来我们重点学习AbstractWrapper以及其子类。
allEq
allEq(Map<R, V> params) allEq(Map<R, V> params, boolean null2IsNull) allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
个别参数说明:
params : key为数据库字段名,value为字段值
null2IsNull : 为true则在map的value为null时调用 isNull 方法(也就是添加 字段 IS NULL的条件), 为false时则忽略value为null的条件(也忽略 字段 IS NULL的条件)
allEq(BiPredicate<R, V> filter, Map<R, V> params) allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
个别参数说明:
filter
: 过滤函数,是否允许字段传入比对条件中
params
与 null2IsNull
: 同上
测试代码:
@Test public void testAllEq(){ Map <String, Object> params = new HashMap <>(); params.put("name", "李四"); params.put("age","20"); params.put("password", null); QueryWrapper <User> wrapper = new QueryWrapper <>(); //SELECT id,user_name,password,name,age,email FROM tb_user WHERE (password IS NULL AND name = ? AND age = ?) // wrapper.allEq(params); // SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? AND age = ?) //wrapper.allEq(params,false);//false:忽略条件为null的 条件 //SELECT id,user_name,password,name,age,email FROM tb_user WHERE (age = ?) // wrapper.allEq((k, v) -> (k.equals("age") || (k.equals("id"))), params);//filter : 过滤函数,是否允许字段传入比对条件中==>只需要满足age和id一个就可 // SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? AND age = ?) wrapper.allEq((k, v) -> (k.equals("age") || (k.equals("id"))||(k.equals("name"))), params); List <User> userList = userMapper.selectList(wrapper); // for (User user : userList) { // System.out.println(user); // } }
基本比较操作:
eq
等于=
ne
不等于 <>
gt
大于 >
ge
大于等于 >=
lt
小于<
le
小于等于 <=
between
BETWEEN 值1 AND 值2
notBetween
NOT BETWEEN 值1 AND 值2
In
字段 IN(Value.get(0),value.get(1)…)
notIn
字段 NOT IN (v0, v1, …)
测试代码:
@Test public void testEq(){ QueryWrapper <User> wrapper = new QueryWrapper <>(); //SELECT id,user_name,password,name,age,email FROM tb_user WHERE (password = ? AND age >= ? AND name IN (?,?,?)) wrapper.eq("password", "123456") .ge("age", 20) .in("name", "李四", "王五", "赵六"); List <User> users = userMapper.selectList(wrapper); for (User user : users) { System.out.println(user); } }
模糊查询
like
LIKE ‘%值%’
例: like("name", "王")—>name like '%王%'
notLike
NOT LIKE ‘%值%’
例: notLike("name", "王")—>name not like '%王%'
likeLeft
LIKE ‘%值’
例: likeLeft("name", "王")—>name like '%王'
likeRight
LIKE ‘值%’
例: likeRight("name", "王")—>name like '王%'
测试代码:
@Test public void testLike(){ QueryWrapper <User> wrapper = new QueryWrapper <>(); // SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name LIKE ?) // %五(String) wrapper.likeLeft("name", "五"); List <User> users = userMapper.selectList(wrapper); for (User user : users) { System.out.println(user); } }
逻辑查询
or
拼接 OR
例: eq("id",1).or().eq("name","老王")—>id = 1 or name = '老王'
and
AND 嵌套
例: and(i -> i.eq("name", "李白").ne("status", "活着"))—>and (name = '李白' and status <> '活着')
注意事项:主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)
测试代码:
@Test public void testOr(){ QueryWrapper <User> wrapper = new QueryWrapper <>(); //SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? OR age = ?) wrapper.eq("name", "王五").or().eq("age", 21); List <User> users = userMapper.selectList(wrapper); for (User user : users) { System.out.println(user); } }
排序
order
排序:ORDER BY 字段, …
例: orderBy(true, true, "id", "name")—>order by id ASC,name ASC
orderBy
排序:ORDER BY 字段, … ASC
例: orderByAsc("id", "name")—>order by id ASC,name ASC
orderByAsc
排序:ORDER BY 字段, … ASC
例: orderByAsc("id", "name")—>order by id ASC,name ASC
orderByDesc
排序:ORDER BY 字段, … DESC
例: orderByDesc("id", "name")—>order by id DESC,name DESC
@Test public void testOrderByAgeDesc(){ QueryWrapper <User> wrapper = new QueryWrapper <>(); // SELECT id,user_name,password,name,age,email FROM tb_user ORDER BY age DESC wrapper.orderByDesc("age"); List <User> users = userMapper.selectList(wrapper); for (User user : users) { System.out.println(user); } }
指定查询字段—select
- 设置查询字段
- 例:
select("id", "name", "age")
- 例:
select(i -> i.getProperty().startsWith("test"))
@Test public void testSelect(){ QueryWrapper <User> wrapper = new QueryWrapper <>(); //com.rg.boot.MybatisPlusSpringbootApplicationTests#testSelect wrapper.eq("name","王五") .or() .eq("age",21) .select("id","name","age");//指定查询的字段 List <User> users = userMapper.selectList(wrapper); for (User user : users) { System.out.println(user); } }
groupBy
groupBy(R... columns) groupBy(boolean condition, R... columns)
- 分组:GROUP BY 字段, …
- 例:
groupBy("id", "name")
—>group by id,name
判断非空
- isNull
- 字段 IS NULL
- 例:
isNull("name")
—>name is null
- isNotNull
- 字段 IS NOT NULL
- 例:
isNotNull("name")
—>name is not null