SpringBoot 闆嗘垚 Mybatis-Plus锛孡ambdaQueryWrapper 浣跨敤鏂规硶

馃彎锔?鍗氫富浠嬬粛

澶у濂斤紝鎴戞槸 涓€涓惉鐮栫殑鍐滄皯宸?/font>锛屽緢楂樺叴璁よ瘑澶у 馃槉 ~
馃懆鈥嶐煄?涓汉浠嬬粛锛氭湰浜烘槸涓€鍚嶅悗绔疛ava寮€鍙戝伐绋嬪笀锛屽潗鏍囧寳浜?~
馃帀 鎰熻阿鍏虫敞 馃摉 涓€璧峰涔?/font> 馃摑 涓€璧疯璁?馃寛 涓€璧疯繘姝?~
馃檹 浣滆€呮按骞虫湁闄愶紝娆㈣繋鍚勪綅澶т浆鎸囨鐣欒█锛岀浉浜掑涔犺繘姝?~

鐩綍

  • 馃彎锔?鍗氫富浠嬬粛
  • 1. mybatis閰嶇疆 馃殌
  • 2. Wrapper 鍖呰绫?馃殌
    • 馃寛 2.1 Mybatis 涓彁渚涗簡鍝簺 Wrapper 鍖呰绫伙紵
    • 馃寛 2.2 QueryWrapper 甯哥敤鏂规硶
    • 馃寛 2.3 QueryWrapper 澶嶆潅鏂规硶
    • 馃寛 2.4 LambdaQueryWrapper 甯哥敤鏂规硶
    • 馃寛 2.5 LambdaQueryWrapper 澶嶆潅鏂规硶
    • 馃寛 2.6 鎬荤粨

鈿?婧?鐮侊細SpringBoot 闆嗘垚 Mybatis-Plus

1. mybatis閰嶇疆 馃殌

馃崻 1.maven渚濊禆


   <dependency>
       <groupId>org.springframework.bootgroupId>
       <artifactId>spring-boot-starter-webartifactId>
   dependency>
   
   <dependency>
       <groupId>mysqlgroupId>
       <artifactId>mysql-connector-javaartifactId>
   dependency>
   
   <dependency>
       <groupId>com.baomidougroupId>
       <artifactId>mybatis-plus-boot-starterartifactId>
       <version>3.2.0version>
   dependency>
   
   <dependency>
       <groupId>org.projectlombokgroupId>
       <artifactId>lombokartifactId>
   dependency>
dependencies>

馃崻 2.yaml閰嶇疆

server:
  port: 8089

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3309/swp?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8
    username: root
    password: root

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml # XML 閰嶇疆鏂囦欢璺緞
  type-aliases-package: swp.basis.entity # 瀹炰綋绫诲寘璺緞
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 鎸囧畾 MyBatis 浣跨敤 stdout 浣滀负鏃ュ織瀹炵幇

馃崻 3.瀹炰綋绫?/strong>

@Data
@TableName(value = "user") //mybatis-plus娉ㄨВ
public class UserEntity extends BaseDO implements Serializable {
    private static final long serialVersionUID = 1903236519513043621L;

    @TableId(type = IdType.AUTO) // 渚濊禆浜庢暟鎹簱鑷锛岄€氳繃entity.getId()杩斿洖id
    private Long id;

    /**
     * 鍚嶇О
     */
    @TableField(condition = SqlCondition.LIKE, whereStrategy = FieldStrategy.NOT_EMPTY)
    private String name;

    /**
     * 鎬у埆
     */
    private Integer sex;

    /**
     * 鐘舵€?
     * 浣跨敤 {@link swp.basis.enums.StatusEnum} 鏋氫妇
     */
    private Integer status;

    /**
     * 鏃ユ湡
     */
    // 蹇界暐锛屽拷鐣ヨ瀛楁鐨勭瓥鐣ワ紝榛樿绛栫暐鏄笉鑳戒慨鏀逛负null锛岄伩鍏嶆暟鎹敊璇€?/span>
    // 浣胯皟鐢╱pdate鏂规硶鏃跺彲浠ユ洿鏂癲ate涓簄ull
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private LocalDateTime date;



}

馃崻 4.DAO
dao鎺ュ彛闇€瑕佺户鎵緽aseMapper锛屾硾鍨嬩负瀹炰綋绫?/p>

public interface UserDao extends BaseMapper<UserEntity> {
}

