目录
- /**
- * 根据id查询用户信息
- * @param id
- * @return
- */
- User getUserById(@Param("id") Integer id);
- <select id="getUserById" resultType="User">
- select * from t_user where id=#{id}
- select>
- @Test
- public void testGetUserById(){
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
- User userById = mapper.getUserById(2);
- System.out.println(userById);
- }

- /**
- * 查询所有用户信息
- * @return
- */
- List
getAllUser();
- <select id="getAllUser" resultType="User">
- select * from t_user;
- select>
- @Test
- public void testGetAllUser(){
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
- List
allUser = mapper.getAllUser(); - allUser.forEach(System.out::println);
- }

若sql语句查询的结果为多条时,一定不能以实体类类型作为方法的返回值,否则会抛出TooManyResultsException
若sql语句查询的结果为1条时,此时可以使用实体类类型或list集合类型作为方法的返回值
有时候我们会查询当行单列的数据,比如说查询用户表里面用户的总记录数,这时候查询出来的就是单行单列。
- /**
- * 查询用户的总数量
- * @return
- */
- Integer getCount();
- <select id="getCount" resultType="Integer">
- select count(*) from t_user
- select>
- @Test
- public void testGetCount(){
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
- Integer count = mapper.getCount();
- System.out.println(count);
- }

注:
MyBatis中为Java中常用的类型设置了类型别名
Integer:Integer,int
int:int,integer
我们一般查询完一条数据都要转换为实体类对象,但是有这么个情况,我们查询出来的结果没有相对应的实体类,就比如说我们现在查询的结果里面有分组函数,比如说我们要查这个部门里的最高薪资,最低薪资,以及薪资总和,这时候并没有相应的实体类。
实体类和Map集合有什么区别?
实体类里的属性就是固定的,而Map集合里的键不固定。
所以说当我们的查询结果没有相对应的实体类时,我们就可以查询出来为一个Map集合。
- /**
- * 根据id查询用户信息为map集合
- * @param id
- * @return
- */
- Map
getUserByIdToMap(@Param("id") Integer id);
- <select id="getUserByIdToMap" resultType="map">
- select * from t_user where id=#{id}
- select>
- @Test
- public void testGetUserByIdToMap(){
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
- Map
map = mapper.getUserByIdToMap(2); - System.out.println(map);
- }

方式1:
- /**
- * 查询所有的用户信息为map集合
- * @return
- */
- Map
getAllUserToMap();
- <select id="getAllUserToMap" resultType="map">
- select * from t_user
- select>
- @Test
- public void testGetAllUserToMap(){
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
- Map
map = mapper.getAllUserToMap(); - System.out.println(map);
- }
那么现在是查多条数据放在map集合里,我们会发现报错
我们现在查询的结果有4条,但是我们返回值设置的是个Map集合,我们一条数据转换的就是map,这时候4条数据转换4个map,我们用一个map集合返回值是获取不到的。我们用的还是selectOne方法,只能获取一个结果,但是我们查询出来的结果有4条。
那么既然我们一条数据转换为一个map,多条数据则是放到一个可以存储map集合的List集合中,返回值可以这样写:
- /**
- * 查询所有的用户信息为map集合
- * @return
- */
- List
- @Test
- public void testGetAllUserToMap(){
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
- List
- System.out.println(list);
- }

方式2:
我们在接口中的方法还是可以这么写:Map
因为Map集合也可以存储多条数据,但是map和list不一样,你可以直接把每条数据转换为的map放在list中,但是不能把每条数据转换为的map放在map集合中,因为map是键值对,我们查出来的数据作为值,但是谁作为键呢?所以说这时候要用到一个注解@Mapkey(),这是把我们当前查询的数据所转换的map集合,放到一个大的map集合中,通过这个注解,可以设置map集合的键。这里写的就是我们所查询出来的数据的字段,比如说我们把查询出来的id作为map的键,值就是当前的每一条数据所转换为的map集合。
- @MapKey("id")
- Map
getAllUserToMap();
- @Test
- public void testGetAllUserToMap(){
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
- Map
map = mapper.getAllUserToMap(); - System.out.println(map);
- }

注:
若查询的数据有多条时,并且要将每条数据转为map集合
此时有2种解决方案:
1.将mapper接口的方法返回值设置为泛型是map的list集合
2.可以将每条数据转换的map集合放在一个大的map中,但是必须要通过@MapKey注解,将查询的某个字段的值作为大的map的键
@MapKey("id")
Map
getAllUserToMap();