6、MyBatis的各种查询功能


【尚硅谷】SSM框架全套教程-讲师:杨博超

失败,是正因你在距成功一步之遥的时候停住了脚步。

6、MyBatis的各种查询功能

6.1、查询一个实体类对象

1 SelectMapper.java

// 根据id查询用户信息
User getUserById(@Param("id") String id);

2 SelectMapper.xml

<!--User getUserById(@Param("id") String id);-->
<select id="getUserById" resultType="User">
    select id, username, `password`, age, gender, email
    from t_user
    where id = #{id};
</select>

3 测试

@Test
public void testGetUserById() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    User user = mapper.getUserById("1");
    sqlSession.close();
    System.out.println(user);
}

6.2、查询一个list集合

1 SelectMapper.java

// 查询所有的用户信息
List<User> getAllUser();

2 SelectMapper.xml

<!--List<User> getAllUser();-->
<select id="getAllUser" resultType="User">
    select id, username, `password`, age, gender, email
    from t_user;
</select>

3 测试

@Test
public void testGetAllUser() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    List<User> list = mapper.getAllUser();
    sqlSession.close();
    list.forEach(System.out::println);
}

4 注意

  • 当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常TooManyResultsException。
  • 但是若查询的数据只有一条,可以使用实体类或集合作为返回值。

6.3、查询单个数据

MyBatis中为Java中常用的类型设置了类型别名
Integer: Integer,int
int: _int,_integer
Map: map
String: string

1 SelectMapper.java

// 查询数量
int getCount();

2 SelectMapper.xml

<!--int getCount();-->
<select id="getCount" resultType="_int">
    select count(*)
    from t_user
</select>

3 测试

@Test
public void testGetCount() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    int reuslt = mapper.getCount();
    System.out.println("数量为:" + reuslt);
}

4 注意:count(*)、count(1)、count(列名)

  • count(*):求表的总行数
  • count(1):求表的总行数
  • count(列名):查询字段数量,如果字段为null,这个字段不做统计
  • 若列名为主键,count(列名)会比count(1)快 ;若列名不为主键,count(1)会比count(列名)快
  • 如果表有多个列并且没有主键,则count(1)的执行效率优于 count(*)
  • 如果表只有一个字段,则 count(*) 最优。

6.4、查询一条数据为map集合

1 SelectMapper.java

// 根据id获取一条数据,存储map中
Map<String,Object> getUserByIdToMap(@Param("id") String id);

2 SelectMapper.xml

<!--Map<String,Object> getUserByIdToMap(@Param("id") String id);-->
<select id="getUserByIdToMap" resultType="map">
    select *
    from t_user
    where id = #{id};
</select>

3 测试

@Test
public void testGetUserByIdToMap() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    Map<String, Object> map = mapper.getUserByIdToMap("1");
    // {password=123, gender=男, id=1, age=23, email=123@qq.com, username=ybc}
    //Map<String, Object> map = mapper.getUserByIdToMap("7");
    //这条数据部分字段为null:{password=12, id=7, username=tt}
    System.out.println(map);
}

4 注意:map和实体类不同点

  • map:如果数据库存在字段值为null,map将不显示对应key。
  • 实体类:数据库存在字段值为null,实体类也会有对应的key,只是value为null。

6.5、查询多条数据为map集合

方式一

  • 将表中的数据以map集合的方式查询,一条数据对应一个map。
  • 若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取。

SelectMapper.java

// 查询所有用户信息,使用map集合
List<Map<String,Object>> getAllUserToMap();

SelectMapper.xml

<!--List<Map<String,Object>> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
    select id, username, `password`, age, gender, email
    from t_user;
</select>

测试

@Test
public void testGetAllUserToMap() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    List<Map<String, Object>> list = mapper.getAllUserToMap();
    sqlSession.close();
    for (Map<String, Object> map : mapList) {
        System.out.println(map);
    }
    /**
     * {password=123, gender=男, id=1, age=23, email=123@qq.com, username=ybc}
     * {password=4477, gender=男, id=3, age=23, email=123@qq.com, username=zty}
     */ 
}

方式二

  • 将表中的数据以map集合的方式查询,一条数据对应一个map。
  • 若有多条数据,就会产生多个map集合,并且最终要以一个map集合的方式返回数据,此时需要通过@MapKey注解设置map集合的键,此时以某个字段的值作为map集合的键,将每条数据转换map集合的值,放在同一个map集合中。

SelectMapper.java

// 查询所有用户信息为map集合
@MapKey("id")
Map<String,Object> getAllUserToMapMap();

SelectMapper.xml

<!--Map<String,Object> getAllUserToMapMap();-->
<select id="getAllUserToMapMap" resultType="map">
    select id, username, `password`, age, gender, email
    from t_user;
</select>

测试

@Test
public void testGetAllUserToMapMap() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    Map<String, Object> map = mapper.getAllUserToMapMap();
    sqlSession.close();
    System.out.println(map);
   /** 结果
    * {
    * 1={password=123, gender=男, id=1, age=23, email=123@qq.com, username=ybc}, 
    * 3={password=4477, gender=男, id=3, age=23, email=123@qq.com, username=zty}
    * }
    */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值