馃崻 5.service
service鎺ュ彛闇€瑕佺户鎵縄Service锛屾硾鍨嬩负瀹炰綋绫?/p>

public interface UserService extends IService<UserEntity> {
}

馃崻 6.serviceImpl
serviceImpl瀹炵幇service鎺ュ彛锛屽苟缁ф壙ServiceImpl绫伙紝娉涘瀷涓篋AO鎺ュ彛鍜屽疄浣撶被

@Service
public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {
}

馃崻 7.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="swp.basis.dao.UserDao">
</mapper>

娉細璁板緱鍦ㄥ惎鍔ㄧ被鍔犱笂@MapperScan(basePackages = 鈥渟wp.basis.dao鈥?娉ㄨВ锛屾垨鑰呭湪姣忎釜dao鍔犱笂@Mapper

2. Wrapper 鍖呰绫?馃殌

濡傚浘 BaseMapper 绫讳腑鐨勪竴浜涙煡璇€佷慨鏀广€佸垹闄ゆ帴鍙d細鐢ㄥ埌 Wrapper 鍖呰绫伙紝閭d箞杩欎釜 Wrapper 鍖呰绫诲簲璇ユ€庝箞浣跨敤鍛?/p>

SpringBoot 闆嗘垚 Mybatis-Plus锛孡ambdaQueryWrapper 浣跨敤鏂规硶

馃寛 2.1 Mybatis 涓彁渚涗簡鍝簺 Wrapper 鍖呰绫伙紵

Mybatis-Plus 鎻愪緵浜嗗绉?Wrapper 绫诲瀷锛屽叿浣撲娇鐢ㄥ摢绉?Wrapper 绫诲瀷鍙栧喅浜庡紑鍙戣€呯殑闇€姹傚拰涓汉涔犳儻銆備互涓嬫槸 Mybatis-Plus 甯哥敤鐨?Wrapper 绫诲瀷鍜岄€傜敤鍦烘櫙锛?/p>

馃崉 QueryWrapper

QueryWrapper 鏄?Mybatis-Plus 鏈€甯哥敤鐨?Wrapper 绫诲瀷涔嬩竴锛岀敤浜庢瀯寤烘煡璇㈡潯浠躲€傚彲浠ヤ娇鐢?br /> QueryWrapper 杩涜绛夊€兼煡璇€佹ā绯婃煡璇€佽寖鍥存煡璇€佹帓搴忕瓑鎿嶄綔銆備娇鐢?QueryWrapper
杩涜鏌ヨ鏃讹紝闇€瑕佹寚瀹氭煡璇㈢殑瀹炰綋绫伙紝Wrapper 浼氭牴鎹疄浣撶被鐨勫睘鎬ц嚜鍔ㄧ敓鎴愭煡璇㈡潯浠躲€傞€傜敤浜庡ぇ閮ㄥ垎鏌ヨ鍦烘櫙銆?/p>

馃崉 UpdateWrapper

UpdateWrapper 鏄敤浜庢瀯寤烘洿鏂版潯浠剁殑 Wrapper 绫诲瀷锛屽彲浠ヤ娇鐢?UpdateWrapper
杩涜绛夊€兼洿鏂般€佽嚜澧炴洿鏂般€佹潯浠舵洿鏂扮瓑鎿嶄綔銆備娇鐢?UpdateWrapper 杩涜鏇存柊鏃讹紝闇€瑕佹寚瀹氭洿鏂扮殑瀹炰綋绫诲拰鏇存柊鏉′欢锛學rapper
浼氭牴鎹疄浣撶被鐨勫睘鎬ц嚜鍔ㄧ敓鎴愭洿鏂版潯浠躲€傞€傜敤浜庡ぇ閮ㄥ垎鏇存柊鍦烘櫙銆?/p>

馃崉 LambdaQueryWrapper

LambdaQueryWrapper 鏄娇鐢?Lambda 琛ㄨ揪寮忔瀯寤烘煡璇㈡潯浠剁殑 Wrapper 绫诲瀷锛屽彲浠ヤ娇鐢?br /> LambdaQueryWrapper 杩涜绛夊€兼煡璇€佹ā绯婃煡璇€佽寖鍥存煡璇€佹帓搴忕瓑鎿嶄綔銆侺ambdaQueryWrapper 鍙互浣跨敤
Java 8 鐨?Lambda 琛ㄨ揪寮忚繘琛屾潯浠舵瀯寤猴紝浠g爜鏇村姞绠€娲佹槗璇汇€傞€傜敤浜庨渶瑕佷娇鐢?Lambda 琛ㄨ揪寮忚繘琛屾潯浠舵瀯寤虹殑鏌ヨ鍦烘櫙銆?/p>

馃崉 LambdaUpdateWrapper

LambdaUpdateWrapper 鏄娇鐢?Lambda 琛ㄨ揪寮忔瀯寤烘洿鏂版潯浠剁殑 Wrapper 绫诲瀷锛屽彲浠ヤ娇鐢?br /> LambdaUpdateWrapper 杩涜绛夊€兼洿鏂般€佽嚜澧炴洿鏂般€佹潯浠舵洿鏂扮瓑鎿嶄綔銆侺ambdaUpdateWrapper 鍙互浣跨敤 Java
8 鐨?Lambda 琛ㄨ揪寮忚繘琛屾潯浠舵瀯寤猴紝浠g爜鏇村姞绠€娲佹槗璇汇€傞€傜敤浜庨渶瑕佷娇鐢?Lambda 琛ㄨ揪寮忚繘琛屾潯浠舵瀯寤虹殑鏇存柊鍦烘櫙銆?/p>

馃寛 2.2 QueryWrapper 甯哥敤鏂规硶

Mybatis-Plus 鐨?QueryWrapper 鎻愪緵浜嗗涓柟娉曪紝鍙互鐢ㄤ簬鏋勫缓鏌ヨ鏉′欢銆備互涓嬫槸 QueryWrapper 涓父鐢ㄧ殑鏂规硶鍙婂叾鐢ㄦ硶绀轰緥锛?/p>

// 1.绛夊€兼煡璇紝鐢ㄤ簬鍖归厤鎸囧畾瀛楁绛変簬鎸囧畾鍊肩殑璁板綍
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "寮犱笁");

