mybatis (返回值)查询语句专题

<?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.mapper.UserMapper">
    <!--
        public class User {
            private Integer id;
            private String name;
            private Integer age;
            private String email;
            private Integer sex;
            private Cat cat;
            private List<Course> courseList;
        }
        public class Course {
            private String coursename;
            private String teacher;
            private Integer userid;
       }
       public class Cat {
            private String catname;
        }
    -->
<!-- ___________________________________________ 第一种:查询一个参数信息(如查询某个学生ID) ____________________________________________ -->
    <!-- 方式1:long,返回总记录条数:

         postman:
            localhost:8080/select7
         XxxController.java:
            @RequestMapping("select7")
            public void select7(){
                Long count = userMapper.selectTotalCount();
                System.out.println("总条数 ==> "+count);
            }
         XxxMapper.java:
            Long selectTotalCount();
    -->
    <!--long是别名,可参考mybatis开发⼿册。-->
    <select id="selectTotalCount" resultType="long">
        select count(*) from user
    </select>

    <!--方式2:String,返回某个学生的姓名

        postman:
            localhost:8080/select1?id=1
        XxxController.java:
            @RequestMapping("select1")
            public void select1(@Param("id") Long id){
                String name = userMapper.getName(id);
                System.out.println("学生的姓名是:"+name);
            }
        XxxMapper.java:
            String getName(@Param("id") Long id);
    -->
    <select id="getName" resultType="string">
        select name from user where id=#{id}
    </select>

<!-- ___________________________________________ 第二种:查询一条数据 ____________________________________________ -->
    <!--
        方式1:User user,查询一条User数据。
              当查询的结果,有对应的实体类,并且查询结果只有⼀条时。

        postman:Query Params
            localhost:8080/select1?id=1
        XxxController.java:
            @RequestMapping("select1")
            public void select1(@Param("id") Long id){
                User user = userMapper.selectUserById(id);
                System.out.println(user);
            }
        XxxMapper.java:
            User selectUserById(Long id);
    -->
    <select id="selectUserById" resultType="com.pojo.User">
        select * from user where id = #{id}
    </select>

    <!--
       方式2:List<Bean>,查询一条User数据。
                 根据id主键查询:结果最多只有⼀条,可以放到List集合中吗?
                 查询结果是⼀条的话可以使⽤List集合接收吗?当然可以。

       postman:Query Params
           localhost:8080/select11?id=1
       XxxController.java:
           @RequestMapping("select11")
           public void select11(@Param("id") Long id){
               List<User> list = userMapper.selectUserByIdToList(id);
               System.out.println(list.size());
           }
       XxxMapper.java:
           List<User> selectUserByIdToList(Long id);
   -->
    <select id="selectUserByIdToList" resultType="com.pojo.User">
        select * from user where id = #{id}
    </select>

    <!-- 方式3:Map<String,Bean>,查询一条User数据。
               查询如果可以保证只有⼀条数据,则返回⼀个Map集合即可。
               当返回的数据,没有合适的实体类对应的话,可以采⽤Map集合接收。字段名做key,字段值做value。
               resultMap="map",这是因为mybatis内置了很多别名。【参⻅mybatis开发⼿册】
        注意事项:
               当然,如果返回⼀个Map集合,可以将Map集合放到List集合中吗?当然可以,这⾥就不再测试了。
               反过来,如果返回的不是⼀条记录,是多条记录的话,只采⽤单个Map集合接收,这样同样会出现之前的异常:TooManyResultsException

        postman:
           localhost:8080/select3?id=1
        XxxController.java:
           @RequestMapping("select3")
           public void select3(@Param("id") Long id){
               Map<String,Object> map = userMapper.selectUserByIdRetMap(id);
               System.out.println("返回的map ==> "+map);
           }
        XxxMapper.java:
           Map<String, Object> selectUserByIdRetMap(Long id);
   -->
    <select id="selectUserByIdRetMap" resultType="map">
        select * from user where id = #{id}
    </select>

