MyBatis Plus學習筆記

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<? extends Serializable> idList)
根據主鍵id查詢該id對應得信息,參數爲 多個id 組成得集合

3. 根據 字段 條件查詢

selectByMap(@Param(“cm”) Map<String, Object> columnMap)
根據map中的字段的鍵與值生成到sql中,進行條件查詢。
注意:map中的 key 是數據庫中的字段名,不是實體類中的屬性名

4. 條件構造器查詢

//創建條件構造器 方式一
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//創建條件構造器 方式二
//QueryWrapper<User> queryWrapper = Wrappers.<User>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<User> queryWrapper = Wrappers.<User>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<User> queryWrapper = Wrappers.<User>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<User> queryWrapper = Wrappers.<User>query();

// 指定返回字段爲 id 、 name 
// 構造查詢條件爲 名字包含呵(%呵%) 並且 年齡小於30
queryWrapper.select("id","name").like("name","呵").lt("age",30);

//查詢,返回指定字段的map的鍵值對格式
//List<Map<String,Object>> selectList = userMapper.selectMaps(queryWrapper);

//查詢,返回查詢結果的第一列字段值
// 注意:只返回查詢結果的第一列
List<Object> selectList = userMapper.selectObjs(queryWrapper);
//創建條件構造器 方式一
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//創建條件構造器 方式二
//QueryWrapper<User> queryWrapper = Wrappers.<User>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<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//創建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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章