<MyBatis>入门五 查询的返回值处理

select :

  返回对象:

     <select  id = " "  resultType= "对象的全类名"  />

  List:

    <select  id = " "  resultType = "list泛型中的值" />

  Map:

    1.返回一条记录 Map<String,Object>

                 key -> 字段

              value -> 值

                                     <select id = " "  resultType="map" />

    2.返回多条记录 Map<Integer,Employee>

             key -> @MapKey("column")标注在接口方法上,表名哪个字段作为Key

               value -> 对象

             <select id = " " resultTyppe="对象的全类名" />

  ResultMap:

    一对一:

    1.级联属性 

     <resultMap id="myEmpAndDept" type="org.maple.pojo.Employee">
          <id column="id" property="id"/>
          <result column="last_name" property="name"/>
          <result column="email" property="email"/>
          <result column="gender" property="gender"/>
          <result column="did" property="dept.id"/>
          <result column="deptName" property="dept.deptName"/>
      </resultMap>

     <select id="getEmpAndDeptById" resultMap="myEmpAndDept">

     2.association

      <resultMap id="myEmpAndDept2" type="org.maple.pojo.Employee">
          <id column="id" property="id"/>
          <result column="last_name" property="name"/>
          <result column="email" property="email"/>
          <result column="gender" property="gender"/>
            <association property="dept" javaType="org.maple.pojo.Department">
              <id column="did" property="id"/>
              <result column="deptName" property="deptName"/>
            </association>
       </resultMap>

     3.association 分布查询  

     <association property="dept" select="org.maple.mapper.DepartmentMapper.getDeptById" column="d_id"/>

    一对多

      collection查询

        <!-- 要通过id查询部门信息和所有员工 -->
        <resultMap id="myDept" type="org.maple.pojo.Department">
            <id column="id" property="id"/>
            <result column="dept_name" property="deptName"/>
            <!--定义集合时,使用collection属性-->
            <collection property="emps" ofType="org.maple.pojo.Employee">
                <id column="eId" property="id"/>
                <result column="last_name" property="name"/>
                <result column="gender" property="gender"/>
                <result column="email" property="email"/>
            </collection>
        </resultMap>

      collection分部查询
        <resultMap id="myDeptStep" type="org.maple.pojo.Department">
            <id column="id" property="id"/>
            <result column="dept_name" property="deptName"/>
            <collection property="emps" select="org.maple.mapper.EmployeeMapper.findEmpsById" column="id"></collection>
        </resultMap>

update,delete,insert:返回Integer,Long,Boolean,void

