MyBatis-resultType 与 resultMap 中的几种返回类型

news/2024/11/9 15:51:03

一、返回集合

1.返回JavaBean集合

public List<MyUser> selectMyUserByNameLike(String name);
<!-- resultType 集合内的元素类型 -->
<select id="selectMyUserByNameLike" resultType="myUser" parameterType="string">
  select * from myuser where name like #{name}
</select>

测试方法

public static void main(String[] args) {
    SqlSession session = null;
    try {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        session = sqlSessionFactory.openSession();

        MyUserMapper mapper = session.getMapper(MyUserMapper.class);
        List<MyUser> myUsers = mapper.selectMyUserByNameLike("%a%");
        System.out.println(myUsers);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

2.返回 Map 集合

<!--public List<Map<String,Object>> getMyUser()-->
<select id="getMyUser" resultType="map">
  select * from myuser
</select>

 

二、返回 Map

1.一条记录

public Map<String,Object> selectMyUserById(Integer id);
<select id="selectMyUserById" resultType="map" parameterType="integer">
  select * from myuser where id = #{id}
</select>

2.多条记录,需要指定 Map 的 Key 和 Value 的类型

// 指定 Map 的 Key 从记录中的 id 列获取
@MapKey("id")
public Map<String,MyUser> selectMyUserByGtId(Integer id);
<!-- resultType Map 中 value 的类型 -->
<select id="selectMyUserByGtId" resultType="myUser" parameterType="integer">
  select * from myuser where id > #{id}
</select>

 

三、返回 resultMap 自定义结果集封装

关于自动映射封装的配置

<settings>
    <!-- 自动映射有三种模式,NONE、PARTIAL、FULL。NONE 不启用自动映射,PARTIAL 只对非嵌套的 resultMap 进行自动映射,FULL 表示对所有的 resultMap 都进行自动映射。默认为 PARTIAL -->
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <!-- 数据库字段下划线转Bean字段的驼峰命名 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- 控制台打印SQL -->
    <setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

默认数据库字段与 JavaBean 对应不上时可开启驼峰命名或查询时使用别名

http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Auto-mapping

 

1.自定义 JavaBean 的封装

确认是否成功可以关掉 MyBatis 的自动映射

<setting name="autoMappingBehavior" value="NONE"/>
public MyUser selectMyUserById(Integer id);
<!-- 自定义某个 javaBean 的封装规则
    type:自定义规则中JavaBean类型的全路径,可用别名
    id:唯一id方便引用 -->
<resultMap type="myUser" id="myUserResultMap">
    <!-- 指定主键列的封装规则,用 id 标签定义主键会底层有优化
    column:指定哪一列
    property:指定对应的javaBean属性 -->
    <id column="id" property="id"/>
    <!-- 定义普通列封装规则 -->
    <result column="name" property="name"/>
    <!-- 其他不指定的列会自动封装:建议只要写 resultMap 就把全部的映射规则都写上 -->
    <result column="age" property="age"/>
</resultMap>

<!-- 使用 resultMap,不使用 resultType -->
<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
  select * from myuser where id = #{id}
</select>

 

2.关联查询的封装,一对一,JavaBean 属性包含 JavaBean

public MyUser selectMyUserById(Integer id);

直接调用属性赋值

<resultMap type="myUser" id="myUserResultMap">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <!--直接属性封装-->
    <result column="did" property="dept.id"/>
    <result column="dname" property="dept.name"/>
</resultMap>

<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
  SELECT m.id, m.name, m.age, m.did, d.name AS dname FROM myuser m,dept d WHERE m.did = d.id AND m.id = #{id}
</select>

使用 association

<resultMap type="com.bean.MyUser" id="myUserResultMap">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <!--  association 指定联合的 javaBean 对象
        property="dept":指定哪个属性是联合的对象
        javaType:指定这个属性对象的类型[不能省略] -->
    <association property="dept" javaType="com.bean.Dept">
        <id column="did" property="id"/>
        <result column="dname" property="name"/>
    </association>
</resultMap>

<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
  SELECT m.id, m.name, m.age, m.did, d.name AS dname FROM myuser m,dept d WHERE m.did = d.id AND m.id = #{id}
</select>

使用 association 二次查询,即有两条 SQL

<resultMap id="myUserResultMap" type="com.bean.MyUser">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <!-- association 定义关联对象的封装规则
        select:当前属性是调用 select 指定的方法查出的结果
        column:将哪一列的值传给这个方法 -->
    <association property="dept" select="com.dao.DeptMapper.selectDeptById" column="did"/>
</resultMap>
<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
  SELECT * FROM myuser WHERE id = #{id}
</select>
<?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">
<!-- namespace 对应接口文件的全路径 -->
<mapper namespace="com.dao.DeptMapper">
    <select id="selectDeptById" resultType="dept" parameterType="string">
      select * from dept where id = #{id}
    </select>
</mapper> 

开启懒加载:在没有使用 Dept 的属性时,则只会加载 MyUser 的属性。即只会发送一条 SQL 语句,要使用 Dept 属性时才会发送第二条 SQL。不会一次性发送两条 SQL

<!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载。默认false (true in ≤3.4.1) -->
<setting name="aggressiveLazyLoading" value="false"/>

 

3.关联查询的封装,一对多,JavaBean 属性包含 JavaBean 的集合

使用 association

public Dept getDeptById(Integer id);
<resultMap type="com.bean.Dept" id="MyDept">
    <id column="did" property="id"/>
    <result column="dname" property="name"/>
    <!-- collection 定义关联集合类型的属性封装规则
        ofType 指定集合里面元素的类型 -->
    <collection property="myUsers" ofType="com.bean.MyUser">
        <!-- 定义集合中元素的封装规则 -->
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
    </collection>
</resultMap>
<select id="getDeptById" resultMap="MyDept">
    SELECT m.id,m.name,m.age,m.did,d.name AS dname FROM myuser m,dept d WHERE m.did = d.id AND d.id = #{id}
</select>

关闭懒加载,使用二次查询

public Dept getDeptByIdStep(Integer did);
<!-- Collection 分段查询 -->
<resultMap type="com.bean.Dept" id="MyDeptStep">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <collection property="myUsers" select="com.dao.MyUserMapper.selectMyUserByDid"
                column="{did=id}" fetchType="eager"/>
    <!-- column 要处理复合主键或传递多个值过去:可以将多列的值封装 Map 传递,指定多个列名通过 column="{prop1=col1,prop2=col2}"
        语法来传递给嵌套查询语句。这会引起 prop1 和 prop2 以参数对象形式来设置给目标嵌套查询语句
        fetchType="lazy":是否延迟加载,优先级高于全局配置,lazy:延迟,eager:立即 -->
</resultMap>
<select id="getDeptByIdStep" resultMap="MyDeptStep">
    select * from dept where id = #{id}
</select>
public List<MyUser> selectMyUserByDid(Integer dId);
<select id="selectMyUserByDid" resultType="myUser">
  select * from myuser where dId = #{did}
</select>

 

4.鉴别器 discriminator

<!--public MyUser selectMyUserById(Integer id);-->
<select id="selectMyUserById" resultMap="MyEmpDis" parameterType="integer">
  SELECT * FROM myuser WHERE id = #{id}
</select>
<resultMap id="MyEmpDis" type="com.bean.MyUser">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <!-- column:指定判定的列名 javaType:列值对应的java类型  -->
    <discriminator javaType="integer" column="age">
        <!-- 21岁 封装课程至 JavaBean -->
        <case value="21" resultType="com.bean.MyUser">
            <association property="dept" select="com.dao.DeptMapper.selectDeptById" column="did"/>
        </case>
        <!-- 33岁 不封装课程至 JavaBean 且把 age 赋值给 id -->
        <case value="33" resultType="com.bean.MyUser">
            <result column="age" property="id"/>
        </case>
    </discriminator>
</resultMap>
<!--public Dept selectDeptById(Integer id);-->
<select id="selectDeptById" resultType="dept" parameterType="string">
  select * from dept where id = #{id}
</select>

 

 

 

上面测试中使用的实体类与数据

public class Dept {
    private Integer id;
    private String name;
    private List<MyUser> myUsers;
public class MyUser {
    private Integer id;
    private String name;
    private Integer age;
    private Dept dept;


官方文档

转载于:https://www.cnblogs.com/jhxxb/p/10484484.html


http://www.niftyadmin.cn/n/529819.html

相关文章

flickr 相片url来源解析

相片來源 URL 知道相片的 ID、伺服器 ID、農場 ID 和密鑰&#xff08;如許多 API 方法返回的那樣&#xff09;後&#xff0c;你便可構建連結至相片的來源 URL。 URL 會採用以下格式&#xff1a;http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}.jpg or ht…

flickr 用户信息详析

flickr.people.getInfo Get information about a user.認證 此方法不需要認證。 引數 api_key &#xff08;必需的&#xff09; Your API application key. See here for more details. user_id &#xff08;必需的&#xff09; The NSID of the user to fetch information abo…

BZOJ1390 CEOI2008 Fences 凸包、Floyd最小环/DP

传送门 为了方便描述把固定点叫做白色点&#xff0c;Tree叫做黑色点 一种基于特殊性质的做法&#xff1a; 如果不算入选白色的权值&#xff0c;那么一定会选中所有白色点构成的凸包上的点&#xff0c;因为能够尽可能围更多的黑色点。然后我们在这个基础上删凸包上无用的白色点&…

respond.php,respond.php

//WEBSC商城资源define(IN_ECS, true);require dirname(__FILE__) . /includes/init.php;require ROOT_PATH . includes/lib_payment.php;require ROOT_PATH . includes/lib_order.php;$pay_code (!empty($_REQUEST[code]) ? trim($_REQUEST[code]) : );if (empty($pay_code)…

javascript检测flash版本

今天要做一个根据用户安装的是什么flash版本&#xff0c;为其播放哪断视频&#xff0c;所以搜了先用javaScrip检测出来版本后&#xff0c;再将其参数发给flash&#xff0c; <SCRIPT typetext/javascript><!--var i_flash;var v_flash;// Netscape if (navigator.plugi…

php 静态方法调用成员,PHP静态方法在成员变量中使用命名空间调用

是不是可以在PHP中做这样的事情&#xff1f;我想在一个成员变量中有一个名称空间,并且总是能够调用该类的每个静态方法,就像我在下面所做的那样.当然我的代码不起作用,但我只是想知道这是否可行,并且我接近解决方案,或者如果这完全不可能并且必须始终使用语法&#xff1a;\Stri…

注入(Injection)

注入(Injection)是: Java EE提供了注入机制&#xff0c;使您的对象能够获取对资源和其他依赖项的引用&#xff0c;而无需直接实例化它们。通过使用将字段标记为注入点的注释之一来装饰字段或方法&#xff0c;可以在类中声明所需的资源和其他依赖项。然后容器在运行时提供所需的…

javaScript 测试下载速度

<script>function init(){var timer1new Date().getTime();var imgnew Image();img.src"http://www.netfront.net/speedtest/images/photo" parseInt(Math.round(Math.random()*5)1) ".bmp?" Math.random();img.οnlοadfunction(){sizeimg.file…