当前位置: 首页 > news >正文

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

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

resultType:

1,返回值为简单类型。
        直接使用resultType=“类型”,如string,Integer等。

 String getEmpNameById(Integer id);
<!-- 指定 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。

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

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

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

1. 如果查询的结果是一条,我们可以把查询的数据以{表字段名, 对应的值}方式存入到Map中。

   Map<String, Object> getEmpAsMapById(Integer id);
  <!-- 注意这里的 resultType 返回值类型是 'map'--><select id="getEmpAsMapById" resultType="map">select * from t_employee where id = #{id}</select>

 

2. 如果查询的结果是多条数据,我们也可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map

// 查询所有员工的信息,把数据库中的 'id' 字段作为 key,对应的 value 封装成 Employee 对象// @MapKey 中的值表示用数据库中的哪个字段名作 key@MapKey("id")Map<Integer, Employee> getAllEmpsAsMap();
 <!--注意 resultType 返回值类型,不再是 'map',而是 Map 的 value 对应的 JavaBean 类型--><select id="getAllEmpsAsMap" resultType="employee">select * from t_employee</select>

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

 resultMap:

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

1.Emp实体类的属性:

    private Integer empId;private String empName;private Integer age;private String gender;

2.表字段名: 

emp_idemp_nameagegenderdept_id

  3.映射文件配置:

<!--  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. 方式一 字段名设置别名

select emp_id empid from emp where emp_id  =  #{emp_id}

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

<!--引入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: 设置映射关系中的属性的属性名,必须为实体类中的属性名

 <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>


 

 

http://www.lryc.cn/news/132839.html

相关文章:

  • 多IP服务器有什么作用
  • Python-主线程控制子线程结束
  • 水电站防雷工程综合解决方案
  • 每日刷题(翻转+二分+BFS)
  • 系统卡死问题分析
  • 中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻
  • int和Integer的不同
  • eslintignore无效解决办法
  • C# 学习笔记
  • 算法练习(8):牛客在线编程08 字符串
  • 深入理解分布式架构,构建高效可靠系统的关键
  • 为什么选择elasticsearch分布式搜索引擎
  • 一百五十九、Kettle——Kettle9.2通过配置Hadoop clusters连接Hadoop3.1.3(踩坑亲测、附流程截图)
  • 渗透测试之逻辑漏洞
  • HTML class 中 CSS名称的顺序并不重要
  • 设计模式8:代理模式-静态代理
  • 运动耳机哪款好用、适合运动的耳机推荐
  • 页面滑动到可视区域加载更多内容思维流程
  • Java Word转PDF(直接转和以图片形式转)、PDF转图片、图片转PDF
  • dockerfile编写LNMP
  • websocket + stomp + sockjs学习
  • ApplicationListener , @EventListener 和 CommandLineRunner 启动顺序验证
  • 网络编程基础(1)
  • Linux驱动开发(Day4)
  • LVS负载均衡群集部署(LVS-NAT模型实例)
  • 【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进
  • stm32单片机/51单片机蜂鸣器不响(proteus模拟)
  • BERT、ERNIE、Grover、XLNet、GPT、MASS、UniLM、ELECTRA、RoBERTa、T5、C4
  • 主机防护的重要性和方式
  • 聚观早报 | 抢先体验阿维塔11座舱;本田和讴歌采用NACS充电标准