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

Mybatis返回Map對(duì)象的實(shí)現(xiàn)

 更新時(shí)間:2024年09月23日 10:26:37   作者:matrixlzp  
本文介紹了Mybatis和MybatisPlus在查詢數(shù)據(jù)庫時(shí)返回Map對(duì)象的多種實(shí)現(xiàn)方式,這些方法有助于優(yōu)化DAO層代碼,使其更加清晰和高效,下面就來具體介紹一下,感興趣的可以了解一下

一、場(chǎng)景介紹

假設(shè)有如下一張學(xué)生表:

CREATE TABLE `student` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(100) NOT NULL COMMENT '姓名',
  `gender` varchar(10) NOT NULL COMMENT '性別',
  `grade` int NOT NULL COMMENT '年級(jí)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='學(xué)生信息表';

我們通過一組 ids,想獲得 id 跟學(xué)生對(duì)象的映射 Map<Integer, Student>,可以這樣做:

1、先通過 ids 獲取對(duì)象列表

2、再通過 stream 流式運(yùn)算得到 id-Student 映射

這樣做雖然也沒有問題,但是這樣 service 層就會(huì)散落一堆這樣流式運(yùn)算的代碼。不是很美觀,應(yīng)該在DAO層就提供這種能力。Mybatis 提供給我們查詢 Map 的方式。

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper mapper;

    @Override
    public Map<Integer, Student> findMapByIds(List<Integer> ids) {
        List<Student> students = mapper.listByIds(ids);
        Map<Integer, Student> map = students.stream().collect(Collectors.toMap(Student::getId, Function.identity()));
        return map;
    }
}
---------------------------------------------------------------
@Test
public void test() {
        List<Integer> list = Arrays.asList(1,2,3);
        Map<Integer, Student> map = studentService.findMapByIds(list);
        System.out.println(map);
}

輸出:
{1=Student(id=1, name=小明, gender=male, grade=1), 2=Student(id=2, name=小紅, gender=female, grade=2), 3=Student(id=3, name=小李, gender=male, grade=3)}

二、Mybatis @MapKey 方式

Mybatis 提供了 @MapKey 注解,注解的 value 用來指定 key 的取值字段。

可以看到,效果是一樣的。

@Mapper
public interface StudentMapper {

    /**
     * 這種基礎(chǔ)的查詢,不應(yīng)該先獲取 List 流,然后再轉(zhuǎn)換,
     * 這樣會(huì)使整個(gè)項(xiàng)目散落一地這種代碼
     * 應(yīng)該在DAO層就提供這種能力
     */
    @MapKey("id")
    Map<Integer, Student> findMapByIds(List<Integer> ids);
}
-------------------------------------------------------------
<?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="com.study.student.mapper.StudentMapper">
    
    <select id="findMapByIds" resultType="com.study.student.entity.Student">
        select *
        from student s
        <where>
            and s.id in
            <foreach collection="ids" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </where>
    </select>

</mapper>
-------------------------------------------------------------
@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper mapper;

    @Override
    public Map<Integer, Student> findMapByIds(List<Integer> ids) {
        /*
        List<Student> students = mapper.listByIds(ids);
        Map<Integer, Student> map = students.stream().collect(Collectors.toMap(Student::getId, Function.identity()));
        return map;
        */
        return mapper.findMapByIds(ids);
    }
}
-------------------------------------------------------------
@Test
public void test() {
        List<Integer> list = Arrays.asList(1,2,3);
        Map<Integer, Student> map = studentService.findMapByIds(list);
        System.out.println(map);
}
輸出:
{1=Student(id=1, name=小明, gender=male, grade=1), 2=Student(id=2, name=小紅, gender=female, grade=2), 3=Student(id=3, name=小李, gender=male, grade=3)}

 但如果 @MapKey 的 value 配置了記錄重復(fù)的字段會(huì)怎么樣?

就比如,@MapKey("grade"),grade = 1,2,3 的記錄并非唯一。

@Mapper
public interface StudentMapper {

    List<Student> listByIds(List<Integer> ids);

    /**
     * @MapKey 的 value 是 grade 這種非唯一字段
     */
    @MapKey("grade")
    Map<Integer, Student> findMapByIds(List<Integer> ids);
}

 這個(gè)時(shí)候會(huì)發(fā)現(xiàn),返回的記錄被覆蓋了。

id in [1,6] 的 grade=1 的記錄有 小明跟小智,

小明先查詢出來,

map.put(1,  Student(id=1, name=小明, gender=male, grade=1))

小智后查詢出來,

map.put(1,  Student(id=6, name=小智, gender=male, grade=1))

同一個(gè)key,小智覆蓋了小明。

那如果我們希望返回 Map<grade:Integer, List<Student>> 怎么辦呢?

