MybatisPlus(条件构造器Wrapper-lambda、自定义sql)
引入依赖
<!--MybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
直接继承MybatisPlus提供的BaseMapper接口:
有MP就可以不要注释掉MyBatis
MybatisPlus中比较常用的几个注解如下
@TableName:用来指定表名 大概是标记成员类的
@Tableld:用来指定表中的主键字段信息 需要制定id为自增长
@TableField:用来指定表中的普通字段信息 标记出来sql表中的真实字段名
@TableName("tb_user")
public class User {
@TableId(value="id",type= IdType.AUTO )
private Long id;
属性名和字段名不一致都需要field注解但
属性名为is开头的一般为布尔类型,MP会默认映射到数据库表将is去掉只取后部分命名变量(所以is开头变量必须加field)
属性名和数据库关键字冲突,比如order 用``裱起来 @TableField(" `order` ")
成员变量不是数据库字段 @TableField(exist= false)
关于这个id注解主键,如果特指了类型
ldType的常见类型有哪些?
AUTO、ASSIGN ID、INPUT
就是auto自增,不指定就会默认使用MP自带的雪花算法来赋值id为Long INPUT就是自己填
mybatis-plus:
type-aliases-package:com.itheima.mp.domain.po #别名扫描包 主要用于扫描映射文件,来mapper与xml文件sql语句对应,来扫描id
mapper-locations:"classpath*:/mapper/**/*.xml"# Mapper.xml文件地址,默认值
configuration:
map-underscore-to-camel-case:true #是否开启下划线和驼峰的映射
cache-enabled:false #是否开启二级缓存
global-config: #全局有效
db-config:
id-type:assign_id # id为雪花算法生成
update-strategy:not_null # 更新策略:只更新非空字段
条件构造器
MP内置Wrapper条件构造器,主要用于sql复杂语法where条件
Wrapper下有AbstractWrapper类继承其用法,其下又有UpdateWrapper-QueryWrapper和lambda
QueryWrapper就是在允许Query功能还能select哪些字段
构建条件查询
SELECT id,username,info,balance
FROM user
WHERE username LIKE %o% AND balance >=1000
gt=great than ge-great equals eq-equals
@Test
void testQueryWrapper(){
//1.构建查询条件
QueryWrapper<User>wrapper = new QueryWrapper<User>()
.select("id","username","info","balance")
.like( "username","o" )
.ge("balance",1000);
// 2.查询
List<User> users =userMapper.selectList(wrapper);
users.forEach(System.out::println);
使用lambda
@Test
void testQueryWrapper(){
//1.构建查询条件
QueryWrapper<User>wrapper = new QueryWrapper<User>()
.select(User::getId,User::getUsername,User::getInfo,User::getBalance)
.like( "username","o" )
.ge("balance",1000);
// 2.查询
List<User> users =userMapper.selectList(wrapper);
users.forEach(System.out::println);
UPDATE user
SET balance = 2000
WHERE(username = "jack" )
void testUpdateByQueryWrapper(){
//1.要更新的数据
User user =new User(); 首先对象设置余额为2000
user.setBalance(2000);
//2.更新的条件 齐次用wrapper找到用户名是jack的用户
QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","jack");
//3.执行更新
//执行更新有两种一种是通过id一种是传进去wrapper和user对象
userMapper.update(user,wrapper);
wrapper对象调用where方法只需要where后面的条件直接.
@Test
void testUpdateWrapper(){
List<Long>ids =List.of(1L,2L,4L);
UpdateWrapper<User>wrapper = new UpdateWrapper<User>()
.setSql("balance=balance-200")
.in("id", ids);
userMapper.update(null, wrapper);
lambdaWrapper是遵循lambda语法规则
个人理解上述update和query都写死了。用lambda可以作用于动态sql
不接受死参数值,接受函数
条件构造器的用法:
QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
尽量使用LambdaQueryWrapper和LambdaUpdateWrapper避免硬编码
自定义sql
需求:将id在指定范围的用户(例如1、2、4)的余额扣减指定值
where条件交给MP去构建、前半部分就用自定义
我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
1.基于Wrapper构建where条件
List<Long>ids = List.of(1L,2L,4L);
int amount=200;
//1.构建条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
// 2.自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper,amount);
2.在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
3.自定义SQL,并使用Wrapper条件
<update id="updateBalanceByIds">
UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>
wrapper相当于where条件部分,自定义sql相当于操作部分也就是sql的前半部分
Service接口
待续service接口