mybatis-plus入門


mybatis-plus 介紹

關於介紹可以看官網https://mp.baomidou.com/guide/#%E7%89%B9%E6%80%A7

mybatis-plus 簡稱MP,MP 使用類似於JPA  Dao層接口繼承BaseMapper<要操作的實體類> 里面封裝了Crud的一套方法 繼承該接口,既可以調用方法進行基礎的Crud,可以不用寫sql 用過Hibernate 的都明白。

MP要求編程人員 要熟悉mybatis  自然也要熟悉sql   還有lambda 表達式 才能很好的學習掌握MP

下面是我寫的測試項目 ,用於測試MP的方法 ,只是學習作用。

創建springboot項目  添加jar坐標

<!--Mybatis-Plus啟動器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>

application.yml

spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/kgc?useSSL=false&ServerTimezone=GMT%2B8&characterEncoding=utf-8
username: root
password: root
logging:
level:
root: warn
com.mp.dao: trace 打印日志 只輸出dao層 這里是輸出sql語句
pattern:
console: '%p%m%n'

實體類

Data
@TableName("user")//該注解指定映射數據庫表名 數據庫名與實體類名一樣時可以不寫
public class User {

    
     @TableId//這個注解是指定id的映射 MP 默認找id做主鍵  字段不是id 就需寫上該注解
    private Long id;
    @TableField("name")//注解是指定非字段名映射 字段名不相同時使用
private String name;


private Integer age;

private String email;
//直接上級
private Long managerId;
//創建時間
private LocalDateTime createTime;
  
//備注 這里是程序運行的時需要的字段並非數據庫字段
//MP 對於這種字段有三中解決方案 新增時 MP會自動過濾該屬性不會添加到數據庫 sql語句回忽略掉
//1 private transient String remark; 表示不參與數據序列化 如果該類都要序列化 可以采取第二種方案
//2 private static String remark 聲明為靜態變量(注意我這用的是Lombok 注解 靜態變量不生成get、set 需要手動生成)
//3 @TableField(exist = false) exist 默認是true 表示該屬性是數據庫字段 false 表示非數據庫字段
// private static String remark;
@TableField(exist = false)
private static String remark;

public static String getRemark() {
return remark;
}

public static void setRemark(String remark) {
User.remark = remark;
}


}

測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class SimpleTest {
@Autowired
private UserMapper userMapper;


@Test
public void selectTest() {
List<User> list = userMapper.selectList(null);
Assert.assertEquals(5, list.size());
list.forEach(System.out::println);
}


@Test
public void insertTest() {
User user = new User( );
user.setAge(22);
user.setName("劉強");
user.setManagerId(1088248166370832385L);
user.setCreateTime(LocalDateTime.now());
user.setRemark("程序組裝字段");
int insert = userMapper.insert(user);
System.out.println("影向記錄數"+insert);
    List<Long> idlist = Arrays.asList(1088248166370832385L,1088250446457389058L,1094590409767661570L);
    
      //生成的sql為SELECT id,name,age,email,manager_id,create_time FROM user WHERE id IN ( ? , ? , ? )
    List<User> userList = userMapper.selectBatchIds(idlist);
    userList.forEach(System.out::println);



}
  @Test
  public void selectByMap() {
   Map<String, Object> map = new HashMap<>();
   //生成的sql SELECT id,name,age,email,manager_id,create_time FROM user WHERE name = ? AND age = ?
   //map 中的key值是數據庫的列 用字符串類型
   map.put("name", "王天風");
   map.put("age", 25);
   List<User> users = userMapper.selectByMap(map);
   users.forEach(System.out::println);
}
多條件查詢使用條件構造器多條件條件鏈式添加
下面是幾個示例:
 /**
* 查詢名字包含雨並且年齡小雨40;
*/
@Test
public void selectByWrapper() {
//創建條件構造器對象 有下面兩種
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// QueryWrapper<User> query = Wrappers.<User>query();
//封裝條件
//生成的sql: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ?
QueryWrapper<User> lt = queryWrapper.like("name", "雨").lt("age", 40);
List<User> users = userMapper.selectList(lt);
users.forEach(System.out::println);

}

/**
* 查詢名字包含雨並且年齡大於等於20且小於等於40並且email不為空;
* name like'%雨%' and age between 20 and 40 email is not null
*/
@Test
public void selectByWrapper2() {
//創建條件構造器對象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//生成的sql語句為: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL
QueryWrapper<User> wrapper = queryWrapper.like("name", "雨").between("age", 20, 40).isNotNull("email");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
  
  
/**
* 查詢名字為王姓或者年齡大於等於25,按照年齡降序排列,年齡相同按照ID 升序排序
* name like'雨%' or age>= 25 order by age desc,id asc
*/
@Test
public void selectByWrapper3() {
//創建條件構造器對象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//sql語句為: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? OR age >= ? ORDER BY age DESC , id ASC 
QueryWrapper<User> wrapper = queryWrapper.likeRight("name", "王")
                     .or().ge("age", 25)
                    .orderByDesc("age")
                    .orderByAsc("id");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}

/**
* 查詢創建日期為2019年2月14日 並且直屬上級的名字為王姓
* date_format(create_time,'%Y-%m-%d')and manager_id in (select id from user where name like '王%')
*/
@Test
public void selectByWrapper4() {
//生成的Sql語句:SELECT id,name,age,email,manager_id,create_time FROM user WHERE date_format(create_time,'%y-%m-%d')=? AND manager_id IN (select id from user where name like '王%')
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}", "2019-02-14")
.inSql("manager_id", "select id from user where name like '王%'");
   // queryWrapper.apply("date_format(create_time,'%Y-%m-%d')='2019-02-14'") 也可以直接寫入值 相當於mybatis ${} 有sql注入風險 
// .inSql("manager_id", "select id from user where name like '王%'");

List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);

  
}
 
        
/**
* 名字為王姓並且(年齡小於40並且年齡大於20並且郵箱不為空)
* name like '王%' and (age <40 or email in not null)
*/
@Test
public void selectByWrapper6() {
//生成的Sql語句:SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND ( age < ? AND age > ? AND email IS NOT NULL )
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("name", "王")
.and(wq->wq.lt("age", 40).gt("age", 20).isNotNull("email"));

List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);


}
 
        
/**
* (年齡小於40或郵箱不為空) 並且名字為王姓
* (age < 40 or email is not null ) and name liek '王%'
*/
@Test
public void selectByWrapper7() {
//生成的Sql語句:SELECT id,name,age,email,manager_id,create_time FROM user WHERE ( age < ? OR email IS NOT NULL ) AND name LIKE ?
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.nested(wq->wq.lt("age", 40).or().isNotNull("email"))
.likeRight("name", "王");

List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);


}
  