<!-- ___________________________________________ 第三种:查询多条数据 ____________________________________________ -->
    <!-- 方式1:List<Bean>,返回多条数据
               当查询的记录条数是多条的时候,必须使⽤集合接收。

        postman:Query Params
            localhost:8080/select2
        XxxController.java:
            @RequestMapping("select2")
            public void select2(){
                List<User> list = userMapper.selectAllUsers();
                System.out.println(list.size());
            }
        XxxMapper.java:
            List<User> selectAllUsers();
    -->
    <select id="selectAllUsers" resultType="com.pojo.User">
        select * from user
    </select>



    <!-- 方式2:List<Map<String,Bean>>,返回多条数据。
               查询结果条数⼤于等于1条数据,则可以返回⼀个存储Map集合的List集合。List<Map>等同于List<Car>

         postman:
            localhost:8080/select4
         XxxController.java:
            @RequestMapping("select4")
            public void select4(){
                List<Map<String,Object>> listMap = userMapper.selectAllUserRetListMap();
                System.out.println("返回的listMap ==> "+listMap);
            }
         XxxMapper.java:
            List<Map<String,Object>> selectAllUserRetListMap();
    -->
    <select id="selectAllUserRetListMap" resultType="map">
        select * from user
    </select>

    <!-- 方式3:Map<Long,Map<String,Bean>>,返回多条数据
                拿User的id做key,以后取出对应的Map集合时更⽅便。

         postman:
            localhost:8080/select5
         XxxController.java:
            @RequestMapping("select5")
            public void select5(){
                Map<Long,Map<String,Object>> listIdMap = userMapper.selectAllUserRetMap();
                System.out.println("返回的listIdMap ==> "+listIdMap);
            }
         XxxMapper.java:
            /**
             * 获取所有的User,返回⼀个Map集合。
             * Map集合的key是User的id。
             * Map集合的value是对应User。
             * @return
             */
            @MapKey("id")
            Map<Long,Map<String,Object>> selectAllUserRetMap();
    -->
    <select id="selectAllUserRetMap" resultType="map">
        select * from user
    </select>

