<?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='[email protected]', sex=null, cat=null, courseList=null}]},
UserVO{ idVO=2, userListVO=[User{id=2, name='Jack', age=20, email='[email protected]', sex=null, cat=null, courseList=null}]},
UserVO{ idVO=3, userListVO=[User{id=3, name='Tom', age=28, email='[email protected]', sex=null, cat=null, courseList=null}]},
UserVO{ idVO=4, userListVO=[User{id=4, name='Sandy', age=21, email='[email protected]', sex=null, cat=null, courseList=null}]},
UserVO{ idVO=5, userListVO=[User{id=5, name='Billie', age=24, email='[email protected]', 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='[email protected]', sex=null, cat=null, courseList=null}], name=Tom},
Billie={userList=[User{id=5, name='Billie', age=24, email='[email protected]', sex=null, cat=null, courseList=null}], name=Billie},
Sandy={userList=[User{id=4, name='Sandy', age=21, email='[email protected]', sex=null, cat=null, courseList=null}], name=Sandy},
Jack={userList=[User{id=2, name='Jack', age=20, email='[email protected]', sex=null, cat=null, courseList=null}], name=Jack},
Jone={userList=[User{id=1, name='Jone', age=18, email='[email protected]', 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)