/**
* 查年齡為30 31 34 35
* age in(30 31 34 35)
*/
@Test
public void selectByWrapper8() {
//生成的Sql語句:SELECT id,name,age,email,manager_id,create_time FROM user WHERE age IN (?,?,?,?) 
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.in("age", Arrays.asList(30, 31, 34, 35));


List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);


}
下面兩種方法是針對查詢是需要查詢某一些列 不需要全部的列
 
        
/**
* 只查詢 ID name 字段名字中包含雨的 並且年齡小於40
* name like '%雨%' and age<40
*/
@Test
public void selectByWrapperSuper(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//sql: SELECT id,name FROM user WHERE name LIKE ? AND age < ?
queryWrapper.select("id","name").like("name","雨").lt("age", 40);

List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
/**
* 查詢出表中的字段 除create_time manager_id 外所有字段 名字中包含雨的 並且年齡小於40
* name like '%雨%' and age<40
*/
@Test
public void selectByWrapperSuper2(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//sql:SELECT id,name,age,email FROM user WHERE name LIKE ? AND age < ?
queryWrapper.like("name","雨")
.lt("age", 40)
.select(User.class,info->!info.getColumn().equals("create_time")&& !info.getColumn().equals("manager_id"));

List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
 
    /**
* 條件查詢中condition的作用 condition是boolean 類型表示執行條件 true 表示 添加該條件 false不添加該條件 是一種動態sql的方法實現
   * 查詢方法底層都有condition MP 默認是為true 添加該條件 要想寫動態 調用對應查詢的重載方法 第一個參數就是condition

*/
private void condition(String name, String email) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//sql:SELECT id,name,age,email FROM user WHERE name LIKE ? AND age < ?
// if (StringUtils.isNotEmpty(name)) {
// queryWrapper.like("name", name);
// }
// if (StringUtils.isNotEmpty(email)) {
// queryWrapper.like("email", email);
// }
queryWrapper.like(StringUtils.isNotEmpty(name),"name", name)
.like(StringUtils.isNotEmpty(email),"email", email);
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}

@Test
public void testCondition() {
//生成的sql語句: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? 沒有 拼接email
String name = "王";
String email ="";
condition(name, email);
}
  
/**
* 這里條件構造器傳入對象 用對象的屬性值給查詢條件賦值 和mybatis的對象參數是一個道理
*  
*/
@Test
public void selectByEntity(){
User user = new User( );
user.setName("劉紅雨");
user.setAge(32);
//生成的sql語句: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name=? AND age=?
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
  
  //條件對象也有封裝條件 它與對象參數的sql生成互不干擾 
  //SELECT id,name,age,email,manager_id,create_time FROM user WHERE name=? AND age=? AND name LIKE ? AND age < ?
  //可以看到兩種條件的添加 sql會做繼續拼接 並不影響各自
 // queryWrapper.like("name", "雨").lt("age", 40);
  //也可以在實體類上做條件
  
/**
* condition = SqlCondition.LIKE 該屬性表示 name 字段在做條件查詢時 sql條件會直接生成 name like CONCAT(‘%’,?,‘%’)
* 當然SqlCondition.LIKE 不止有like

@TableField(condition = SqlCondition.LIKE)
private String name; */
 
 
        
 

List<User> userList = userMapper.selectList(queryWrapper);

userList.forEach(System.out::println);
}
 /**
* allEq的用法
* 添加等值條件查詢
* 生成的sql語句:SELECT id,name,age,email,manager_id,create_time FROM user WHERE name = ? AND age = ?
* 如果 條件添加 是這樣的 例如 params.put("age",null) sql 會生成 and age is null 想要讓sql 對null 值 忽略掉 使用 allEq(params, false)實現
*/
@Test
public void selectAllEq() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String, Object> params = new HashMap<>();

params.put("name", "王天風");
params.put("age", 25);
// queryWrapper.allEq(params);
//生成的sql語句:SELECT id,name,age,email,manager_id,create_time FROM user WHERE name = ? AND age = ?
//如果 條件添加 是這樣的 例如 params.put("age",null) sql 會生成 and age is null 想要讓sql 對null 值 忽略掉 使用 allEq(params, false)實現
// queryWrapper.allEq((k,v)->k.equals("name"),params); 這里使用Lambda函數 也可以實現對null值條件忽略

List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}

  
/**
* List<Map<String,Object>> userList = userMapper.selectMaps(queryWrapper);
* 返回值為map對象 應用於 在查詢時只要個別字段 那么返回對象的話 不需要的字段都為null
* 這樣就不優雅了 所以提供selectMaps()方法 避免null
*/
@Test
public void selectMaps() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "雨").lt("age", 40);
//生成的sql語句 SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ?