// 2.涓嶇瓑浜庢煡璇紝鐢ㄤ簬鍖归厤鎸囧畾瀛楁涓嶇瓑浜庢寚瀹氬€肩殑璁板綍
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ne("age", 18);

// 3.澶т簬鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈靛ぇ浜庢寚瀹氬€肩殑璁板綍銆?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 18);

// 4.澶т簬绛変簬鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈靛ぇ浜庣瓑浜庢寚瀹氬€肩殑璁板綍
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ge("age", 18);

// 5.灏忎簬鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈靛皬浜庢寚瀹氬€肩殑璁板綍
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lt("age", 18);

// 6.灏忎簬绛変簬鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈靛皬浜庣瓑浜庢寚瀹氬€肩殑璁板綍銆?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.le("age", 18);

// 7.鑼冨洿鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈靛湪鎸囧畾鑼冨洿鍐呯殑璁板綍銆?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age", 18, 25);

// 8.妯$硦鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈靛寘鍚寚瀹氬瓧绗︿覆鐨勮褰曘€傚彲浠ヤ娇鐢?% 閫氶厤绗﹁〃绀轰换鎰忓瓧绗︼紝浣跨敤 _ 閫氶厤绗﹁〃绀轰换鎰忓崟涓瓧绗︺€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "寮?");

// 9.涓嶅寘鍚煡璇紝鐢ㄤ簬鍖归厤鎸囧畾瀛楁涓嶅寘鍚寚瀹氬瓧绗︿覆鐨勮褰曘€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.notLike("name", "%涓?);

// 10.IN 鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈靛湪鎸囧畾闆嗗悎鍐呯殑璁板綍銆?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
List<Integer> ages = Arrays.asList(18, 20, 22);
wrapper.in("age", ages);

// 11.NOT IN 鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈典笉鍦ㄦ寚瀹氶泦鍚堝唴鐨勮褰曘€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
List<Integer> ages = Arrays.asList(18, 20, 22);
wrapper.notIn("age", ages);

// 12.NULL 鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈典负 NULL 鐨勮褰曘€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNull("email");

// 13.NOT NULL 鏌ヨ锛岀敤浜庡尮閰嶆寚瀹氬瓧娈典笉涓?NULL 鐨勮褰曘€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("email");

// 14.鍗囧簭鎺掑簭锛岀敤浜庢寜鐓ф寚瀹氬瓧娈靛崌搴忔帓鍒楁煡璇㈢粨鏋溿€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("age", "name");

// 15.闄嶅簭鎺掑簭锛岀敤浜庢寜鐓ф寚瀹氬瓧娈甸檷搴忔帓鍒楁煡璇㈢粨鏋溿€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("age", "name");

