6、MyBatis的各种查询功能

文章目录

  • 6、MyBatis的各种查询功能
    • 6.1、查询一个实体类对象
      • 1 SelectMapper.java
      • 2 SelectMapper.xml
      • 3 测试
    • 6.2、查询一个list集合
      • 1 SelectMapper.java
      • 2 SelectMapper.xml
      • 3 测试
      • 4 注意
    • 6.3、查询单个数据
      • 1 SelectMapper.java
      • 2 SelectMapper.xml
      • 3 测试
      • 4 注意:count(*)、count(1)、count(列名)
    • 6.4、查询一条数据为map集合
      • 1 SelectMapper.java
      • 2 SelectMapper.xml
      • 3 测试
      • 4 注意:map和实体类不同点
    • 6.5、查询多条数据为map集合
      • 方式一
      • 方式二


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

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

6、MyBatis的各种查询功能

6.1、查询一个实体类对象

1 SelectMapper.java

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

2 SelectMapper.xml


<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


<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


<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


<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 protected], username=ybc}
    //Map 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


<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 protected], username=ybc}
     * {password=4477, gender=男, id=3, age=23, [email protected], username=zty}
     */ 
}

方式二

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

SelectMapper.java

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

SelectMapper.xml


<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 protected], username=ybc}, 
    * 3={password=4477, gender=男, id=3, age=23, [email protected], username=zty}
    * }
    */
}

你可能感兴趣的:(MyBatis,mybatis,java)