Mybatis 实用篇(四)返回值类型

Mybatis 实用篇(四)返回值类型

一、返回 List、Map

List<User> getUsers();
<select id="getUsers" resultType="User">
    select * from user;
</select>

Map<String, Object> getUsers();
<select id="getUsers" resultType="map">
    select * from user;
</select>

二、返回指定的 key

    @MapKey("id")
    Map<Integer, User> getUsers();
    <select id="getUsers" resultType="User">
        select * from user;
    </select>

三、resultMap

mapUnderscoreToCamelCase=true 时可以自动将下划线转为驼峰规则,如果还不能满足要求就需要自定义返回类型。如下:

List<User> getUsers();
<select id="getUsers" resultMap="myMap">
    select u.id, u.name, u.did, d.name dname from user u, dept d where u.did=d.id;
</select>

<resultMap id="myMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="dept.id" column="did"/>
    <result property="dept.name" column="dname"/>
</resultMap>

3.1 association

association 可以将一个 java bean 对象 dept 封装到起来,如:

public class User {

    private int id;
    private String name;
    private DePartment dept;
}
<resultMap id="myMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="dept" javaType="DePartment">
        <result property="id" column="did"/>
        <result property="name" column="dname"/>
    </association>
</resultMap>
<!-- association 可以分步查找 -->
<resultMap id="myMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <!-- 指定 select 语句的 id 和要传入的参数 id -->
    <association property="dept" javaType="DePartment" select="getDept" column="id"/>
</resultMap>

<select id="getUsers" resultMap="myMap">
    select id, name from user;
</select>
<select id="getDept" resultType="DePartment">
    select id, name from dept where id=#{id};
</select>

3.2 collection

collection 可以将 java bean 对象的 list 集合 users 封装到起来,如:

public class DePartment {

    private int id;
    private String name;
    private List<User> users;
}
<resultMap id="myMap" type="DePartment">
    <id property="id" column="did"/>
    <result property="name" column="dname"/>
    <collection property="users" ofType="User">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
    </collection>
</resultMap>
<select id="getDept" resultMap="myMap">
    select u.id, u.name, u.did, d.name dname from user u, dept d where u.did=d.id;
</select>

也可以分步查找,注意 N + 1 问题

<resultMap id="myMap" type="DePartment">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="users" ofType="User" select="getUsers" column="id"/>
</resultMap>
<select id="getUsers" resultType="User">
    select id, name from user where did=#{did};
</select>
<select id="getDept" resultMap="myMap">
    select id, name from dept;
</select>

注意:

  1. 支持多列传值:column="{key1=colum1, key2=colum2}"
  2. 分步查找支持缓存,可以配置属性 fetchType="eager(立即执行)/lazy(延迟加载)",也可以全局配置
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>

使用时如果用到了就会去查找,否则不会查找:

List<DePartment> depts = userMapper.getDept();
System.out.println(depts.get(0).getName());
System.out.println(depts.get(0).getUsers());

mybatis 查找时的 sql 如下,可以看到用到 dept 的 users 属性时才进行查找:

2018-09-06 06:50:30 DEBUG getDept9:159 - ==>  Preparing: select id, name from dept;
2018-09-06 06:50:30 DEBUG getDept9:159 - ==> Parameters:
2018-09-06 06:50:31 DEBUG getDept9:159 - <==      Total: 2
dev
2018-09-06 06:50:31 DEBUG getUsers9:159 - ==>  Preparing: select id, name from user where did=?;
2018-09-06 06:50:31 DEBUG getUsers9:159 - ==> Parameters: 1(Integer)
2018-09-06 06:50:31 DEBUG getUsers9:159 - <==      Total: 2
[User{id=1, name=‘binarylei‘, age=0, sex=‘null‘}, User{id=3, name=‘binarylei3‘, age=0, sex=‘null‘}]


每天用心记录一点点。内容也许不重要,但习惯很重要!

原文地址:https://www.cnblogs.com/binarylei/p/9746984.html

时间: 2024-10-01 20:25:05

Mybatis 实用篇(四)返回值类型的相关文章

MyBatis查询结果resultType返回值类型详细介绍

一.返回一般数据类型比如要根据 id 属性获得数据库中的某个字段值. mapper 接口: // 根据 id 获得数据库中的 username 字段的值 String getEmpNameById(Integer id); SQL 映射文件: <!-- 指定 resultType 返回值类型时 String 类型的, string 在这里是一个别名,代表的是 java.lang.String 对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 'hashmap' 基本数据

MyBatis中Mapper的返回值类型

insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.delete语句的返回值可以是Integer.Long和Boolean.在定义Mapper接口时直接指定需要的类型即可,无需在对应的<insert><update><delete>标签中显示声明. 对应的代码在 org.apache.ibatis.binding.MapperMe

C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分别来看看它们的使用. 一.void无返回值 void关键字我们都不陌生,它申明方法没有返回值.它的使用也很简单,我们来看一个示例就能明白. public class ORDER { publi

[转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T content) 2.Ok(). Ok(T content) 3.NotFound() 4.其他 5.自定义IHttpActionResult接口的实现 三.HttpResponseMessage 四.自定义类型 五.总结 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学

WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型

首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult     (需要MVC高版本才会支持,VS2012/2013不支持,请升级DLL文件或者到VS2015开发环境) HttpResponseMessage 自定义类型 此篇就

Web Api 接口返回值不困惑:返回值类型详解

前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 WebApi 接口参数:传参详解,这篇博文内容本身很基础,没想到引起很多园友关注,感谢大家的支持.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重要而又基础的知识点:返回值.还是那句话:本篇针对初初使用WebApi的同学们,比较基础,有兴趣的且看看. 使用过Webapi

Mybatis 实用篇(三)参数处理

Mybatis 实用篇(三)参数处理 sql 语句中的参数 parameterType 可以省略不写. 一.参数封装 1.1 单个参数处理 public interface UserMapper { User getUser(int id); } sql 中 #{} 的值可以随意,mybatis 不做任何处理,eg: <select id="getUser" parameterType="int" resultType="User">

Spring MVC方法的返回值类型

一,String类型作为返回值类型 返回值类型为String时,一般用于返回视图名称 1.当方法返回值为Null时,默认将请求路径当做视图 /jsp/thread/secondRequest.jsp 如果说没有试图解析器,如果返回值为Null携带数据只能用JSON 2.当方法返回一个String的字符串时,当字符串为逻辑视图名时只返回视图,如果要携带数据则使用request,session或者Json 如果要用Model或者ModelMap传递数据,那么Model或者ModelMap绝对是方法入

oc对象函数什么时候返回值类型使用instancetype

oc中定义对象函数时经常会返回本类类型的对象,此时返回值类型用instancetype或者本类对象*都可以,什么区别呢? 其实主要区别在返回值是不是self并且有继承 如果返回值是self并且作为父类,那么返回值最好写成instancetype 举例说明: 父类的声明 @interface Father : NSObject @property(readwrite,nonatomic,assign)NSInteger item; //元素自增 为了比较自增返回类型定为instancetype -