@Test
public void test2() {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6);
        Map<Integer, Student> map = studentService.findMapByIds(list);
        System.out.println(map);
}
輸出:
{1=Student(id=6, name=小智, gender=male, grade=1), 2=Student(id=4, name=小林, gender=male, grade=2), 3=Student(id=5, name=小婷, gender=female, grade=3)}

三、Stream 返回 Map<Integer, List<Student>>

 遺憾的是,筆者找了 Mybatis 跟 MybatisPlus 也沒找到此類方法,所以這一塊,還是只能用流式計(jì)算來做。

@Mapper
public interface StudentMapper {

    List<Student> listByIds(List<Integer> ids);
}
-------------------------------------------------------------
<?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="com.study.student.mapper.StudentMapper">
    
    <select id="listByIds" resultType="cn.al.admin.entity.finance.Student">
        select *
        from student s
        <where>
            and s.id in
            <foreach collection="ids" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </where>
    </select>

</mapper>
-------------------------------------------------------------
@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper mapper;

    @Override
    public Map<Integer, List<Student>> getMapByIds(List<Integer> ids) {
        List<Student> students = mapper.listByIds(ids);
        return students.stream().collect(Collectors.groupingBy(Student::getGrade));
    }
}
-------------------------------------------------------------
@Test
public void test3() {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6);
        Map<Integer, List<Student>> map = studentService.getMapByIds(list);
        System.out.println(map);
    }
輸出:
{1=[Student(id=1, name=小明, gender=male, grade=1), Student(id=6, name=小智, gender=male, grade=1)], 2=[Student(id=2, name=小紅, gender=female, grade=2), Student(id=4, name=小林, gender=male, grade=2)], 3=[Student(id=3, name=小李, gender=male, grade=3), Student(id=5, name=小婷, gender=female, grade=3)]}

四、MybatisPlus 返回 List<Map<String, Object>>

如果希望查詢返回 List<Map<String, Object>> Map 的 key 是數(shù)據(jù)庫 column name

package com.study.student.mapper;

import com.study.student.entity.Student;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.*;

@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}
------------------------------------------------------------
package com.study.student.service.impl;

import com.study.student.entity.Student;
import com.study.student.mapper.StudentMapper;
import com.study.student.service.StudentService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    @Override
    public List<Map<String, Object>> getMapList(List<Integer> ids) {
        LambdaQueryWrapper<Student> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(Student::getId, ids);
        return this.getBaseMapper().selectMaps(wrapper);
    }
}
------------------------------------------------------------
@Test
public void test4() {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6);
        List<Map<String, Object>> map = studentService.getMapList(list);
        System.out.println(map);
}
輸出:
[{gender=male, grade=1, name=小明, id=1, photo_url=url1}, {gender=female, grade=2, name=小紅, id=2, photo_url=url2}, {gender=male, grade=3, name=小李, id=3, photo_url=url3}, {gender=male, grade=2, name=小林, id=4, photo_url=url4}, {gender=female, grade=3, name=小婷, id=5, photo_url=url5}, {gender=male, grade=1, name=小智, id=6, photo_url=url6}]

五、JSON 返回  List<Map<String, Object>>

如果希望查詢返回 List<Map<String, Object>> Map 的 key 是對(duì)象 property。需要借助 JSON 工具類,比如 cn.hutool.core.bean.BeanUtil#beanToMap

package com.study.student.service.impl;

import com.study.student.entity.Student;
import com.study.student.mapper.StudentMapper;
import com.study.student.service.StudentService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import cn.hutool.core.bean.BeanUtil;

import java.util.List;
import java.util.Map;

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    @Override
    public List<Map<String, Object>> getMapList(List<Integer> ids) {
        List<Student> students = this.listByIds(ids);
        return students.stream().map(BeanUtil::beanToMap).collect(Collectors.toList());
    }
}
------------------------------------------------------------
@Test
public void test5() {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6);
        List<Map<String, Object>> map = studentService.getMapList(list);
        System.out.println(map);
}
輸出:
[{id=1, name=小明, gender=male, grade=1, photoUrl=url1}, {id=2, name=小紅, gender=female, grade=2, photoUrl=url2}, {id=3, name=小李, gender=male, grade=3, photoUrl=url3}, {id=4, name=小林, gender=male, grade=2, photoUrl=url4}, {id=5, name=小婷, gender=female, grade=3, photoUrl=url5}, {id=6, name=小智, gender=male, grade=1, photoUrl=url6}]

六、MybatisPlus 返回 Map<String, Object>

Map 的 key 是數(shù)據(jù)庫 column name

package com.study.student.service.impl;

import com.study.student.entity.Student;
import com.study.student.mapper.StudentMapper;
import com.study.student.service.StudentService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    @Override
    public Map<String, Object> getMapById(Integer id) {
        LambdaQueryWrapper<Student> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Student::getId, id);
        return this.getMap(wrapper);
    }
}
------------------------------------------------------------
@Test
public void test6() {
        Map<String, Object> map = studentService.getMapById(6);
        System.out.println(map);
    }
