Mybatis——返回值(resultType&resultMap)详解

之前的文章里面有对resultType和resultMap的简单介绍这一期出点详细的

resultType:

1,返回值为简单类型。

直接使用resultType="类型",如string,Integer等。

java 复制代码
 String getEmpNameById(Integer id);
java 复制代码
<!-- 
        指定 resultType 返回值类型时 String 类型的,
        string 在这里是一个别名,代表的是 java.lang.String 

        对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 'hashmap'
        基本数据类型考虑到重复的问题,会在其前面加上 '_',比如 byte 对应的别名是 '_byte'
    -->
    <select id="getEmpNameById" resultType="string">
        select username from t_employee where id = #{id}
    </select>

2.返回值为List类型。

使用resultType="list元素的类型",一般是实体类如User,也可以是Map,对应返回值类型是List<User> , List<Map<String,Object>>,不管是哪种,最终结果会根据接口返回值类型自动将多个 resultType指定的类型的元素(User或以一条记录为一个Map)组装成List。

java 复制代码
 List<User> getUser(String age);
java 复制代码
<select id="getUser" resultType="User">
        select * from user
        where
        age = #{age}
    </select>
java 复制代码
 List<Map<String,Object>> findUserList();
java 复制代码
 <select id="findUserList"  parameterType="int" resultType="java.util.Map">
        SELECT * FROM user
    </select>

用java.util.List也是可以的,java.util.Map也是可以的至于为什么我没有没有研究过

3.返回值为Map类型。(使用map要注意查询结果的条数,多条会报错)

  1. 如果查询的结果是一条,我们可以把查询的数据以{表字段名, 对应的值}方式存入到Map中。
java 复制代码
   Map<String, Object> getEmpAsMapById(Integer id);
java 复制代码
  <!-- 
        注意这里的 resultType 返回值类型是 'map'
     -->
    <select id="getEmpAsMapById" resultType="map">
        select * from t_employee where id = #{id}
    </select>
  1. 如果查询的结果是多条数据,我们也可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map
java 复制代码
// 查询所有员工的信息,把数据库中的 'id' 字段作为 key,对应的 value 封装成 Employee 对象
    // @MapKey 中的值表示用数据库中的哪个字段名作 key
    @MapKey("id")
    Map<Integer, Employee> getAllEmpsAsMap();
java 复制代码
 <!--
        注意 resultType 返回值类型,不再是 'map',而是 Map 的 value 对应的 JavaBean 类型
    -->
    <select id="getAllEmpsAsMap" resultType="employee">
        select * from t_employee
    </select>

扩展. 上面返回结果的形式都是基于查询 (select) 的,其实对于增删改的操作也可以返回一定类型的数据,比如BooleanInteger等。

resultMap:

属于自定义的映射,用于由于各种原因数据库的字段名跟实体类的字段名不一致

1.Emp实体类的属性:

java 复制代码
    private Integer empId;
    private String empName;
    private Integer age;
    private String gender;

2.表字段名:

|--------|----------|-----|--------|---------|
| emp_id | emp_name | age | gender | dept_id |

3.映射文件配置:

java 复制代码
<!--  Emp getEmpById(@Param("emp_id") Integer emp_id);-->
    <select id="getEmpById" resultType="Emp">
        select * from t_emp where emp_id = #{emp_id}
    </select>

4.执行结果发现empId=null,empName=null

原因:数据库表字段名中的emp_id,emp_name与实体类的属性名empId,empName不一致,由数据库不能映射到实体类属性对应的属性名

1. 方式一 字段名设置别名

java 复制代码
select emp_id empid from emp where emp_id  =  #{emp_id}

2. 方式二 下划线映射为驼峰(在配置文件中配置)

java 复制代码
<!--引入properties文件,此时就可以${属性名}的方式访问属性值-->
    <properties resource="jdbc.properties"/>
 
<!--配置mybatis自动转换为驼峰式命名-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true" />
    </settings>

3. 方式三 自定义映射resultMap

resultMap: 设置自定义的映射关系
id: 唯一标识-->resultMap=" "
type: 处理映射关系的实体类的类型
标签:
id: 处理主键和实体类中属性的映射关系
result: 处理普通字段和实体类中属性的映射关系
column: 设置映射关系中的字段名,必须是sql中的某字段
property: 设置映射关系中的属性的属性名,必须为实体类中的属性名

java 复制代码
 <resultMap id="empDeptMapResultMapOne" type="Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <result column="did" property="dept.did"></result>
        <result column="dname" property="dept.dname"></result>
 
  </resultMap>
 
<select id="getEmpAndDept" resultMap="empDeptMapResultMapTwo">
        select emp.*,dept.* from emp left join dept on emp.did = dept.did where emp.eid = #{eid}
 </select>
相关推荐
老邓计算机毕设4 小时前
SSM学生选课系统xvbna(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生选课系统·ssm 框架·高校教学管理
枷锁—sha4 小时前
【PortSwigger Academy】SQL 注入绕过登录 (Login Bypass)
数据库·sql·学习·安全·网络安全
麦克马6 小时前
MyBatis中字符串比较的类型解析问题与解决方案
mybatis
逍遥德6 小时前
PostgreSQL 中唯一约束(UNIQUE CONSTRAINT) 和唯一索引(UNIQUE INDEX) 的核心区别
数据库·sql·postgresql·dba
工业甲酰苯胺6 小时前
字符串分割并展开成表格的SQL实现方法
数据库·sql
科技块儿7 小时前
IP定位技术:游戏反外挂体系中的精准识别引擎
数据库·tcp/ip·游戏
衫水7 小时前
[特殊字符] MySQL 常用指令大全
数据库·mysql·oracle
卓怡学长7 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
小句8 小时前
SQL中JOIN语法详解 GROUP BY语法详解
数据库·sql
阿杰 AJie8 小时前
MySQL 里给表添加索引
数据库·mysql