MyBatis的各种查询功能

1、查询:

查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系

resultType:自动映射,用于属性名和表中字段名一致的情况

resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况

2、查询一个实体类的对象
User getUserById(@Param("id") Integer id);

//查询方法
<select id="getUserById" resultType="user">
    select * from user where id = #{id};
</select>

//测试类
@Test
public void testGetUserById(){
    User user = mapper.getUserById(7);
    System.out.println(user);
}
3、查询一个list集合

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

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

<select id="getAllUser" resultType="user">
    select * from user;
</select>

@Test
public void testGetAllUser(){
    List<User> users = mapper.getAllUser();
    System.out.println(users);
    System.out.println("--------------------------------");
    for(User user:users){
        System.out.println(user);
    }
    System.out.println("--------------------------------");
    users.forEach(System.out::println);
}
遍历User集合的几种方法
//法1 增强for循环
for(User user:users){
    System.out.println(user);
}

//法2 forEach
users.forEach(System.out::println);

//法3
//利用lambda表达式遍历users
users.forEach(user -> System.out.println(user));

//法4
for(int i=0;i< users.size();i++){
    System.out.println(users.get(i));
}
4、查询单个数据
/**
 * 查询用户的总数量
 * @return
 */
Integer getCount();

<select id="getCount" resultType="int">
    select count(*) from user;
</select>

@Test
public void testGetCount(){
    Integer countusers = mapper.getCount();
    System.out.println("用户总数:"+countusers);
}

5、查询一条数据为Map集合
/**
 * 根据id查询用户信息为Map集合
 * @param id
 * @return
 */
Map<String,Object> getUserByIdToMap(@Param("id") Integer id);

<select id="getUserByIdToMap" resultType="map">
    select * from user where id = #{id};
</select>

@Test
public void testGetUserByIdToMap(){
    Map<String,Object> map = mapper.getUserByIdToMap(6);
    System.out.println(map);
}
6、查询多条数据为Map集合
⑴方式一

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

错误写法

Map<String,Object> getAllUserToMap();
<select id="getAllUserToMap" resultType="map">
    select * from user
</select>

@Test
public void testGetAllUserToMap(){
    Map<String,Object> map = mapper.getAllUserToMap();
    System.out.println(map);
}

报错:TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 10

 该方法只能有一条数据结果

正确写法:

/**
     * 查询所有用户信息为Map集合,采用将map数据放入list集中的方式
     * @return
     */
    List<Map<String,Object>> getAllUserToMap();
    
<select id="getAllUserToMap" resultType="map">
    select * from user
</select>

public void testGetAllUserToMap(){
        List<Map<String,Object>> list = mapper.getAllUserToMap();
        System.out.println(list);
    }
    
    结果:
    [{password=123, sex=男, id=1, age=12, email=123@qq.com, username=admin},
     {password=123, sex=男, id=2, age=12, email=123@qq.com, username=admin},
      {password=456, sex=男, id=5, age=12, email=123@qq.com, username=qqq}]

⑵方式二

如果有多条数据,可以将每条数据转换的map集合放在一个大的map集合中,但是必须要通过@MapKey注解来完成。将查询的某个字段的值作为大的Map集合的键(key)

/**
 * 查询所有用户信息为Map集合,采用注解的方式
 * @return
 */
@MapKey("id")
Map<String,Object> getAllUserToMap2();

<select id="getAllUserToMap2" resultType="map">
    select * from user
</select>

@Test
public void testGetAllUserToMap2(){
    Map<String,Object> map  = mapper.getAllUserToMap2();
    System.out.println(map);
}
结果:()前边会写对应的key
{1={password=123, sex=男, id=1, age=12, email=123@qq.com, username=admin},
 2={password=123, sex=男, id=2, age=12, email=123@qq.com, username=admin},
 5={password=456, sex=男, id=5, age=12, email=123@qq.com, username=qqq}}

当查询的key值为age时

返回结果为

因为age所给值都是相同的,而key是唯一的,一个个查询时后一个会将前一个给覆盖,所以最后显示的只有最后一条(真正条数是对的,但是显示只有一个,因为其他都被覆盖了)

如果按照username查询,其结果会按照首字母排序,不同于数据库的顺序

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值