亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MybatisPlus多表連接查詢的問題及解決方案

 更新時(shí)間:2022年01月23日 17:20:49   作者:Java知識(shí)圖譜  
MybatisPlus官方并沒有提供多表連接查詢的通用解決方案,然而連接查詢是相當(dāng)普遍的需求,今天通過本文給大家介紹下MybatisPlus多表連接查詢的問題及解決方案,感興趣的朋友一起看看吧

一、序言

(一)背景內(nèi)容

軟件應(yīng)用技術(shù)架構(gòu)中DAO層最常見的選型組件為MyBatis,熟悉MyBatis的朋友都清楚,曾幾何時(shí)MyBatis是多么的風(fēng)光,使用XML文件解決了復(fù)雜的數(shù)據(jù)庫訪問的難題。時(shí)至今日,曾經(jīng)的屠龍者終成惡龍,以XML文件為基礎(chǔ)的數(shù)據(jù)庫訪問技術(shù)變得臃腫、復(fù)雜,維護(hù)難度直線上升。

MybatisPlus對(duì)常見的數(shù)據(jù)庫訪問進(jìn)行了封裝,訪問數(shù)據(jù)庫大大減少了XML文件的依賴,開發(fā)者從臃腫的XML文件中獲得了較大限度的解脫。

MybatisPlus官方并沒有提供多表連接查詢的通用解決方案,然而連接查詢是相當(dāng)普遍的需求。解決連接查詢有兩種需求,一種是繼續(xù)使用MyBatis提供XML文件解決方式;另一種本文提供的解決方案。

事實(shí)上筆者強(qiáng)烈推薦徹底告別通過XML訪問數(shù)據(jù)庫,并不斷探索新式更加友好、更加自然的解決方式,現(xiàn)分享最新的MybatisPlus技術(shù)的研究成果。

(二)場(chǎng)景說明

為了說明連接查詢的關(guān)系,這里以學(xué)生、課程及其關(guān)系為示例。

(三)前期準(zhǔn)備

此部分需要讀者掌握以下內(nèi)容:Lambda 表達(dá)式、特別是方法引用;函數(shù)式接口;流式運(yùn)算等等,否則理解起來會(huì)有些吃力。

實(shí)體類與 Vo 的映射關(guān)系,作者創(chuàng)造性的引入特別構(gòu)造器,合理利用繼承關(guān)系,極大的方便了開發(fā)者完成實(shí)體類向 Vo 的轉(zhuǎn)換。

空指針異常忽略不處理,借助Optional類實(shí)現(xiàn),詳情移步Java8 新特性查看。

二、一對(duì)一查詢

一對(duì)一查詢最典型的應(yīng)用場(chǎng)景是將id替換成name,比如將userId替換成userName。

(一)查詢單條記錄

查詢單條記錄是指返回值僅有一條記錄,通常是以唯一索引作為條件的返回查詢結(jié)果。

1、示例代碼

/**
 * 查詢單個(gè)學(xué)生信息(一個(gè)學(xué)生對(duì)應(yīng)一個(gè)部門)
 */
public UserVo getOneUser(Integer userId) {
    LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class)
        .eq(User::getUserId, userId);
    // 先查詢用戶信息
    User user = userMapper.selectOne(wrapper);
    // 轉(zhuǎn)化為Vo
    UserVo userVo = Optional.ofNullable(user).map(UserVo::new).orElse(null);
    // 從其它表查詢信息再封裝到Vo
    Optional.ofNullable(userVo).ifPresent(this::addDetpNameInfo);
    return userVo;
}

附屬表信息補(bǔ)充

/**
 * 補(bǔ)充部門名稱信息
 */
private void addDetpNameInfo(UserVo userVo) {
    LambdaQueryWrapper<Dept> wrapper = Wrappers.lambdaQuery(Dept.class)
        .eq(Dept::getDeptId, userVo.getDeptId());
    Dept dept = deptMapper.selectOne(wrapper);
    Optional.ofNullable(dept).ifPresent(e -> userVo.setDeptName(e.getDeptName()));
}

2、理論分析

查詢單個(gè)實(shí)體共分為兩個(gè)步驟:根據(jù)條件查詢主表數(shù)據(jù)(需處理空指針異常);封裝 Vo 并查詢附屬表數(shù)據(jù)。