// 16.鍒嗙粍鏌ヨ锛岀敤浜庢寜鐓ф寚瀹氬瓧娈佃繘琛屽垎缁勬煡璇€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("age", "count(*)").groupBy("age");

// 17.HAVING 瀛愬彞鏌ヨ锛岀敤浜庣瓫閫夊垎缁勬煡璇㈢粨鏋溿€?/span>
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("age", "count(*)").groupBy("age").having("age > {0} and count(*) > 1", 18);
List<User> userList = userMapper.selectList(wrapper); //  {0} 鍗犱綅绗﹁〃绀哄弬鏁?18锛岃〃绀虹瓫閫夊嚭 age 澶т簬 18 鐨勮褰曘€?/span>

馃寛 2.3 QueryWrapper 澶嶆潅鏂规硶

// 1. nested(Consumer> consumer)
宓屽鏌ヨ锛岀敤浜庢瀯寤哄鏉傜殑鏌ヨ鏉′欢銆傚彲浠ヤ娇鐢ㄥ涓?nested 鏂规硶宓屽澶氫釜鏌ヨ鏉′欢锛屼粠鑰屽疄鐜版洿鍔犲鏉傜殑鏌ヨ銆?

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.nested(qw -> qw.eq("name", "寮犱笁").or().eq("name", "鏉庡洓"))
       .and(qw -> qw.gt("age", 18).lt("age", 30));

// 2.  apply(String applySql, Object... params)
鑷畾涔?SQL 鏌ヨ锛岀敤浜庣洿鎺ヤ娇鐢?SQL 璇彞鏌ヨ鏁版嵁銆傚彲浠ヤ娇鐢?{0}銆?span >{1} 绛夊崰浣嶇琛ㄧず鍙傛暟銆?
宓屽鏌ヨ锛岀敤浜庢瀯寤哄鏉傜殑鏌ヨ鏉′欢銆傚彲浠ヤ娇鐢ㄥ涓?nested 鏂规硶宓屽澶氫釜鏌ヨ鏉′欢锛屼粠鑰屽疄鐜版洿鍔犲鏉傜殑鏌ヨ銆?

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.apply("name like {0} or age > {1}", "%寮?", 18);

 // 3. last(String lastSql)
鍦?SQL 璇彞鐨勬渶鍚庢坊鍔犻澶栫殑鏉′欢锛岀敤浜庢瀯寤哄鏉傜殑鏌ヨ鏉′欢銆傚彲浠ヤ娇鐢ㄥ涓?last 鏂规硶娣诲姞澶氫釜棰濆鐨勬潯浠讹紝浠庤€屽疄鐜版洿鍔犲鏉傜殑鏌ヨ銆?

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 18).last("limit 10");

 // 4. select(String... columns)
鎸囧畾鏌ヨ鐨勫瓧娈碉紝鐢ㄤ簬鏌ヨ鎸囧畾鐨勫瓧娈佃€岄潪鍏ㄩ儴瀛楁銆?

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("name", "age");

 // 5.allEq(Map params, boolean null2IsNull)
浣跨敤 Map 瀵硅薄浣滀负鏌ヨ鏉′欢锛岃繘琛岀瓑鍊煎尮閰嶆煡璇€傚彲浠ラ€氳繃绗簩涓弬鏁版寚瀹氭槸鍚﹀皢 null 鍊艰浆鎹负 is null 鏉′欢銆?

QueryWrapper<User> wrapper = new QueryWrapper<>();
Map<String, Object> params = new HashMap<>();
params.put("name", "寮犱笁");
params.put("age", 18);
wrapper.allEq(params, false);

馃寛 2.4 LambdaQueryWrapper 甯哥敤鏂规硶

lambdaQueryWrapper.eq(User::getId, 1L); // 绛変环浜?where id = 1

lambdaQueryWrapper.ne(User::getStatus, "DISABLED"); // 绛変环浜?where status <> 'DISABLED'

lambdaQueryWrapper.gt(User::getAge, 18); // 绛変环浜?where age > 18

lambdaQueryWrapper.ge(User::getCreateTime, LocalDateTime.now().minusDays(30)); // 绛変环浜?where create_time >= ?

lambdaQueryWrapper.lt(User::getAge, 30); // 绛変环浜?where age < 30

lambdaQueryWrapper.le(User::getUpdateTime, LocalDateTime.now()); // 绛変环浜?where update_time <= ?

lambdaQueryWrapper.like(User::getName, "Tom"); // 绛変环浜?where name like '%Tom%'

