MyBatis中的几种查询结果集返回类型映射
一、MyBatis查询结果类型
MyBatis查询是比较常用的功能操作,对于查询语句来说,它是需要返回查询结果的,不同查询可以返回不同类型的查询结果,例如:查询记录总数,那么就是返回整数类型;查询行记录数据,那就是返回实体类;等等类型。下面就介绍一下我自己在实际开发过程里面,遇见的一些查询返回值类型。
1.1、返回整数类型
查询结果是一个Integer整数,这种情况一般是统计总数,例如:使用count()统计数据量,这个时候就只需要返回一个数量即可。
- 创建Mapper接口方法,接口方法的返回值类型需要定义为整数类型,一般都是定义为:Integer。
package com.mybatis.demo.mapper;
/**
* @author Js
* @version 1.0.0
* @Date: 2022/9/09 10:20
* @Description
*/
public interface UserMapper {
/**
* 统计数量
* @return
*/
Integer countNum();
}
- 编写XML映射文件,查询结果的返回值类型resultType需要设置为整数类型。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 编写查询SQL语句 -->
<select id="countNum" resultType="java.lang.Integer">
select count(1) from user
</select>
</mapper>
1.2、返回单个实体类
查询也可以返回单个实体类类型,例如:根据主键查询指定的记录,这个时候最多只能查询出一条数据,也就是对应一个实体类对象,MyBatis框架会自动将数据记录映射到实体类对象。
- 创建Mapper接口,定义接口方法,方法返回值设置为实体类类型,例如:User类型。
package com.mybatis.demo.mapper;
import com.mybatis.demo.domain.User;
/**
* @author Js
* @version 1.0.0
* @Date: 2022/9/09 13:01
* @Description
*/
public interface UserMapper {
/**
* 查询单个实体
* @return
*/
User getOneUser();
}
- 定义XML映射文件,映射文件中resultType需要设置为User类型,这样MyBatis框架才知道要将查询结果转换为User类型。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 编写查询SQL语句 -->
<select id="getOneUser" resultType="com.mybatis.demo.domain.User">
select * from user where id = 3009
</select>
</mapper>
1.3、返回集合类型
当查询的结果数据有很多,那么就可以采用集合类来作为方法的返回值,例如:List、List、List等等,这些都属于集合类型的返回值,具体看查询结果。
- 创建Mapper接口,接口方法的返回值类型设置为List。
package com.mybatis.demo.mapper;
import com.mybatis.demo.domain.User;
import java.util.List;
/**
* @author Js
* @version 1.0.0
* @Date: 2022/9/09 13:05
* @Description
*/
public interface UserMapper {
/**
* 查询多个实体
* @return
*/
List<User> queryList();
}
- 定义XML映射文件,查询结果类型resultType设置为对应实体类即可,MyBatis会自动将多个实体类转换为List集合。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 编写查询SQL语句 -->
<select id="queryList" resultType="com.mybatis.demo.domain.User">
select * from user
</select>
</mapper>
1.4、返回Map类型
MyBatis框架里面,也支持将方法的返回值设置为Map类型,返回值设置为Map类型之后,MyBatis会将数据库字段作为key,数据库字段的值作为value保存到Map集合里面。
- 创建Mapper接口,接口方法的返回值设置为Map类型。
package com.mybatis.demo.mapper;
import com.mybatis.demo.domain.User;
import java.util.Map;
/**
* @author Js
* @version 1.0.0
* @Date: 2022/9/09 13:20
* @Description
*/
public interface UserMapper {
/**
* 查询Map结果
* @return
*/
Map<String, Object> getMapRes();
}
- 定义XML映射文件,将resultType查询结果返回值类型设置为Map类型。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 编写查询SQL语句 -->
<select id="getMapRes" resultType="java.util.Map">
select * from user where id = 3009
</select>
</mapper>
MyBatis默认情况下,当设置的返回值是Map类型时候,它是将数据表的字段名称作为Map集合的key,对应的数据值作为value,查询结果如下所示:
1.5、返回List
其实这种情况,也是属于返回值是Map类型的,只不过是返回了多个Map结果,那么就可以利用List集合进行接收,MyBatis会自动将多个Map结果保存到List集合里面。
- 创建Mapper接口,接口方法的返回值类型设置为List<Map<String, Object>>,具体类型根据实际情况定义。
package com.mybatis.demo.mapper;
import com.mybatis.demo.domain.User;
import java.util.List;
import java.util.Map;
/**
* @author Js
* @version 1.0.0
* @Date: 2022/9/09 13:30
* @Description
*/
public interface UserMapper {
/**
* 查询多个Map结果
* @return
*/
List<Map<String, Object>> getAllMapRes();
}
- 定义XML映射文件,将resultType返回值类型设置为Map类型,多个查询结果MyBatis会自动转换为List集合保存。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 编写查询SQL语句 -->
<select id="getAllMapRes" resultType="java.util.Map">
select * from user
</select>
</mapper>
1.6、通过@MapKey返回Map类型
上面两种方式(1.4、1.5)返回的Map类型都是默认按照数据表字段作为key,对应的值作为value的,有没有什么方式指定具体的key呢???
MyBatis也是支持指定具体的key,只需要在Mapper接口方法上面添加【@MapKey】注解,然后指定具体的字段作为Map集合的key即可,指定具体的key之后,MyBatis会将每个数据记录中@MapKey对应字段的值作为最终Map结果的key。
- 创建 Mapper接口,接口方法上面添加@MapKey注解,这里我们指定数据表中【id】字段作为Map结果的key。
package com.mybatis.demo.mapper;
import com.mybatis.demo.domain.User;
import org.apache.ibatis.annotations.MapKey;
import java.util.Map;
/**
* @author Js
* @version 1.0.0
* @Date: 2022/9/09 13:50
* @Description
*/
public interface UserMapper {
/**
* 指定具体的key
* @return
*/
@MapKey(value = "id")
Map<String, Object> getAllMapKey();
}
- 定义XML映射文件,将resultType返回值类型设置为Map。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 编写查询SQL语句 -->
<select id="getAllMapKey" resultType="java.util.Map">
select * from user
</select>
</mapper>
通过@MapKey指定具体的键key之后,不管查询数据有多少条,最终的查询结果都将放到同一个Map结果里面,例如查询结果如下所示:
1.7、测试程序代码
这里给出上面每一种返回值的测试程序代码。
package com.mybatis.demo;
import com.mybatis.demo.domain.User;
import com.mybatis.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
/**
* @author Js
* @version 1.0.0
* @Date: 2022/9/09 14:20
* @Description
*/
public class ReturnTest {
public static void main(String[] args) throws IOException {
// 1、加载配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3、创建 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = builder.build(is);
// 4、创建 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5、获取 UserMapper 接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 6、调用方法
// Integer count = userMapper.countNum();
// System.out.println(count);
// User user = userMapper.getOneUser();
// System.out.println(user);
// List<User> userList = userMapper.queryList();
// for (User user : userList) {
// System.out.println(user);
// }
// Map<String, Object> res = userMapper.getMapRes();
// System.out.println(res);
// List<Map<String, Object>> mapList = userMapper.getAllMapRes();
// for (Map<String, Object> ans : mapList) {
// System.out.println(ans);
// }
Map<String, Object> mapResult = userMapper.getAllMapKey();
System.out.println(mapResult);
// 7、关闭流
is.close();
}
}