Mybatis-plus實(shí)現(xiàn)join連表查詢(xún)的示例代碼
最近發(fā)現(xiàn)一個(gè)好玩的框架,我們知道m(xù)ybatis-plus在連表查詢(xún)上是不行的,如果需要連表查詢(xún),那么我們就得乖乖的去寫(xiě)xml文件了,但是今天發(fā)現(xiàn)一個(gè)新的框架 mybatis-plus-join。它既包含了mybatis-plus的所有優(yōu)點(diǎn),然后還支持連表查詢(xún),還支持對(duì)多,對(duì)一的查詢(xún),行了廢話(huà)不多說(shuō)直接看代碼吧。
一、數(shù)據(jù)庫(kù)DDL
測(cè)試的數(shù)據(jù)庫(kù),本測(cè)試基于mysql數(shù)據(jù)庫(kù)。
/* Navicat Premium Data Transfer Source Server : 本地?cái)?shù)據(jù)庫(kù) Source Server Type : MySQL Source Server Version : 50710 Source Host : localhost:3306 Source Schema : test-1 Target Server Type : MySQL Target Server Version : 50710 File Encoding : 65001 Date: 07/12/2022 15:35:14 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for tb_dept -- ---------------------------- DROP TABLE IF EXISTS `tb_dept`; CREATE TABLE `tb_dept` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '部門(mén)名稱(chēng)', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0), `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0), PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '部門(mén)' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of tb_dept -- ---------------------------- INSERT INTO `tb_dept` VALUES (1, '人事部', '2022-12-07 13:06:06', '2022-12-07 13:06:06'); INSERT INTO `tb_dept` VALUES (2, '采購(gòu)部', '2022-12-07 13:06:13', '2022-12-07 13:06:13'); INSERT INTO `tb_dept` VALUES (3, '開(kāi)發(fā)部', '2022-12-07 13:06:17', '2022-12-07 13:06:17'); -- ---------------------------- -- Table structure for tb_post -- ---------------------------- DROP TABLE IF EXISTS `tb_post`; CREATE TABLE `tb_post` ( `id` int(11) NOT NULL AUTO_INCREMENT, `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '職位名稱(chēng)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '職位' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of tb_post -- ---------------------------- INSERT INTO `tb_post` VALUES (1, '人事經(jīng)理'); INSERT INTO `tb_post` VALUES (2, '人事專(zhuān)員'); INSERT INTO `tb_post` VALUES (3, '采購(gòu)經(jīng)理'); INSERT INTO `tb_post` VALUES (4, '采購(gòu)專(zhuān)員'); INSERT INTO `tb_post` VALUES (5, '技術(shù)總監(jiān)'); INSERT INTO `tb_post` VALUES (6, '技術(shù)經(jīng)理'); -- ---------------------------- -- Table structure for tb_user -- ---------------------------- DROP TABLE IF EXISTS `tb_user`; CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用戶(hù)名', `post_id` int(11) NULL DEFAULT NULL COMMENT '職位id', `dept_id` int(11) NULL DEFAULT NULL COMMENT '部門(mén)id', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '創(chuàng)建時(shí)間', `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改時(shí)間', `created` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'snail' COMMENT '創(chuàng)建人', `updated` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'snail' COMMENT '修改人', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '測(cè)試用戶(hù)表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of tb_user -- ---------------------------- INSERT INTO `tb_user` VALUES (1, 'admin', 1, 1, '2022-12-07 12:03:20', '2022-12-07 12:03:20', 'snail', 'snail'); INSERT INTO `tb_user` VALUES (2, 'test', 2, 1, '2022-12-07 12:03:51', '2022-12-07 12:03:51', 'snail', 'snail'); INSERT INTO `tb_user` VALUES (3, 'test1', 1, 1, '2022-12-07 12:04:03', '2022-12-07 12:04:03', 'snail', 'snail'); SET FOREIGN_KEY_CHECKS = 1;
二、JAVA代碼
實(shí)體類(lèi)
package com.wssnail.model; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * 測(cè)試用戶(hù)表 * </p> * * @author 熟透的蝸牛 * @since 2022-12-07 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("tb_user") @ApiModel(value="User對(duì)象", description="測(cè)試用戶(hù)表") public class User implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主鍵") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "用戶(hù)名") private String userName; @ApiModelProperty(value = "職位id") private Integer postId; @ApiModelProperty(value = "部門(mén)id") private Integer deptId; @ApiModelProperty(value = "創(chuàng)建時(shí)間") private LocalDateTime createTime; @ApiModelProperty(value = "修改時(shí)間") private LocalDateTime updateTime; @ApiModelProperty(value = "創(chuàng)建人") private String created; @ApiModelProperty(value = "修改人") private String updated; }
package com.wssnail.model; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * 職位 * </p> * * @author 熟透的蝸牛 * @since 2022-12-07 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("tb_post") @ApiModel(value="Post對(duì)象", description="職位") public class Post implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "職位名稱(chēng)") private String postName; }
package com.wssnail.model; import com.baomidou.mybatisplus.annotation.IdType; import java.time.LocalDateTime; import java.io.Serializable; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * 部門(mén) * </p> * * @author 熟透的蝸牛 * @since 2022-12-07 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("tb_dept") @ApiModel(value="Dept對(duì)象", description="部門(mén)") public class Dept implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主鍵") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "部門(mén)名稱(chēng)") private String deptName; private LocalDateTime createTime; private LocalDateTime updateTime; }
業(yè)務(wù)實(shí)體類(lèi)
package com.wssnail.model.bo; import com.wssnail.model.Post; import com.wssnail.model.User; import lombok.Data; import java.util.List; /** * @Author: 熟透的蝸牛 * @CreateTime: 2022-12-07 13:57 * @Description: 一個(gè)崗位下有多個(gè)人 * @Version: 1.0 */ @Data public class PostUserDo extends Post { private List<User> userList; }
package com.wssnail.model.bo; import com.wssnail.model.User; import lombok.Data; /** * @Author: 熟透的蝸牛 * @CreateTime: 2022-12-07 13:57 * @Description: TODO * @Version: 1.0 */ @Data public class UserDo extends User { //崗位名稱(chēng) private String postName; //部門(mén)名稱(chēng) private String deptName; }
mapper接口,注意接口不再繼承BaseMapper 而是繼承了MPJBaseMapper
@Repository public interface DeptMapper extends MPJBaseMapper<Dept> { } @Repository public interface PostMapper extends MPJBaseMapper<Post> { } @Repository public interface UserMapper extends MPJBaseMapper<User> { }
service接口也不是繼承BaseService而是繼承了MPJBaseService,這個(gè)繼承不是必須的,我這里實(shí)現(xiàn)了繼承
public interface UserService extends MPJBaseService<User> { List<UserDo> listByPage(String postName, String userName); } public interface PostService extends MPJBaseService<Post> { List <PostUserDo> listPostUser(); } public interface DeptService extends MPJBaseService<Dept> { }
service接口實(shí)現(xiàn)類(lèi),代碼里有詳細(xì)注釋
簡(jiǎn)單的連表查詢(xún)
package com.wssnail.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.wssnail.mapper.UserMapper; import com.wssnail.model.Dept; import com.wssnail.model.Post; import com.wssnail.model.User; import com.wssnail.model.bo.UserDo; import com.wssnail.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * <p> * 測(cè)試用戶(hù)表 服務(wù)實(shí)現(xiàn)類(lèi) * </p> * * @author 熟透的蝸牛 * @since 2022-12-07 */ @Service public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implements UserService { @Autowired private UserMapper userMapper; //這里對(duì)應(yīng)主表的mapper /* * @description: * 連表分頁(yè)查詢(xún),以下示例代碼為左連接查詢(xún) * 內(nèi)連接方法 innerJoin() * 右連接方法 rightJoin() 和這個(gè)使用方法一樣 * @date: 2022/12/7 14:05 * @param postName * @param userName * @return: java.util.List<com.wssnail.model.bo.UserDo> **/ @Override public List<UserDo> listByPage(String postName, String userName) { MPJLambdaWrapper<User> userMPJLambdaWrapper = new MPJLambdaWrapper<User>() .selectAll(User.class) //查詢(xún)主表所有的字段 .select(Dept::getDeptName) //查詢(xún)部門(mén)表的部門(mén)名稱(chēng) .select(Post::getPostName) //查詢(xún)崗位表的 崗位名稱(chēng) .leftJoin(Dept.class, Dept::getId, User::getDeptId) //左連接查詢(xún),相當(dāng)于 left join dept on dept.id=user.dept_id .leftJoin(Post.class, Post::getId, User::getPostId) // 左連接查詢(xún),相當(dāng)于 left join post on post.id=user.post_id .eq(Post::getPostName, postName) .like(User::getUserName, userName); //返回自定義的數(shù)據(jù),相當(dāng)于執(zhí)行如下SQL,可以看出主表別名為t 其他表名依次為t1,t2......... // SELECT // t.id, // t.user_name, // t.post_id, // t.dept_id, // t.create_time, // t.update_time, // t.created, // t.updated, // t1.dept_name, // t2.post_name // FROM // tb_user t // LEFT JOIN tb_dept t1 ON ( t1.id = t.dept_id ) // LEFT JOIN tb_post t2 ON ( t2.id = t.post_id ) // WHERE // ( // t2.post_name = ? // AND t.user_name LIKE ?) // List<UserDo> userDos = userMapper.selectJoinList(UserDo.class, userMPJLambdaWrapper); // return userDos; //分頁(yè)查詢(xún)等于執(zhí)行如下SQL,分頁(yè)查詢(xún)需要 配置mybatis plus 分頁(yè)插件,詳情見(jiàn) com.wssnail.config.MybatisPageConfig 類(lèi) // SELECT // t.id, // t.user_name, // t.post_id, // t.dept_id, // t.create_time, // t.update_time, // t.created, // t.updated, // t1.dept_name, // t2.post_name // FROM // tb_user t // LEFT JOIN tb_dept t1 ON ( t1.id = t.dept_id ) // LEFT JOIN tb_post t2 ON ( t2.id = t.post_id ) // WHERE // ( // t2.post_name = ? // AND t.user_name LIKE ?) // LIMIT ? Page<User> page = new Page<>(); IPage<UserDo> userDoIPage = userMapper.selectJoinPage(page, UserDo.class, userMPJLambdaWrapper); return userDoIPage.getRecords(); } }
對(duì)多查詢(xún)
package com.wssnail.service.impl; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.wssnail.mapper.PostMapper; import com.wssnail.model.Post; import com.wssnail.model.User; import com.wssnail.model.bo.PostUserDo; import com.wssnail.service.PostService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * <p> * 職位 服務(wù)實(shí)現(xiàn)類(lèi) * </p> * * @author 熟透的蝸牛 * @since 2022-12-07 */ @Service public class PostServiceImpl extends MPJBaseServiceImpl<PostMapper, Post> implements PostService { @Autowired private PostMapper postMapper; @Override public List<PostUserDo> listPostUser() { //相當(dāng)于執(zhí)行如下SQL ,以下示例代碼是對(duì)多查詢(xún),對(duì)一查詢(xún)使用 selectAssociation()方法,用法與此相同 // SELECT // t.id, // t.post_name, // t1.id AS join_id, // t1.user_name, // t1.post_id, // t1.dept_id, // t1.create_time, // t1.update_time, // t1.created, // t1.updated // FROM // tb_post t // LEFT JOIN tb_user t1 ON ( // t1.post_id = t.id) // 等價(jià)于 如下的xml配置 // <resultMap id="xxxxxxxx" type="com.wssnail.model.bo.PostUserDo"> // <result property="id" column="id"/> // <result property="postName" column="post_name"/> // <!--其他屬性省略--> // <collection property="userList" javaType="java.util.List" // ofType="com.wssnail.model.User"> // <id property="id" column="id"/> // <result property="userName" column="user_name"/> // <!--其他屬性省略--> // </collection> // </resultMap> //返回?cái)?shù)據(jù)如下 ,注意由于嵌套結(jié)果方式會(huì)導(dǎo)致結(jié)果集被折疊,因此分頁(yè)查詢(xún)的結(jié)果在折疊后總數(shù)會(huì)減少,所以無(wú)法保證分頁(yè)結(jié)果數(shù)量正確。 // [{ // "id": 1, // "postName": "人事經(jīng)理", // "userList": [{ // "id": 1, // "userName": "admin", // "postId": 1, // "deptId": 1, // "createTime": "2022-12-07T12:03:20", // "updateTime": "2022-12-07T12:03:20", // "created": "snail", // "updated": "snail" // }, { // "id": 3, // "userName": "test1", // "postId": 1, // "deptId": 1, // "createTime": "2022-12-07T12:04:03", // "updateTime": "2022-12-07T12:04:03", // "created": "snail", // "updated": "snail" // }] // }, { // "id": 2, // "postName": "人事專(zhuān)員", // "userList": [{ // "id": 2, // "userName": "test", // "postId": 2, // "deptId": 1, // "createTime": "2022-12-07T12:03:51", // "updateTime": "2022-12-07T12:03:51", // "created": "snail", // "updated": "snail" // }] // }, { // "id": 3, // "postName": "采購(gòu)經(jīng)理", // "userList": [] // }] MPJLambdaWrapper<Post> postMPJLambdaWrapper = new MPJLambdaWrapper<Post>().selectAll(Post.class) .selectCollection(User.class, PostUserDo::getUserList) .leftJoin(User.class, User::getPostId, Post::getId);//一對(duì)多查詢(xún) List<PostUserDo> postUserDos = postMapper.selectJoinList(PostUserDo.class, postMPJLambdaWrapper); return postUserDos; } }
分頁(yè)配置
package com.wssnail.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPageConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
三、pom依賴(lài)和配置文件
server: port: 8090 spring: application: name: test datasource: url: jdbc:mysql://127.0.0.1:3306/test-1?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai username: root password: snail pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: false params: count=countsql #打印sql mybatis-plus: configuration: mapper-locations: classpath*:mapper/*Mapper.xml log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.wssnail</groupId> <artifactId>test-mybatis-plus-join</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.2</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join-boot-starter</artifactId> <version>1.3.8</version> </dependency> <!--swagger--> <dependency> <groupId>com.spring4all</groupId> <artifactId>swagger-spring-boot-starter</artifactId> <version>1.9.1.RELEASE</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> </dependencies> </project>
以上就是本人測(cè)試的結(jié)果,還有很多使用方法沒(méi)有一一驗(yàn)證,如果感興趣的可以參考源代碼,自己動(dòng)手試試
https://gitee.com/best_handsome/mybatis-plus-join
到此這篇關(guān)于Mybatis-plus實(shí)現(xiàn)join連表查詢(xún)的示例代碼的文章就介紹到這了,更多相關(guān)Mybatis-plus join連表查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis-Plus多表關(guān)聯(lián)查詢(xún)的使用案例解析
- MyBatis多表查詢(xún)和注解開(kāi)發(fā)案例詳解
- mybatis-plus多表分頁(yè)查詢(xún)最佳實(shí)現(xiàn)方法(非常簡(jiǎn)單)
- MyBatis中ResultMap與多表查詢(xún)的處理方法
- MybatisPlus多表連接查詢(xún)的具體實(shí)現(xiàn)
- mybatis于xml方式和注解方式實(shí)現(xiàn)多表查詢(xún)的操作方法
- mybatis-plus多表查詢(xún)操作方法
- MyBatis?實(shí)現(xiàn)動(dòng)態(tài)排序的多表查詢(xún)
- 深入解析MybatisPlus多表連接查詢(xún)
- Mybatis分頁(yè)查詢(xún)主從表的實(shí)現(xiàn)示例
- mybatis連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)雙表查詢(xún)
相關(guān)文章
java實(shí)現(xiàn)紙牌游戲之小貓釣魚(yú)算法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)紙牌游戲之小貓釣魚(yú)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01SpringBoot之使用Feign實(shí)現(xiàn)微服務(wù)間的交互
這篇文章主要介紹了SpringBoot中使用Feign實(shí)現(xiàn)微服務(wù)間的交互,對(duì)微服務(wù)這方面感興趣的小伙伴可以參考閱讀本文2023-03-03Java中解密微信加密數(shù)據(jù)工具類(lèi)
最近小編一直在開(kāi)發(fā)微信公眾號(hào)、小程序項(xiàng)目,微信返回給我們的數(shù)據(jù)都是加密的,我們需要使用sessionkey配合解密,才能看到我們想要的數(shù)據(jù),基于代碼怎么實(shí)現(xiàn)呢,下面小編給大家?guī)?lái)了Java中解密微信加密數(shù)據(jù)工具類(lèi)的完整代碼,一起看看吧2021-06-06零基礎(chǔ)入門(mén)學(xué)習(xí)——Spring Boot注解(一)
這篇文章主要介紹了Spring Boot注解學(xué)習(xí)(一)要點(diǎn),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-05-05springboot整合mybatis-plus代碼生成器的配置解析
這篇文章主要介紹了springboot整合mybatis-plus代碼生成器的配置解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之背包問(wèn)題
背包問(wèn)題是一個(gè)非常典型的考察動(dòng)態(tài)規(guī)劃應(yīng)用的題目,對(duì)其加上不同的限制和條件,可以衍生出諸多變種,若要全面理解動(dòng)態(tài)規(guī)劃,就必須對(duì)背包問(wèn)題了如指掌2022-02-02