1.返回List

   返回集合类型,resultType中写集合中元素的类型

    /**
     * 返回List集合
     */
    List<Employee> getEmpsByNameLike(String name);
    <!--如果返回的是集合,resultType需要写集合中元素的类型-->
    <select id="getEmpsByNameLike" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE last_name like concat(‘%‘,#{name},‘%‘);
    </select>
Employee{id=1, name=‘tom‘, gender=0, email=‘[email protected]‘}
Employee{id=8, name=‘rose‘, gender=1, email=‘[email protected]‘}
Employee{id=9, name=‘zhaozhihao‘, gender=1, email=‘[email protected]‘}
Employee{id=12, name=‘nihao‘, gender=1, email=‘[email protected]‘}

2.返回Map

1.返回的一条记录的map

  key:字段名

  value:表中的名字

    /**
     * 返回一条记录map,key就是列名,值就是表中的值
     */
    Map<String,Object> getEmpByIdReturnMap(Integer id);
    <!--如果返回的是map,resultType需要写map,mybatis为常用类起了别名-->
    <select id="getEmpByIdReturnMap" resultType="map">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE id = #{id}
    </select>
{gender=0, name=tom, id=1, [email protected]}

2.返回多条记录的map

  Map<column,Employee>

  key:哪个字段作为key,使用@MapKey("column")

  value:封装对象

    /**
     * 多条记录封装Map,Map<Integer,Employee>
     * @MapKey 告诉mybaits使用哪个属性封装成map的key
     */
    @MapKey("id")
    Map<Integer,Employee> getEmpByNameLikeReturnMap(String name);
    <!--如果返回的是map,封装成emp,resultType需要写Employee-->
    <select id="getEmpByNameLikeReturnMap" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE last_name like concat(‘%‘,#{name},‘%‘);
    </select>
{1=Employee{id=1, name=‘tom‘, gender=0, email=‘[email protected]‘},
8=Employee{id=8, name=‘rose‘, gender=1, email=‘[email protected]‘}, 9=Employee{id=9, name=‘zhaozhihao‘, gender=1, email=‘[email protected]‘},
12=Employee{id=12, name=‘nihao‘, gender=1, email=‘[email protected]‘}}

3.ResultMap

1.简单的使用

    /**
     * 根据id查询员工
     */
    Employee getEmpById(Integer id);
<mapper namespace="org.maple.mapper.EmployeeMapperPlus">

    <!--resultMap 自定义封装规则-->
    <!--
        id:唯一id,方便引用
        type:自定义规则的java类型
    -->
    <resultMap id="MyEmp" type="org.maple.pojo.Employee">
        <!--
            id 主键的封装规则,底层会有优化
            column 数据库中字段
            property javaBean中的字段
        -->
        <id column="id" property="id"/>
        <result column="last_name" property="name"/>
        <!--其他不指定的列,如果名字一样,会自动封装。但是写resultMap建议都写上-->
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
    </resultMap>

    <!--简单的使用resultMap-->
    <select id="getEmpById" resultMap="MyEmp">
        SELECT id,last_name,email,gender
        FROM tbl_employee
        WHERE id = #{id}
    </select>

</mapper>

2.多表使用(一对一)

public class Employee {

    private Integer id;

    private String name;

    private Character gender;

    private String email;

    private Department dept;
}
public class Department {

    private Integer id;
    private String deptName;
}

  2.1 第一种规则

  级联属性的方式

    /**
     * 根据id查出员工和部门信息
     */
    Employee getEmpAndDeptById(Integer id);
  <!--1.级联属性的方式-->
   <resultMap id="myEmpAndDept" type="org.maple.pojo.Employee">
        <id column="id" property="id"/>
        <result column="last_name" property="name"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <result column="did" property="dept.id"/>
        <result column="deptName" property="dept.deptName"/>
    </resultMap>

    <select id="getEmpAndDeptById" resultMap="myEmpAndDept">
        SELECT e.id,e.last_name,e.email,e.gender,d.id did,d.dept_name deptName
        FROM tbl_employee e
                 INNER JOIN tbl_dept d
                            ON e.d_id = d.id
        WHERE e.id = #{id}
    </select>

  2.2 第二种规则(association定义对象

    association: property 是 Employee对象中的属性,javaType是指该属性属于哪个javaBean

    <!--2.使用association-->
    <resultMap id="myEmpAndDept2" type="org.maple.pojo.Employee">
        <id column="id" property="id"/>
        <result column="last_name" property="name"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <association property="dept" javaType="org.maple.pojo.Department">
            <id column="did" property="id"/>
            <result column="deptName" property="deptName"/>
        </association>
    </resultMap>

  2.3 第三种规则(分部查询,association

    假设之前部门的mapper中已经定义了通过部门id查找部门信息,那么我们就可以通过分部查询来查询出员工信息和部门信息

    /**
     * 根据id查出员工和部门信息,分部查询
     */
    Employee getEmpAndDeptByIdStep(Integer id);
    <!--使用association进行分布查询-->
    <resultMap id="myEmpAndDeptStep" type="org.maple.pojo.Employee">
        <id column="id" property="id" />
        <result column="last_name" property="name"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <!--property:Employee中的属性
            select:调用DepartmentMapper中的查询方法 命名空间+方法
            column:传给select 方法哪个参数
        -->
        <association property="dept" select="org.maple.mapper.DepartmentMapper.getDeptById" column="d_id"/>
    </resultMap>

    <select id="getEmpAndDeptByIdStep" resultMap="myEmpAndDeptStep">
        select id,last_name,gender,email,d_id from tbl_employee where id = #{id}
    </select>

  分部查询的好处,可以实现懒加载:当只需要调用员工的信息时,第二条sql语句就不会发出,知道需要调用部门的信息,才会发sql语句

  通过在全局配置文件中添加:

     <settings>
             <setting name="lazyLoadingEnabled" value="true"/>
            <setting name="aggressiveLazyLoading" value="false"/>
     </settings>

3.多表的使用(一对多)

public class Department {

    private Integer id;
    private String deptName;
    private List<Employee> emps;
}

1. 嵌套结果集的方式

    /**
     * 根据id查询部门信息和所有员工
     */
    Department getDeptAndEmpsById(Integer id);
    <!-- 要通过id查询部门信息和所有员工 -->
    <resultMap id="myDept" type="org.maple.pojo.Department">
        <id column="id" property="id"/>
        <result column="dept_name" property="deptName"/>
        <!--定义集合时,使用collection属性-->
        <collection property="emps" ofType="org.maple.pojo.Employee">
            <id column="eId" property="id"/>
            <result column="last_name" property="name"/>
            <result column="gender" property="gender"/>
            <result column="email" property="email"/>
        </collection>
    </resultMap>

    <select id="getDeptAndEmpsById" resultMap="myDept">
        SELECT d.id,d.dept_name,e.id eId,e.last_name,e.gender,e.email
        FROM tbl_dept d
                 LEFT JOIN tbl_employee e
                           ON d.id = e.d_id
        WHERE d.id = #{id}
    </select>

2.分部查询的方式

    /**
     * 根据id 分部查询出部门信息和所有员工
     */
    Department getDeptAndEmpsByIdStep(Integer id);
    <!--分部查询-->
    <resultMap id="myDeptStep" type="org.maple.pojo.Department">
        <id column="id" property="id"/>
        <result column="dept_name" property="deptName"/>
        <collection property="emps" select="org.maple.mapper.EmployeeMapper.findEmpsById" column="id"></collection>
    </resultMap>

    <select id="getDeptAndEmpsByIdStep" resultMap="myDeptStep">
        SELECT id,dept_name
        FROM tbl_dept
        WHERE id = #{id}
    </select>

    

原文地址:https://www.cnblogs.com/mapleins/p/10115233.html

时间: 2024-11-08 08:42:31

<MyBatis>入门五 查询的返回值处理的相关文章

mybatis新增主键的返回值

在主键自增的数据库中返回新增数据的主键方式:根据mybatis文档 useGeneratedKeys (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false. keyProperty (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGener

获取动态SQL查询语句返回值(sp_executesql)

在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值查询Cost值(表名不确定但表结构确定,如下面的Product表) 如果不考虑获取返回值,我们这样写即可: declare @tableName varchar(50) declare @id varchar(10) declare @cost numeric(18,2) declare @sql

MyBatis insert/delete/update 的返回值

insert,返回值是:新插入行的主键(primary key):需要包含<selectKey>语句,才会返回主键,否则返回值为null. update/delete,返回值是:更新或删除的行数:无需指明resultClass:但如果有约束异常而删除失败,只能去捕捉异常. 参考资料: 1.Mybatis/Ibatis,数据库操作的返回值 https://blog.csdn.net/gaojinshan/article/details/24308313 原文地址:https://blog.csd

list&lt;String,object&gt;的元素判空(用于判断查询数据库返回值)

一般人可能会使用list.size或者list==null来做判断.当没有返回值时返回的类型为"[ ]"它并不是空也没有元素,所以使用==null以及if(list.size()>0){//业务逻辑}是不成功的. 所以这需要去判断元素的存在与否,应使用list.isEntity()函数来做判断.if(!list.isEntity()){//返回值不为0的业务逻辑}. 原文地址:https://www.cnblogs.com/daqq/p/9506098.html

MyBatis 入门(五)--typeHandlers

一.作用及默认的处理 类型处理器的作用就是 查询时把数据库存储的值转换成java类型 修改是把java类型转换成数据库类型存储,处理 下面这个表格描述了默认的类型处理器. 类型处理器 Java 类型 JDBC 类型 BooleanTypeHandler java.lang.Boolean, boolean 任何兼容的布尔值 ByteTypeHandler java.lang.Byte, byte 任何兼容的数字或字节类型 ShortTypeHandler java.lang.Short, sho

spring+mybatis下delete和insert返回值-2147482646

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> <!-- 配置批量操作 --> <!-- <constructor-arg index="1" va

MyBatis(五)select返回list数据

(1)接口中编写方法 public List<Emp> getEmps(String lastName); (2)编写Mapper文件 <select id="getEmps" resultType="com.eu.bean.Emp"> select id,last_name lastName,gender geder,email from Emp where last_name like #{lastName } </select&g

mybatis 中的 update 返回值

摘自:https://www.jianshu.com/p/80270b93082a 如果定义一个如下的update函数,那么这个函数的返回值到底是啥意思呢?是受影响的行数吗? 验证之前我们先看看数据库中的数据记录.总共两条数据记录! 数据库链接配置为: jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=123456 下面看看我们的单

MyBatis从入门到精通(一):MyBatis入门

最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. MyBatis简介 ? 2001年,Clinton Begin发起了一个名为iBATIS的开源项目,最初侧重于密码软件的研发,后来发展成为一款基于Java的持久层框架. ? 2004年,Clinton将iBATIS的名字和源码捐赠给了Apache软件基金会. ? 2010年,核心开发团队决定离开Apache软件基金会,并且将iBATIS改名