lambdaQueryWrapper.notLike(User::getName, "admin"); // 绛変环浜?where name not like '%admin%'

List<Integer> ids = Arrays.asList(1, 2, 3);
lambdaQueryWrapper.in(User::getId, ids); // 绛変环浜?where id in (1, 2, 3)

List<Integer> ids = Arrays.asList(1, 2, 3);
lambdaQueryWrapper.notIn(User::getId, ids); // 绛変环浜?where id not in (1, 2, 3)

lambdaQueryWrapper.isNull(User::getEmail); // 绛変环浜?where email is null

lambdaQueryWrapper.isNotNull(User::getPhone); // 绛変环浜?where phone is not null

lambdaQueryWrapper.orderByAsc(User::getAge); // 绛変环浜?order by age asc

lambdaQueryWrapper.orderByDesc(User::getCreateTime); // 绛変环浜?order by create_time desc

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

馃寛 2.5 LambdaQueryWrapper 澶嶆潅鏂规硶

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.nested(wrapper -> wrapper.eq(User::getAge, 20).or().eq(User::getAge, 30));
// 绛変环浜?where (age = 20 or age = 30)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.exists("select 1 from user_role where user_role.user_id = user.id and user_role.role_id = 1");
// 绛変环浜?where exists (select 1 from user_role where user_role.user_id = user.id and user_role.role_id = 1)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.inSql(User::getId, "select user_id from user_role where role_id = 1");
// 绛変环浜?where id in (select user_id from user_role where role_id = 1)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.and(wrapper -> wrapper.eq(User::getAge, 20).eq(User::getStatus, "ENABLED"));
// 绛変环浜?where age = 20 and status = 'ENABLED'

lambdaQueryWrapper.or(wrapper -> wrapper.eq(User::getAge, 30).eq(User::getStatus, "DISABLED"));
// 绛変环浜?where age = 30 or status = 'DISABLED'

馃寛 2.6 鎬荤粨

  1. 琛ㄨ揪寮忔柟寮忎笉鍚?/font>锛?LambdaQueryWrapper 浣跨敤 Lambda 琛ㄨ揪寮忔潵缂栧啓鏌ヨ鏉′欢锛岃€?QueryWrapper 浣跨敤瀛楃涓叉柟寮忕紪鍐欐煡璇㈡潯浠躲€?/li>
  2. 鏌ヨ鏉′欢鐨勭被鍨?/font>锛?LambdaQueryWrapper 閫傜敤浜庡疄浣撶被灞炴€ц緝澶氱殑鎯呭喌锛屽彲浠ョ伒娲荤殑浣跨敤 Lambda 琛ㄨ揪寮忔潵鏋勫缓鏌ヨ鏉′欢銆傝€?QueryWrapper 鍒欓€傜敤浜庡疄浣撶被灞炴€ц緝灏戯紝鏌ヨ鏉′欢姣旇緝绠€鍗曠殑鎯呭喌銆?/li>
  3. 璇硶閿欒鎻愮ず锛歀ambdaQueryWrapper 鍦ㄧ紪鍐欐煡璇㈡潯浠舵椂锛岀紪璇戝櫒浼氬 Lambda 琛ㄨ揪寮忚繘琛岃娉曟鏌ワ紝濡傛灉鍑虹幇閿欒鍒欎細鎻愮ず锛岃€?QueryWrapper 鍒欓渶瑕佸湪杩愯鏃舵墠鑳藉彂鐜拌娉曢敊璇€?/li>
  4. 鍙鎬?/font>锛歀ambdaQueryWrapper 鐨勬煡璇㈡潯浠朵娇鐢?Lambda 琛ㄨ揪寮忕紪鍐欙紝鍙鎬ц緝楂橈紝鍙互鐩磋鐨勭湅鍑烘煡璇㈡潯浠剁殑鍚箟锛涜€?QueryWrapper 鍒欎娇鐢ㄥ瓧绗︿覆鏂瑰紡缂栧啓鏌ヨ鏉′欢锛屽彲璇绘€х浉瀵硅緝宸€?/li>

鎬荤殑鏉ヨ锛孡ambdaQueryWrapper 鍜?QueryWrapper 閮芥湁鍚勮嚜鐨勪紭鍔匡紝涓嶈繃涓汉鎺ㄨ崘浣跨敤 LambdaQueryWrapper

上一篇:Spring Boot实战:使用策略模式优化商品推荐系统
下一篇:p3110故障码(三星平板P3110刷机失败怎么办)