<!-- ___________________________________________ 第四种:resultMap结果映射:精髓是,逐一定义数据库列名和对象属性名之间的映射关系。 ____________________________________________ -->
    <!-- 方式1:List<Bean>,resultMap结果映射:
                查询结果的列名和java对象的属性名对应不上怎么办?
                  (1)第⼀种⽅式:as 给列起别名
                  (2)第⼆种⽅式:使⽤resultMap进⾏结果映射
                  (3)第三种⽅式:是否开启驼峰命名⾃动映射(配置settings)
                <!-
                   resultMap:
                    (1)id:这个结果映射的标识,作为select标签的resultMap属性的值。
                    (2)type:结果集要映射的类。可以使⽤别名。
                ->
         postman:
            localhost:8080/select6
         XxxController.java:
            @RequestMapping("select6")
            public void select6(){
                List<User> users = userMapper.selectAllUserByResultMap();
                System.out.println("usersByResultMap ==> "+users);
            }
         XxxMapper.java:
            List<User> selectAllUserByResultMap();
    -->
    <resultMap id="userResultMap" type="com.pojo.User">
        <!--对象的唯⼀标识,官⽅解释是:为了提⾼mybatis的性能。建议写上。-->
        <id property="id" column="id"/>
        <!--当属性名和数据库列名⼀致时,可以省略。但建议都写上。-->
        <!--javaType⽤来指定属性类型。jdbcType⽤来指定列类型。⼀般可以省略。-->
        <result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
        <result property="age" column="age" />
        <result property="email" column="email"/>
        <result property="sex" column="sex"/>
    </resultMap>
    <!--resultMap属性的值必须和resultMap标签中id属性值⼀致。-->
    <select id="selectAllUserByResultMap" resultMap="userResultMap">
        select * from user
    </select>

    <!-- 方式2:假假假map<String,List<Bean>>,resultMap结果映射:
         实体类:
            public class UserVO {
                 private Integer idVO;
                 private List<User> userListVO;
            }
         postman:
            localhost:8080/select42
         XxxController.java:
            @RequestMapping("select42")
            public void selectMap42(){
                List<UserVO> userVo = userMapper.select42();
                System.out.println("学生的姓名是:"+userVo);
            }
         XxxMapper.java:
            List<UserVO> select42();
         返回值:
            [UserVO{   idVO=1, userListVO=[User{id=1, name='Jone', age=18, email='test1@baomidou.com', sex=null, cat=null, courseList=null}]},
             UserVO{   idVO=2, userListVO=[User{id=2, name='Jack', age=20, email='test2@baomidou.com', sex=null, cat=null, courseList=null}]},
             UserVO{   idVO=3, userListVO=[User{id=3, name='Tom', age=28, email='test3@baomidou.com', sex=null, cat=null, courseList=null}]},
             UserVO{   idVO=4, userListVO=[User{id=4, name='Sandy', age=21, email='test4@baomidou.com', sex=null, cat=null, courseList=null}]},
             UserVO{   idVO=5, userListVO=[User{id=5, name='Billie', age=24, email='test5@baomidou.com', sex=null, cat=null, courseList=null}]}]
    -->
    <resultMap id="selectMap42" type="com.pojo.UserVO">
        <result property="idVO" column="id"></result>
        <collection property="userListVO" javaType="java.util.ArrayList" ofType="com.pojo.User">
            <id property="id" column="id"/>
            <result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
            <result property="age" column="age" />
            <result property="email" column="email"/>
            <result property="sex" column="sex"/>
        </collection>
    </resultMap>
    <select id="select42" resultMap="selectMap42">
        select * from user
    </select>

    <!-- 方式3:真真真map<String,List<Bean>>,resultMap结果映射:
         postman:
            localhost:8080/select43
         XxxController.java:
            @RequestMapping("select43")
            public void selectMap43(){
                Map<String,List<User>> userVo = userMapper.select43();
                System.out.println("43:"+userVo);
            }
         XxxMapper.java:
            @MapKey("name")
            Map<String,List<User>> select43();
         返回结果:
            {Tom={userList=[User{id=3, name='Tom', age=28, email='test3@baomidou.com', sex=null, cat=null, courseList=null}], name=Tom},
             Billie={userList=[User{id=5, name='Billie', age=24, email='test5@baomidou.com', sex=null, cat=null, courseList=null}], name=Billie},
             Sandy={userList=[User{id=4, name='Sandy', age=21, email='test4@baomidou.com', sex=null, cat=null, courseList=null}], name=Sandy},
             Jack={userList=[User{id=2, name='Jack', age=20, email='test2@baomidou.com', sex=null, cat=null, courseList=null}], name=Jack},
             Jone={userList=[User{id=1, name='Jone', age=18, email='test1@baomidou.com', sex=null, cat=null, courseList=null}], name=Jone}
            }
    -->
    <resultMap id="selectMap43" type="java.util.Map">
        <result property="name" column="name"></result>
        <collection property="userList" javaType="java.util.ArrayList" ofType="com.pojo.User">
            <id property="id" column="id"/>
            <result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
            <result property="age" column="age" />
            <result property="email" column="email"/>
            <result property="sex" column="sex"/>
        </collection>
    </resultMap>
    <select id="select43" resultMap="selectMap43">
        select id, name, age, email, sex from user
    </select>
</mapper>
<!--
    https://blog.csdn.net/ks2686/article/details/124031383
    https://blog.csdn.net/u011066470/article/details/90486681
    https://blog.csdn.net/qq_37361514/article/details/119778763
    https://wenku.baidu.com/view/1a56646be618964bcf84b9d528ea81c758f52e8b.html?_wkts_=1676865547166&bdQuery=mybatis%E8%BF%94%E5%9B%9Emap%3Cstring%2Clist%3E
-->

参考:

        dljd - 老杜 -MyBatis讲义

        (419条消息) 【MyBatis】学习笔记06:各种查询所返回数据的数据类型_萌狼蓝天的博客-CSDN博客

(419条消息) spring boot -mybaits 的返回各种数据类型_健康平安的活着的博客-CSDN博客_mapper返回string
       (419条消息) mybatis 返回Map<String,List<Entity>> 格式数据_飘摇树的博客-CSDN博客
        Mybatis查询返回Map<String,List<Object>>类型 - 百度文库 (baidu.com)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值