MyBatis的各种查询功能

目录

1.查询一个实体类对象

2.查询一个list集合

3.查询单个数据

4.查询一条数据为map集合

5.查询多条数据为map集合


1.查询一个实体类对象

/**
 * 根据id查询用户信息
 * @param id
 * @return
 */
User getUserById(@Param("id") Integer id);
<!--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);
}


2.查询一个list集合

/**
 * 查询所有用户信息
 * @return
 */
List<User> getAllUser();
<!--List<User> 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<User> allUser = mapper.getAllUser();
	allUser.forEach(System.out::println);
}

若sql语句查询的结果为多条时,一定不能以实体类类型作为方法的返回值,否则会抛出TooManyResultsException

若sql语句查询的结果为1条时,此时可以使用实体类类型或list集合类型作为方法的返回值  

3.查询单个数据

有时候我们会查询当行单列的数据,比如说查询用户表里面用户的总记录数,这时候查询出来的就是单行单列。

/**
 * 查询用户的总数量
 * @return
 */
Integer getCount();
<!--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

4.查询一条数据为map集合

我们一般查询完一条数据都要转换为实体类对象,但是有这么个情况,我们查询出来的结果没有相对应的实体类,就比如说我们现在查询的结果里面有分组函数,比如说我们要查这个部门里的最高薪资,最低薪资,以及薪资总和,这时候并没有相应的实体类。

实体类和Map集合有什么区别?

实体类里的属性就是固定的,而Map集合里的键不固定。

所以说当我们的查询结果没有相对应的实体类时,我们就可以查询出来为一个Map集合。

/**
 * 根据id查询用户信息为map集合
 * @param id
 * @return
 */
Map<String,Object> getUserByIdToMap(@Param("id") Integer id);
<!--Map<String,Object> 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<String, Object> map = mapper.getUserByIdToMap(2);
	System.out.println(map);
}

5.查询多条数据为map集合

方式1:

/**
 * 查询所有的用户信息为map集合
 * @return
 */
Map<String,Object> getAllUserToMap();
<!--Map<String,Object> 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<String, Object> map = mapper.getAllUserToMap();
	System.out.println(map);
}

那么现在是查多条数据放在map集合里,我们会发现报错

我们现在查询的结果有4条,但是我们返回值设置的是个Map集合,我们一条数据转换的就是map,这时候4条数据转换4个map,我们用一个map集合返回值是获取不到的。我们用的还是selectOne方法,只能获取一个结果,但是我们查询出来的结果有4条。

那么既然我们一条数据转换为一个map,多条数据则是放到一个可以存储map集合的List集合中,返回值可以这样写:

/**
 * 查询所有的用户信息为map集合
 * @return
 */
List<Map<String,Object>> getAllUserToMap();
@Test
public void testGetAllUserToMap(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
	List<Map<String, Object>> list = mapper.getAllUserToMap();
	System.out.println(list);
}


方式2:

我们在接口中的方法还是可以这么写:Map<String,Object> getAllUserToMap();

因为Map集合也可以存储多条数据,但是map和list不一样,你可以直接把每条数据转换为的map放在list中,但是不能把每条数据转换为的map放在map集合中,因为map是键值对,我们查出来的数据作为值,但是谁作为键呢?所以说这时候要用到一个注解@Mapkey(),这是把我们当前查询的数据所转换的map集合,放到一个大的map集合中,通过这个注解,可以设置map集合的键。这里写的就是我们所查询出来的数据的字段,比如说我们把查询出来的id作为map的键,值就是当前的每一条数据所转换为的map集合。

@MapKey("id")
Map<String,Object> getAllUserToMap();
@Test
public void testGetAllUserToMap(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
	Map<String, Object> map = mapper.getAllUserToMap();
	System.out.println(map);
}

 

注:

若查询的数据有多条时,并且要将每条数据转为map集合

此时有2种解决方案:

1.将mapper接口的方法返回值设置为泛型是map的list集合

2.可以将每条数据转换的map集合放在一个大的map中,但是必须要通过@MapKey注解,将查询的某个字段的值作为大的map的键

@MapKey("id")

Map<String, Object> getAllUserToMap();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GodAiro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值