輸出:
{gender=male, grade=1, name=小智, id=6, photo_url=url6}

七、JSON 返回 Map<String, Object>

Map 的 key 是對(duì)象 property

package com.study.student.service.impl;

import com.study.student.entity.Student;
import com.study.student.mapper.StudentMapper;
import com.study.student.service.StudentService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import cn.hutool.core.bean.BeanUtil;

import java.util.List;
import java.util.Map;

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    @Override
    public Map<String, Object> getMapById(Integer id) {
        Student student = this.getById(id);
        return BeanUtil.beanToMap(student);
    }
}
------------------------------------------------------------
@Test
public void test7() {
    Map<String, Object> map = studentService.getMapById(6);
    System.out.println(map);
}
輸出:
{id=6, name=小智, gender=male, grade=1, photoUrl=url6}

到此這篇關(guān)于Mybatis返回Map對(duì)象的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Mybatis返回Map對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Java實(shí)現(xiàn)簡單的萬年歷

    Java實(shí)現(xiàn)簡單的萬年歷

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單的萬年歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java 深入淺出掌握Map集合之雙列集合

    Java 深入淺出掌握Map集合之雙列集合

    雙列集合是每個(gè)元素都有鍵與值兩部分組成的集合,記錄的是鍵值對(duì)對(duì)應(yīng)關(guān)系,即通過鍵可以找到值,鍵必須是唯一,值可以重復(fù),接下來跟著小編具體了解吧
    2021-11-11
  • SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問題

    SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問題

    這篇文章主要介紹了SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java文件如何統(tǒng)計(jì)字母出現(xiàn)的次數(shù)和百分比

    java文件如何統(tǒng)計(jì)字母出現(xiàn)的次數(shù)和百分比

    這篇文章主要介紹了java文件如何統(tǒng)計(jì)字母出現(xiàn)的次數(shù)和百分比,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • mybatis 返回Map類型key改為小寫的操作

    mybatis 返回Map類型key改為小寫的操作

    這篇文章主要介紹了mybatis 返回Map類型key改為小寫的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java 類與對(duì)象詳細(xì)

    Java 類與對(duì)象詳細(xì)

    這篇文章主要介紹了Java 類與對(duì)象,在Java中,我們把對(duì)象的特征稱為屬性,對(duì)象的用途稱為方法,具有相同屬性和方法的對(duì)象,我們把他們歸為一類,簡稱類。下面文章講詳細(xì)介紹什么是Java類與對(duì)象,需要的朋友可以參考一下
    2021-10-10
  • springboot創(chuàng)建的web項(xiàng)目整合Quartz框架的項(xiàng)目實(shí)踐

    springboot創(chuàng)建的web項(xiàng)目整合Quartz框架的項(xiàng)目實(shí)踐

    本文主要介紹了springboot創(chuàng)建的web項(xiàng)目整合Quartz框架的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java泛型類、重構(gòu)的使用及說明

    Java泛型類、重構(gòu)的使用及說明

    文章介紹了泛型類和重構(gòu)的概念、原理和應(yīng)用,泛型類是一種參數(shù)化類型,可以操作不同數(shù)據(jù)類型,而重構(gòu)是通過對(duì)已有代碼進(jìn)行修改,改善其設(shè)計(jì)、結(jié)構(gòu)和可讀性的過程,重構(gòu)可以幫助提高代碼質(zhì)量、簡化理解與調(diào)試、優(yōu)化性能、改進(jìn)設(shè)計(jì)、提高團(tuán)隊(duì)協(xié)作并擴(kuò)展功能
    2025-11-11
  • Java提示缺少返回語句的解決辦法

    Java提示缺少返回語句的解決辦法

    在本篇文章里小編給大家分享了關(guān)于Java提示缺少返回語句的解決辦法以及相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。
    2019-07-07
  • Autowired的注入過程源碼解析

    Autowired的注入過程源碼解析

    這篇文章主要為大家介紹了Autowired的注入過程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論

峨山| 苏尼特右旗| 临泉县| 盐山县| 台湾省| 城口县| 宜春市| 桃园市| 邵武市| 松潘县| 灵璧县| 洮南市| 黎平县| 兰西县| 平远县| 新河县| 辽源市| 泗洪县| 南陵县| 七台河市| 大渡口区| 玛曲县| 无棣县| 梧州市| 潜江市| 罗源县| 观塘区| 澳门| 宕昌县| 孝义市| 彰化县| 瑞丽市| 江永县| 浙江省| 城市| 徐闻县| 芮城县| 布尔津县| 和政县| 辽阳市| 焦作市|