查詢結(jié)果(VO)只有一條記錄,需要查詢兩次數(shù)據(jù)庫,時(shí)間復(fù)雜度為O(1)。

(二)查詢多條記錄

查詢多條記錄是指查詢結(jié)果為列表,通常是指以普通索引為條件的查詢結(jié)果。

1、示例代碼

/**
 * 批量查詢學(xué)生信息(一個(gè)學(xué)生對(duì)應(yīng)一個(gè)部門)
 */
public List<UserVo> getUserByList() {
    // 先查詢用戶信息(表現(xiàn)形式為列表)
    List<User> user = userMapper.selectList(Wrappers.emptyWrapper());
    List<UserVo> userVos = user.stream().map(UserVo::new).collect(toList());
    // 此步驟可以有多個(gè)
    addDeptNameInfo(userVos);
    return userVos;
}

附屬信息補(bǔ)充

private void addDeptNameInfo(List<UserVo> userVos) {
    // 提取用戶userId,方便批量查詢
    Set<Integer> deptIds = userVos.stream().map(User::getDeptId).collect(toSet());
    // 根據(jù)deptId查詢deptName(查詢前,先做非空判斷)
    List<Dept> dept = deptMapper.selectList(Wrappers.lambdaQuery(Dept.class).in(Dept::getDeptId, deptIds));
    // 構(gòu)造映射關(guān)系,方便匹配deptId與deptName
    Map<Integer, String> hashMap = dept.stream().collect(toMap(Dept::getDeptId, Dept::getDeptName));
    // 封裝Vo,并添加到集合中(關(guān)鍵內(nèi)容)
    userVos.forEach(e -> e.setDeptName(hashMap.get(e.getDeptId())));
}

2、理論分析

先查詢包含id的列表記錄,從結(jié)果集中析出id并轉(zhuǎn)化成批查詢語句再訪問數(shù)據(jù)庫,從第二次調(diào)用結(jié)果集中解析出name。

查詢結(jié)果(VO)有多條記錄,但僅調(diào)用兩次數(shù)據(jù)庫,時(shí)間復(fù)雜度為O(1)

(三)查詢多條記錄(分頁)

分頁查詢實(shí)體的思路與查詢列表的思路相似,額外多處一步分頁泛型轉(zhuǎn)換。

1、示例代碼

/**
 * 分頁查詢學(xué)生信息(一個(gè)學(xué)生對(duì)應(yīng)一個(gè)部門)
 */
public IPage<UserVo> getUserByPage(Page<User> page) {
    // 先查詢用戶信息
    IPage<User> xUserPage = userMapper.selectPage(page, Wrappers.emptyWrapper());
    // 初始化Vo
    IPage<UserVo> userVoPage = xUserPage.convert(UserVo::new);
    if (userVoPage.getRecords().size() > 0) {
        addDeptNameInfo(userVoPage);
    }
    return userVoPage;
}

查詢補(bǔ)充信息

private void addDeptNameInfo(IPage<UserVo> userVoPage) {
    // 提取用戶userId,方便批量查詢
    Set<Integer> deptIds = userVoPage.getRecords().stream().map(User::getDeptId).collect(toSet());
    // 根據(jù)deptId查詢deptName
    List<Dept> dept = deptMapper.selectList(Wrappers.lambdaQuery(Dept.class).in(Dept::getDeptId, deptIds));
    // 構(gòu)造映射關(guān)系,方便匹配deptId與deptName
    Map<Integer, String> hashMap = dept.stream().collect(toMap(Dept::getDeptId, Dept::getDeptName));
    // 將查詢補(bǔ)充的信息添加到Vo中
    userVoPage.convert(e -> e.setDeptName(hashMap.get(e.getDeptId())));
}

IPage接口中convert方法,能夠?qū)崿F(xiàn)在原實(shí)例上修改。

2、理論分析

先查詢包含id的列表記錄,從結(jié)果集中析出id并轉(zhuǎn)化成批查詢語句再訪問數(shù)據(jù)庫,從第二次調(diào)用結(jié)果集中解析出name。

查詢結(jié)果(VO)有多條記錄,但僅調(diào)用兩次數(shù)據(jù)庫,時(shí)間復(fù)雜度為O(1)。

三、一對(duì)多查詢

一對(duì)多查詢最常見的場(chǎng)景是查詢部門所包含的學(xué)生信息,由于一個(gè)部門對(duì)應(yīng)多個(gè)學(xué)生,每個(gè)學(xué)生對(duì)應(yīng)一個(gè)部門,因此稱為一對(duì)多查詢。

(一)查詢單條記錄

1、示例代碼

/**
 * 查詢單個(gè)部門(其中一個(gè)部門有多個(gè)用戶)
 */
public DeptVo getOneDept(Integer deptId) {
    // 查詢部門基礎(chǔ)信息
    LambdaQueryWrapper<Dept> wrapper = Wrappers.lambdaQuery(Dept.class).eq(Dept::getDeptId, deptId);
    DeptVo deptVo = Optional.ofNullable(deptMapper.selectOne(wrapper)).map(DeptVo::new).orElse(null);
    Optional.ofNullable(deptVo).ifPresent(this::addUserInfo);
    return deptVo;
}

補(bǔ)充附加信息

private void addUserInfo(DeptVo deptVo) {
    // 根據(jù)部門deptId查詢學(xué)生列表
    LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class).eq(User::getDeptId, deptVo.getDeptId());
    List<User> users = userMapper.selectList(wrapper);
    deptVo.setUsers(users);
}

2、理論分析

整個(gè)過程共分為兩個(gè)階段:通過部門表中主鍵查詢指定部門信息,通過學(xué)生表中部門ID外鍵查詢學(xué)生信息,將結(jié)果合并,形成返回值(Vo)。

一對(duì)多查詢單條記錄整個(gè)過程至多需要調(diào)用2次數(shù)據(jù)庫查詢,查詢次數(shù)為常數(shù),查詢時(shí)間復(fù)雜度為O(1)。

(二)查詢多條記錄

1、示例代碼

/**
 * 查詢多個(gè)部門(其中一個(gè)部門有多個(gè)用戶)
 */
public List<DeptVo> getDeptByList() {
    // 按條件查詢部門信息
    List<Dept> deptList = deptMapper.selectList(Wrappers.emptyWrapper());
    List<DeptVo> deptVos = deptList.stream().map(DeptVo::new).collect(toList());
    if (deptVos.size() > 0) {
        addUserInfo(deptVos);
    }
    return deptVos;
}

補(bǔ)充附加信息

private void addUserInfo(List<DeptVo> deptVos) {
    // 準(zhǔn)備deptId方便批量查詢用戶信息
    Set<Integer> deptIds = deptVos.stream().map(Dept::getDeptId).collect(toSet());
    // 用批量deptId查詢用戶信息
    List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class).in(User::getDeptId, deptIds));
    // 重點(diǎn):將用戶按照deptId分組
    Map<Integer, List<User>> hashMap = users.stream().collect(groupingBy(User::getDeptId));
    // 合并結(jié)果,構(gòu)造Vo,添加集合列表
    deptVos.forEach(e -> e.setUsers(hashMap.get(e.getDeptId())));
}

2、理論分析

整個(gè)過程共分為三個(gè)階段:通過普通索引從部門表中查詢?nèi)舾蓷l記錄;將部門ID轉(zhuǎn)化為批查詢從學(xué)生表中查詢學(xué)生記錄;將學(xué)生記錄以部門ID為單位進(jìn)行分組,合并結(jié)果,轉(zhuǎn)化為Vo。

一對(duì)多查詢多條記錄需要調(diào)用2次數(shù)據(jù)庫查詢,查詢次數(shù)為常數(shù),查詢時(shí)間復(fù)雜度為O(1)

(三)查詢多條記錄(分頁)

1、示例代碼

/**
 * 分頁查詢部門信息(其中一個(gè)部門有多個(gè)用戶)
 */
public IPage<DeptVo> getDeptByPage(Page<Dept> page) {
    // 按條件查詢部門信息
    IPage<Dept> xDeptPage = deptMapper.selectPage(page, Wrappers.emptyWrapper());
    IPage<DeptVo> deptVoPage = xDeptPage.convert(DeptVo::new);
    if (deptVoPage.getRecords().size() > 0) {
        addUserInfo(deptVoPage);
    }
    return deptVoPage;
}

查詢補(bǔ)充信息

private void addUserInfo(IPage<DeptVo> deptVoPage) {
    // 準(zhǔn)備deptId方便批量查詢用戶信息
    Set<Integer> deptIds = deptVoPage.getRecords().stream().map(Dept::getDeptId).collect(toSet());
    LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class).in(User::getDeptId, deptIds);
    // 用批量deptId查詢用戶信息
    List<User> users = userMapper.selectList(wrapper);
    // 重點(diǎn):將用戶按照deptId分組
    Map<Integer, List<User>> hashMap = users.stream().collect(groupingBy(User::getDeptId));
    // 合并結(jié)果,構(gòu)造Vo,添加集合列表
    deptVoPage.convert(e -> e.setUsers(hashMap.get(e.getDeptId())));
}

2、理論分析

整個(gè)過程共分為三個(gè)階段:通過普通索引從部門表中查詢?nèi)舾蓷l記錄;將部門ID轉(zhuǎn)化為批查詢從學(xué)生表中查詢學(xué)生記錄;將學(xué)生記錄以部門ID為單位進(jìn)行分組,合并結(jié)果,轉(zhuǎn)化為Vo。

一對(duì)多查詢多條記錄需要調(diào)用2次數(shù)據(jù)庫查詢,查詢次數(shù)為常數(shù),查詢時(shí)間復(fù)雜度為O(1)。

四、多對(duì)多查詢

MybatisPlus 實(shí)現(xiàn)多對(duì)多查詢是一件極富挑戰(zhàn)性的任務(wù),也是連接查詢中最困難的部分。

以空間置換時(shí)間,借助于流式運(yùn)算,解決多對(duì)多查詢難題。

多對(duì)多查詢相對(duì)于一對(duì)多查詢,增加了流式分組運(yùn)算、批量 HashMap 取值等內(nèi)容。

(一)查詢單條記錄

查詢單條記錄一般是指通過兩個(gè)查詢條件查詢出一條匹配表中的記錄。

1、示例代碼

public StudentVo getStudent(Integer stuId) {
    // 通過主鍵查詢學(xué)生信息
    StudentVo studentVo = ConvertUtils.convertObj(getById(stuId), StudentVo::new);
    LambdaQueryWrapper<StuSubRelation> wrapper = Wrappers.lambdaQuery(StuSubRelation.class).eq(StuSubRelation::getStuId, stuId);
    // 查詢匹配關(guān)系
    List<StuSubRelation> stuSubRelations = stuSubRelationMapper.selectList(wrapper);
    Set<Integer> subIds = stuSubRelations.stream().map(StuSubRelation::getSubId).collect(toSet());
    if (studentVo != null && subIds.size() > 0) {
        List<Subject> subList = subjectMapper.selectList(Wrappers.lambdaQuery(Subject.class).in(Subject::getId, subIds));
        List<SubjectBo> subBoList = ConvertUtils.convertList(subList, SubjectBo::new);
        HashBasedTable<Integer, Integer, Integer> table = getHashBasedTable(stuSubRelations);
        subBoList.forEach(e -> e.setScore(table.get(stuId, e.getId())));
        studentVo.setSubList(subBoList);
    }
    return studentVo;
}

2、理論分析

多對(duì)多單條記錄查詢最多訪問數(shù)據(jù)庫3次,先查詢學(xué)生信息,然后查詢學(xué)生與課程匹配信息,最后查詢課程分?jǐn)?shù)信息,查詢時(shí)間復(fù)雜度為O(1)

(二)查詢多條記錄

1、示例代碼

public List<StudentVo> getStudentList() {
    // 通過主鍵查詢學(xué)生信息
    List<StudentVo> studentVoList = ConvertUtils.convertList(list(), StudentVo::new);
    // 批量查詢學(xué)生ID
    Set<Integer> stuIds = studentVoList.stream().map(Student::getId).collect(toSet());
    LambdaQueryWrapper<StuSubRelation> wrapper = Wrappers.lambdaQuery(StuSubRelation.class).in(StuSubRelation::getStuId, stuIds);
    List<StuSubRelation> stuSubRelations = stuSubRelationMapper.selectList(wrapper);
    // 批量查詢課程ID
    Set<Integer> subIds = stuSubRelations.stream().map(StuSubRelation::getSubId).collect(toSet());
    if (stuIds.size() > 0 && subIds.size() > 0) {
        HashBasedTable<Integer, Integer, Integer> table = getHashBasedTable(stuSubRelations);
        List<Subject> subList = subjectMapper.selectList(Wrappers.lambdaQuery(Subject.class).in(Subject::getId, subIds));
        List<SubjectBo> subjectBoList = ConvertUtils.convertList(subList, SubjectBo::new);
        Map<Integer, List<Integer>> map = stuSubRelations.stream().collect(groupingBy(StuSubRelation::getStuId, mapping(StuSubRelation::getSubId, toList())));
        for (StudentVo studentVo : studentVoList) {
            // 獲取課程列表
            List<SubjectBo> list = ListUtils.select(subjectBoList, e -> emptyIfNull(map.get(studentVo.getId())).contains(e.getId()));
            // 填充分?jǐn)?shù)
            list.forEach(e -> e.setScore(table.get(studentVo.getId(), e.getId())));
            studentVo.setSubList(list);
        }
    }
    return studentVoList;
}

2、理論分析

多對(duì)多N條記錄查詢由于使用了批查詢,因此最多訪問數(shù)據(jù)庫也是3次,先查詢學(xué)生信息,然后查詢學(xué)生與課程匹配信息,最后查詢課程分?jǐn)?shù)信息,查詢時(shí)間復(fù)雜度為O(1)。

(三)查詢多條記錄(分頁)

1、示例代碼

public IPage<StudentVo> getStudentPage(IPage<Student> page) {
    // 通過主鍵查詢學(xué)生信息
    IPage<StudentVo> studentVoPage = ConvertUtils.convertPage(page(page), StudentVo::new);
    // 批量查詢學(xué)生ID
    Set<Integer> stuIds = studentVoPage.getRecords().stream().map(Student::getId).collect(toSet());
    LambdaQueryWrapper<StuSubRelation> wrapper = Wrappers.lambdaQuery(StuSubRelation.class).in(StuSubRelation::getStuId, stuIds);
    // 通過學(xué)生ID查詢課程分?jǐn)?shù)
    List<StuSubRelation> stuSubRelations = stuSubRelationMapper.selectList(wrapper);
    // 批量查詢課程ID
    Set<Integer> subIds = stuSubRelations.stream().map(StuSubRelation::getSubId).collect(toSet());
    if (stuIds.size() > 0 && subIds.size() > 0) {
        HashBasedTable<Integer, Integer, Integer> table = getHashBasedTable(stuSubRelations);
        // 學(xué)生ID查詢課程ID組
        Map<Integer, List<Integer>> map = stuSubRelations.stream().collect(groupingBy(StuSubRelation::getStuId, mapping(StuSubRelation::getSubId, toList())));

        List<Subject> subList = subjectMapper.selectList(Wrappers.lambdaQuery(Subject.class).in(Subject::getId, subIds));
        List<SubjectBo> subBoList = ConvertUtils.convertList(subList, SubjectBo::new);
        for (StudentVo studentVo : studentVoPage.getRecords()) {
            List<SubjectBo> list = ListUtils.select(subBoList, e -> emptyIfNull(map.get(studentVo.getId())).contains(e.getId()));
            list.forEach(e -> e.setScore(table.get(studentVo.getId(), e.getId())));
            studentVo.setSubList(list);
        }
    }
    return studentVoPage;
}

2、理論分析

多對(duì)多N條記錄分頁查詢由于使用了批查詢,因此最多訪問數(shù)據(jù)庫也是3次,先查詢學(xué)生信息,然后查詢學(xué)生與課程匹配信息,最后查詢課程分?jǐn)?shù)信息,查詢時(shí)間復(fù)雜度為O(1)

五、總結(jié)與拓展

(一)總結(jié)

通過上述分析,能夠用 MybatisPlus 解決多表連接查詢中的一對(duì)一、一對(duì)多、多對(duì)多查詢。

  • 上述代碼行文緊湊,充分利用 IDE 對(duì) Lambda 表達(dá)式的支持,在編譯期間完成對(duì)代碼的檢查。
  • 業(yè)務(wù)邏輯清晰,可維護(hù)性、可修改性優(yōu)勢(shì)明顯。
  • 一次查詢需要訪問至多兩次數(shù)據(jù)庫,時(shí)間復(fù)雜度為o(1),主鍵查詢或者索引查詢,查詢效率高。

