MyBatis中的几种查询结果集返回类型映射

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();
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis是一种流行的Java ORM框架,它提供了几种查询结果返回类型,其之一就是Map。 Mybatis查询返回Map的方式可以通过在SQL映射文件使用resultType属性指定为Map来实现。通常,我们可以使用类似于以下示例代码的方式: <select id="selectUser" resultType="map"> select * from user where id=#{id} </select> 当我们执行此查询时,Mybatis返回一个包含查询结果数据的Map对象。在这个Map对象,键是列名,值是对应的列的值。 我们可以通过以下代码将查询结果转换为Map对象: Map<String, Object> result = sqlSession.selectOne("selectUser", 1); 在这个例子,我们将查询结果转化为一个包含键和值的Map对象。这个Map对象的键是每个列的名称,值是对应的行数据。这样,我们就可以通过这个Map对象来实现数据的操作。 总的来说,Mybatis查询返回Map是一种非常方便的方式,可以通过映射文件的简单指定来实现。然后,我们可以通过处理这些Map对象来实现复杂的数据操作。 ### 回答2: Mybatis查询返回`Map`是一种常见的数据返回方式,它将查询结果以`Map`的形式返回,以便于快速访问和操作。在使用Mybatis进行查询时,我们可以通过以下步骤返回`Map`对象: 1.在Mapper.xml编写SQL语句,并选取返回值类型为`Map` ``` <select id="selectUser" parameterType="int" resultType="java.util.Map"> select * from user where id = #{id} </select> ``` 2.在Java代码执行查询,并获取返回的Map对象 ``` SqlSession sqlSession = sqlSessionFactory.openSession(); Map<String, Object> userMap = sqlSession.selectOne("selectUser", 1); ``` 在返回的`Map`,键值对的形式为列名和对应的值,我们可以根据需要获取相应的值。例如,获取用户的名字和年龄可以这样写: ``` String name = (String)userMap.get("name"); int age = (int)userMap.get("age"); ``` 需要注意的是,当查询结果含有多条记录时,返回的`Map`对象只包含第一条记录的数据。此时需要使用`selectList`方法返回一个`List<Map>`来获取所有记录的数据。同时,在查询结果,如果存在名字相同的列,Mybatis会自动将后面的列值覆盖前面的列值,因此建议在查询时尽量避免列名重复。 总而言之,Mybatis查询返回`Map`是一种方便快捷的数据返回方式,在需要快速获取数据时特别适用。但需要根据实际情况来判断是否适合使用,并注意使用过程的一些细节。 ### 回答3: MyBatis 是一个流行的 ORM(对象关系映射)框架,用于简化数据库访问。MyBatis 查询返回 Map 是一种常见的查询结果格式,其主要优势在于可以根据查询结果的键名来访问对应的数据值。 在 MyBatis ,我们可以使用 @MapKey 注解将查询结果转换为 Map。这个注解可以用于指定 Map 的键名,例如: ```java @MapKey("id") List<Map<String, Object>> selectUsersById(List<Integer> ids); ``` 这个示例,我们使用 @MapKey 注解将查询结果转换为一个 Map,其键名为 id,值为对应的 Map 对象。这样,我们就可以通过键名 id 来快速访问对应的用户信息。 当然,我们也可以使用自定义的键名。例如: ```java @MapKey("userName") List<Map<String, Object>> selectAllUsers(); ``` 这个示例,我们将查询结果转换为一个 Map,其键名为 userName,值为对应的 Map 对象。这样,我们就可以根据用户名来快速访问对应的用户信息。 除了使用 @MapKey 注解,我们还可以使用 ResultMap 自定义查询结果映射。例如: ```xml <resultMap id="userMap" type="java.util.HashMap"> <id column="id" property="id"/> <result column="user_name" property="userName"/> <result column="email" property="email"/> </resultMap> <select id="selectAllUsers" resultMap="userMap"> select id, user_name, email from users </select> ``` 这个示例,我们定义了一个 resultMap,将查询结果映射为一个 HashMap。通过 column 和 property 属性可以指定键名和值的映射关系。 总的来说,MyBatis 查询返回 Map 是一种非常实用的查询结果格式,可以方便快捷地访问查询结果。同时,我们也可以通过 @MapKey 和 ResultMap 来自定义键名和值的映射关系,使查询结果更加灵活。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值