MyBatis Plus学习笔记

文章目录

      • MyBatis Plus常用注解:
        • 1. @TableName("表名称")
        • 2. @TableId
        • 3. @TableField("name")
      • MyBatis Plus排除非表字段的三种方式:
        • 1. 使用 transient 修饰符
        • 2. 使用 static 修饰符
        • 3. 使用注解 @TableField(exist=false)
      • MyBatis Plus 的查询
        • 1. 根据 id 单次查询
        • 2. 根据 id 批量查询
        • 3. 根据 字段 条件查询
        • 4. 条件构造器查询
        • 5. 条件构造器查询返回指定字段
        • 6. 条件构造器like的参数condition作用
        • 7. 实体作为条件构造器构造方法的参数
        • 8. AllEq的使用
        • 9. 其他使用构造器的方法
        • 10. lambda条件构造器
        • 11. 使用条件构造器自定义sql

MyBatis Plus常用注解:

1. @TableName(“表名称”)

当实体类的名称与数据库表名称不一致,且两者不易修改名称时,可用于统一该实体类与表名称。

@TableName("tb_user")
public class User{
	...
}

2. @TableId

当数据库表主键名称不是id时,由于MyBatis Plus默认主键名称为id,此时无法自动生成主键,所以可以通过此注解标识此字段为主键。

@TableName("tb_user")
public class User{
	@TableId
	private Long userId;
	...
}

3. @TableField(“name”)

当数据库表字段名称与实体类的字段名称不一致时,可以通过该注解统一。

@TableName("tb_user")
public class User{
	@TableId
	private Long userId;
	@TableField("name")
	private String realName;
	...
}

MyBatis Plus排除非表字段的三种方式:

当实体类中存在字段而表中不存在时,要想使用MyBatis Plus 时不会使该字段生成到sql语句中,有以下三种方式:

1. 使用 transient 修饰符

@TableName("tb_user")
public class User{
	@TableId
	private Long userId;
	@TableField("name")
	private String realName;
	private transient String remark;
	...
}

此修饰符表示这个字段不会被序列化,所以不会出现在MyBatis Plus 生成的Sql语句中。
但是如果该字段需要在某些功能中参与序列化,则该方式不可取。

2. 使用 static 修饰符

@TableName("tb_user")
public class User{
	@TableId
	private Long userId;
	@TableField("name")
	private String realName;
	private static String remark;
	...
}

由此修饰符修饰的字段不会被 MyBatis Plus 生成到 Sql 语句中。
但是这会使该类的所有对象共用这个字段,所以对于需要私有使用的情况不适用。

3. 使用注解 @TableField(exist=false)

@TableName("tb_user")
public class User{
	@TableId
	private Long userId;
	@TableField("name")
	private String realName;
	@TableField(exist=false)
	private String remark;
	...
}

由此注解修饰的字段不会被 MyBatis Plus 生成到 Sql 语句中。
该注解的exist值默认为true,即默认该字段可被生成到sql语句中。

MyBatis Plus 的查询

1. 根据 id 单次查询

selectById(Serializable id)
根据主键id查询该id对应得信息,参数为id值

2. 根据 id 批量查询

selectBatchIds(@Param(“coll”) Collection idList)
根据主键id查询该id对应得信息,参数为 多个id 组成得集合

3. 根据 字段 条件查询

selectByMap(@Param(“cm”) Map columnMap)
根据map中的字段的键与值生成到sql中,进行条件查询。
注意:map中的 key 是数据库中的字段名,不是实体类中的属性名

4. 条件构造器查询

//创建条件构造器 方式一
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//创建条件构造器 方式二
//QueryWrapper queryWrapper = Wrappers.query();



// 1. 构造查询条件为 名字包含呵(%呵%) 并且 年龄小于30 的
//queryWrapper.like("name","呵").lt("age",30);

// 2. 构造查询条件为 名字包含呵(%呵%) 并且 年龄大于等于20且小于等于30 并且 emailb不为空 的

//queryWrapper.like("name","呵").between("age",20,30).isNotNull("email");

// 3. 构造查询条件为 名字为张姓(张%) 或者 年龄大于等于25 按照年龄降序排列, 年龄相同的按照id升序排列
//queryWrapper.likeRight("name","张").or().ge("age",25).orderByDesc("age").orderByAsc("id");

// 4. 构造查询条件为 创建日期为2019.2.14 并且 直属上级为名字是王姓
// data_format(create_time,'%Y-%m-%d') and manager_id in (select id from user where name like '王%')
queryWrapper.apple("data_format(create_time,'%Y-%m-%d')={0}","2019-02-14").inSql("manager_id","select id from user where name like '王%'");
//以下方式有sql注入的风险,可参考官网 https://mp.baomidou.com/guide/wrapper.html#apply
//queryWrapper.apple("data_format(create_time,'%Y-%m-%d')='2019-02-14'").inSql("manager_id","select id from user where name like '王%'");

// 5. 构造查询条件为 名字为张姓(张%) 并且 (年龄小于38或者邮箱不为空)
//name like '张%' and(age<38 or email is not null)
//queryWrapper.likeRight("name","张").and(wq->wq.lt("age",38).or().isNotNull("email"));

// 6. 构造查询条件为 名字为张姓(张%) 或者 (年龄小于38 并且 年龄大于18 并且 邮箱不为空)
//name like '张%' and(age<40 and age>20 and email is not null)
//queryWrapper.likeRight("name","张").or(wq->wq.lt("age",38).gt("age",18).isNotNull("email"));

// 7. 构造查询条件为 (年龄小于38 或者 邮箱不为空) 并且 名字为张姓(张%)
// (age<40 or email is not null) and name like '张%'
//queryWrapper.nested(wq->wq.lt("age",38).or().isNotNull("email")).likeRight("name","张");