List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper);
userList.forEach(System.out::println);

}


/**
* selectMaps()應用場景
* 按照直屬上級分組, 查詢每組 的平均年齡 最大年齡, 最小年齡
* 並且只取年齡總和 小於500的組
*
*/
@Test
public void selectByMaps2(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//生成的sql語句 SELECT avg(age) avg_age,min(age) min_age,max(age)max_age FROM user GROUP BY manager_id HAVING sum(age)<?
queryWrapper.select("avg(age) avg_age","min(age) min_age","max(age)max_age")
.groupBy("manager_id")
.having("sum(age)<{0}", 500);


List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper);
userList.forEach(System.out::println);


}
 
/**
* selectObjs() 做查詢 只會返回 一個列的值 而且是第一列 其他的列都會被舍棄
* 只能在只需要放回一列時使用
*/
@Test
public void selectByobjs(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//生成的sql語句 SELECT avg(age) avg_age,min(age) min_age,max(age)max_age FROM user GROUP BY manager_id HAVING sum(age)<?
queryWrapper.select("avg(age) avg_age","min(age) min_age","max(age)max_age")
.groupBy("manager_id")
.having("sum(age)<{0}", 500);


List<Object> userList = userMapper.selectObjs(queryWrapper);
userList.forEach(System.out::println);
//返回值 40.0000
// 25.0000
// 28.2500 只有avg_age 的值


}

/**
* 查詢總記錄數
*/
@Test
public void selectCount() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//生成的sql語句 SELECT COUNT( 1 ) FROM user WHERE name LIKE ? AND age < ?
queryWrapper.like("name", "雨").lt("age", 40);


Integer count = userMapper.selectCount(queryWrapper);
System.out.println(count);


}
 
        
/**
* selectOne() 只能返回條數據 或者返回空 所以條件必須滿足只有一條數據或沒有
*/
@Test
public void selectOne() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//生成的sql語句  SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ?   
queryWrapper.like("name", "劉紅雨").lt("age", 40);
User count = userMapper.selectOne (queryWrapper);
System.out.println(count);


}
以上就是條件構造器查詢 封裝條件 做查詢 還是有很多細節要掌握 ,認真學習 ,堅持練習沒有不能掌握的知識。


  























}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM