最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MybatisPlus多表連接查詢的問(wèn)題及解決方案

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

一、序言

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

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

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

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

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

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

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

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

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

實(shí)體類與 Vo 的映射關(guān)系,作者創(chuàng)造性的引入特別構(gòu)造器,合理利用繼承關(guān)系,極大的方便了開(kāi)發(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ù)庫(kù),時(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)化成批查詢語(yǔ)句再訪問(wèn)數(shù)據(jù)庫(kù),從第二次調(diào)用結(jié)果集中解析出name

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

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

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

1、示例代碼

/**
 * 分頁(yè)查詢學(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)化成批查詢語(yǔ)句再訪問(wèn)數(shù)據(jù)庫(kù),從第二次調(diào)用結(jié)果集中解析出name。

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

三、一對(duì)多查詢

一對(duì)多查詢最常見(jiàn)的場(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è)過(guò)程共分為兩個(gè)階段:通過(guò)部門表中主鍵查詢指定部門信息,通過(guò)學(xué)生表中部門ID外鍵查詢學(xué)生信息,將結(jié)果合并,形成返回值(Vo)。

一對(duì)多查詢單條記錄整個(gè)過(guò)程至多需要調(diào)用2次數(shù)據(jù)庫(kù)查詢,查詢次數(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è)過(guò)程共分為三個(gè)階段:通過(guò)普通索引從部門表中查詢?nèi)舾蓷l記錄;將部門ID轉(zhuǎn)化為批查詢從學(xué)生表中查詢學(xué)生記錄;將學(xué)生記錄以部門ID為單位進(jìn)行分組,合并結(jié)果,轉(zhuǎn)化為Vo。

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

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

1、示例代碼

/**
 * 分頁(yè)查詢部門信息(其中一個(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è)過(guò)程共分為三個(gè)階段:通過(guò)普通索引從部門表中查詢?nèi)舾蓷l記錄;將部門ID轉(zhuǎn)化為批查詢從學(xué)生表中查詢學(xué)生記錄;將學(xué)生記錄以部門ID為單位進(jìn)行分組,合并結(jié)果,轉(zhuǎn)化為Vo。

一對(duì)多查詢多條記錄需要調(diào)用2次數(shù)據(jù)庫(kù)查詢,查詢次數(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)容。

(一)查詢單條記錄

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

1、示例代碼

public StudentVo getStudent(Integer stuId) {
    // 通過(guò)主鍵查詢學(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ì)多單條記錄查詢最多訪問(wèn)數(shù)據(jù)庫(kù)3次,先查詢學(xué)生信息,然后查詢學(xué)生與課程匹配信息,最后查詢課程分?jǐn)?shù)信息,查詢時(shí)間復(fù)雜度為O(1)。

(二)查詢多條記錄

1、示例代碼

public List<StudentVo> getStudentList() {
    // 通過(guò)主鍵查詢學(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條記錄查詢由于使用了批查詢,因此最多訪問(wèn)數(shù)據(jù)庫(kù)也是3次,先查詢學(xué)生信息,然后查詢學(xué)生與課程匹配信息,最后查詢課程分?jǐn)?shù)信息,查詢時(shí)間復(fù)雜度為O(1)。

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

1、示例代碼

public IPage<StudentVo> getStudentPage(IPage<Student> page) {
    // 通過(guò)主鍵查詢學(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);
    // 通過(guò)學(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條記錄分頁(yè)查詢由于使用了批查詢,因此最多訪問(wèn)數(shù)據(jù)庫(kù)也是3次,先查詢學(xué)生信息,然后查詢學(xué)生與課程匹配信息,最后查詢課程分?jǐn)?shù)信息,查詢時(shí)間復(fù)雜度為O(1)。

五、總結(jié)與拓展

(一)總結(jié)

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

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

(二)拓展

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

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

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

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

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

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

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

原文地址

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

相關(guān)文章

  • IDEA檢查項(xiàng)目的jdk版本需要看的地方

    IDEA檢查項(xiàng)目的jdk版本需要看的地方

    這篇文章主要介紹了IDEA檢查項(xiàng)目的jdk版本需要看的地方,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Java多線程的調(diào)度_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java多線程的調(diào)度_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    有多個(gè)線程,如何控制它們執(zhí)行的先后次序呢?下文給大家分享四種方法及java多線程調(diào)度的實(shí)例代碼,需要的朋友參考下吧
    2017-05-05
  • idea啟動(dòng)Tomcat時(shí)控制臺(tái)亂碼的解決方法(親測(cè)有效)

    idea啟動(dòng)Tomcat時(shí)控制臺(tái)亂碼的解決方法(親測(cè)有效)

    最近在idea中啟動(dòng)tomcat出現(xiàn)控制臺(tái)亂碼問(wèn)題,嘗試了很多方法,最后終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于idea啟動(dòng)Tomcat時(shí)控制臺(tái)亂碼的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • JDBC 程序的常見(jiàn)錯(cuò)誤及調(diào)試方法

    JDBC 程序的常見(jiàn)錯(cuò)誤及調(diào)試方法

    本文是《Java Web開(kāi)發(fā)教程——入門與提高篇(JSP+Servlet)》一書(shū)《第9章 JDBC技術(shù)》的補(bǔ)充內(nèi)容。
    2009-06-06
  • springboot controller 增加指定前綴的兩種實(shí)現(xiàn)方法

    springboot controller 增加指定前綴的兩種實(shí)現(xiàn)方法

    這篇文章主要介紹了springboot controller 增加指定前綴的兩種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java zookeeper服務(wù)的使用詳解

    Java zookeeper服務(wù)的使用詳解

    ZooKeeper是一個(gè)分布式的,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等
    2022-08-08
  • 解決@Scope(“prototype“)不生效的問(wèn)題

    解決@Scope(“prototype“)不生效的問(wèn)題

    這篇文章主要介紹了解決@Scope(“prototype“)不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java 面試題和答案 -(上)

    Java 面試題和答案 -(上)

    本文主要介紹Java 面試題和答案,這里整理了Java面試中出現(xiàn)的各種題型,和相應(yīng)知識(shí)點(diǎn),有需要的小伙伴可以好好參考下,幫助大家面試成功
    2016-09-09
  • 用Maven打成可執(zhí)行jar,包含maven依賴,本地依賴的操作

    用Maven打成可執(zhí)行jar,包含maven依賴,本地依賴的操作

    這篇文章主要介紹了用Maven打成可執(zhí)行jar,包含maven依賴,本地依賴的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 在Java8中如何避開(kāi)空指針異常

    在Java8中如何避開(kāi)空指針異常

    這篇文章主要給大家介紹了關(guān)于在Java8中如何風(fēng)騷走位的避開(kāi)空指針異常的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論

三门县| 谷城县| 聂拉木县| 黄梅县| 敦煌市| 天镇县| 阿克| 逊克县| 文化| 仙游县| 汉阴县| 汶川县| 天长市| 福州市| 炉霍县| 阿图什市| 盐边县| 社会| 南郑县| 武穴市| 建阳市| 平武县| 轮台县| 长治县| 大同市| 青铜峡市| 车致| 乌兰察布市| 华亭县| 乌兰察布市| 五台县| 若羌县| 会昌县| 长治市| 桃江县| 通山县| 呈贡县| 菏泽市| 外汇| 肃宁县| 冷水江市|