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查询,其结果会按照首字母排序,不同于数据库的顺序