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>