(二)拓展

MybatisPlus能很好的解決單表查詢問題,同時(shí)借助在單表查詢的封裝能很好地解決連接查詢問題。

本方案不僅解決了連接查詢問題,同時(shí)具備如下內(nèi)容拓展:

  • 當(dāng)數(shù)據(jù)量較大時(shí),仍然具有穩(wěn)定的查詢效率

當(dāng)數(shù)據(jù)量達(dá)到百萬級(jí)別時(shí),傳統(tǒng)的單表通過索引查詢已經(jīng)面臨挑戰(zhàn),普通的多表連接查詢性能隨著數(shù)據(jù)量的遞增呈現(xiàn)指數(shù)級(jí)下降。

本方案通過將連接查詢轉(zhuǎn)化為主鍵(索引)查詢,查詢性能等效于單表查詢。

  • 與二級(jí)緩存配合使用進(jìn)一步提高查詢效率

當(dāng)所有的查詢均轉(zhuǎn)化為以單表為基礎(chǔ)的查詢后,方能安全的引入二級(jí)緩存。二級(jí)緩存的單表增刪改查操作自適應(yīng)聯(lián)動(dòng),解決了二級(jí)緩存的臟數(shù)據(jù)問題。

原文地址

到此這篇關(guān)于MybatisPlus多表連接查詢的文章就介紹到這了,更多相關(guān)MybatisPlus多表連接查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 徹底搞懂Java多線程(一)

    徹底搞懂Java多線程(一)

    這篇文章主要給大家介紹了關(guān)于Java面試題之多線程和高并發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 詳解Spring系列之@ComponentScan批量注冊(cè)bean

    詳解Spring系列之@ComponentScan批量注冊(cè)bean

    本文介紹各種@ComponentScan批量掃描注冊(cè)bean的基本使用以及進(jìn)階用法和@Componet及其衍生注解使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-02-02
  • Spring Boot jar中沒有主清單屬性的解決方法

    Spring Boot jar中沒有主清單屬性的解決方法

    這篇文章主要介紹了Spring Boot jar中沒有主清單屬性的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    這篇文章主要介紹了Java的Hibernate框架中的緩存和延遲加載機(jī)制,Hibernate是注明的Java下SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • 基于Java的打包jar、war、ear包的作用與區(qū)別詳解

    基于Java的打包jar、war、ear包的作用與區(qū)別詳解

    本篇文章,小編為大家介紹,基于Java的打包jar、war、ear包的作用與區(qū)別詳解。需要的朋友參考下
    2013-04-04
  • Spring解密之XML解析與Bean注冊(cè)示例詳解

    Spring解密之XML解析與Bean注冊(cè)示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring解密之XML解析與Bean注冊(cè)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Java設(shè)計(jì)模式之觀察者模式

    Java設(shè)計(jì)模式之觀察者模式

    這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式,觀察者模式,是一種行為性模型,又叫發(fā)布-訂閱模式,他定義對(duì)象之間一種一對(duì)多的依賴關(guān)系,使得當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到通知并自動(dòng)更新,需要的朋友可以參考下
    2023-11-11
  • 微信小程序調(diào)用微信登陸獲取openid及java做為服務(wù)端示例

    微信小程序調(diào)用微信登陸獲取openid及java做為服務(wù)端示例

    這篇文章主要介紹了微信小程序調(diào)用微信登陸獲取openid及java做為服務(wù)端示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)

    用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)

    這篇文章主要介紹了用SpringBoot+Vue+uniapp實(shí)現(xiàn)在線房屋裝修管理系統(tǒng),針對(duì)裝修樣板信息管理混亂,出錯(cuò)率高,信息安全性差,勞動(dòng)強(qiáng)度大,費(fèi)時(shí)費(fèi)力等問題開發(fā)了這套系統(tǒng),需要的朋友可以參考下
    2023-03-03
  • java方法重寫時(shí)需要注意的問題

    java方法重寫時(shí)需要注意的問題

    大家好,本篇文章主要講的是java方法重寫時(shí)需要注意的問題,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論