// 8. 构造查询条件为 年龄为 18、20、25、28、30
// age in (18,20,25,28,30)
//queryWrapper.in("age",Array.asList(18,20,25,28,30));

// 9. 构造查询条件为 返回满足条件的一条数据
// 注意此方式有sql注入的风险,参考官网https://mp.baomidou.com/guide/wrapper.html#last
// age in (18,20,25,28,30) limit 1
//queryWrapper.in("age",Array.asList(18,20,25,28,30)).last("limit 1");



//查询
List<User> selectList = userMapper.selectList(queryWrapper);

注意:条件构造器中的条件的 key 为数据库中的字段名,非实体类中的属性名

5. 条件构造器查询返回指定字段

//创建条件构造器 方式一
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//创建条件构造器 方式二
//QueryWrapper queryWrapper = Wrappers.query();


// 指定返回字段为 id 、 name 
// 1. 构造查询条件为 名字包含呵(%呵%) 并且 年龄小于30
//queryWrapper.select("id","name").like("name","呵").lt("age",30);

// 指定返回字段中不包含 id 、 create_time
// 2. 构造查询条件为 名字包含呵(%呵%) 并且 年龄小于30
//queryWrapper.like("name","呵").lt("age",30).select(User.class,info)->!info.getColumn().equals("create_time")&&!info.getColumn().equals("id"));



//查询
List<User> selectList = userMapper.selectList(queryWrapper);

6. 条件构造器like的参数condition作用

like(boolean condition, R column, Object val)
其中condition为boolean表达式,即判断条件

//创建条件构造器 方式一
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//创建条件构造器 方式二
//QueryWrapper queryWrapper = Wrappers.query();


// 判断参数name的值,即当参数name不为空时,将生成带name条件的sql语句,否则生成的sql中无此条件
queryWrapper.like(StringUtils.isNotEmpty(name),"name",name);


//查询
List<User> selectList = userMapper.selectList(queryWrapper);

7. 实体作为条件构造器构造方法的参数

// 名字是 呵呵,且 年龄为 22
User whereUser = new User();
whereUser.setName("呵呵");
whereUser.setAge(22);

//创建条件构造器
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(whereUser);

// 名字包含 呵,且 年龄小于30
queryWrapper.like("name","呵").lt("age",30);


//查询
List<User> selectList = userMapper.selectList(queryWrapper);

注意:实体类的条件与构造器构造的条件同时生成sql中的查询条件,两种条件若同时存在,是逻辑与的关系

8. AllEq的使用

//创建条件构造器
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(whereUser);
Map<String,Object> params = new HashMap<String,Object>();
params.put("name","王三");
//params.put("age",23);
// 如果age值是null,则生成的sql语句为age is null
params.put("age",null);

//queryWrapper.allEq(params);
// 忽略值为null的条件参数
//queryWrapper.allEq(params.false);
// 过滤掉k为name的键值对,不生成到sql中去
queryWrapper.allEq((k,v)->!k.equals("name"),params);
//查询
List<User> selectList = userMapper.selectList(queryWrapper);

9. 其他使用构造器的方法

//创建条件构造器 方式一
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//创建条件构造器 方式二
//QueryWrapper queryWrapper = Wrappers.query();

// 指定返回字段为 id 、 name 
// 构造查询条件为 名字包含呵(%呵%) 并且 年龄小于30
queryWrapper.select("id","name").like("name","呵").lt("age",30);

//查询,返回指定字段的map的键值对格式
//List> selectList = userMapper.selectMaps(queryWrapper);

//查询,返回查询结果的第一列字段值
// 注意:只返回查询结果的第一列
List<Object> selectList = userMapper.selectObjs(queryWrapper);
//创建条件构造器 方式一
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//创建条件构造器 方式二
//QueryWrapper queryWrapper = Wrappers.query();

// 构造查询条件为 名字包含呵(%呵%) 并且 年龄小于30
queryWrapper.like("name","呵").lt("age",30);

//查询返回总记录数
Integer count = userMapper.selectCount(queryWrapper);
//创建条件构造器 方式一
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();

// 构造查询条件为 名字是呵呵 并且 年龄小于30
queryWrapper.like("name","呵呵").lt("age",30);

//查询返回总记录数
User user = userMapper.selectOne(queryWrapper);

注意:返回结果条数大于1则报错

10. lambda条件构造器

//创建lambda条件构造器 方式一
LambdaQueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>().lambda();
//创建lambda条件构造器 方式二
//LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper();
//创建lambda条件构造器 方式三
LambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.<User>lambdaQuery();

//查询条件
//lambdaQueryWrapper.like(User::getName,"呵").lt(User::getAge,30);
lambdaQueryWrapper.likeRight(User::getName,"张").and(lqw->lqw.lt(User::getAge,30).or().isNotNull(User::getEmail));
//查询
List<User> selectList = userMapper.selectList(lambdaQueryWrapper );

// 3.0.7新增lambda构造器
List<User> userList = new LambdaQueryChainWrapper<User>(userMapper).like(User::getName,"雨").ge(User::getAge,24).list();

11. 使用条件构造器自定义sql

版本大于等于3.0.7
方式一

public interface UserMapper extends BaseMapper<User>{
	@Select("select * from user ${ew.customSqlSegment}")
	List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}

方式二

public interface UserMapper extends BaseMapper<User>{
	List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}
<select id="selectAll" resultType="com.mp.entity.User">
	select * from user ${ew.customSqlSegment}
select>

你可能感兴趣的:(MyBatis,java,mybatisPlus)