mybatis多表查询

Posted zdl2234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis多表查询相关的知识,希望对你有一定的参考价值。

Mybatis实现多表查询有三种方式:

(需求:给一个实体类设置属性值,但该实体类的数据保存在数据库的两张表中)

1,分别对两张表进行查询,将获取到的数据分别赋值给实体类。

2,编写多表查询的sql语句,通过给查询到的数据设置与实体类相同的别名,使用Auto Mapping特性,将查询结果自动映射到实体类。

3,使用MyBatis的<resultMap>标签,程序员编写映射关系。

(注意这些方法可以用于多表查询,当然单表查询也可以)

下面介绍使用<resultMap>标签的方法:

 

1,需要映射的实体类中不包含对象时;

技术图片

 

  1.1 使用<resultMap>标签时,<select>标签不写 resultType 属性,而是使用 resultMap 属性引用<resultMap>标签,resultMap属性写<resultMap>标签的id属性值,表示引用该<resultMap>的映射关系。

  1.2 <resultMap>标签中的每一个标签代表一个映射关系,<id>表示主键映射,<result>表示普通映射。

<?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">
<mapper namespace="com.bjsxt.mapper.StudentMapper">
    <resultMap type="student" id="mymap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="tid" property="tid"/>
    </resultMap>
    <select id="selById" resultMap="mymap" parameterType="int">
        select * from student where id = #0
    </select>
</mapper>

 

2,当映射的实体类中包含单个对象,使用<association>来映射一个对象

技术图片技术图片

  2.1当前sql查询不包含那个对象的属性,则需要调用别的查询方法来查询

  <association>标签属性:

  • (1) property: 对象在类中的属性名
  • (2)select:调用哪个查询查询出这个对象的信息
  • (3)将当前哪列的值作为参数传递给调用的查询语句
<?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">
<mapper namespace="com.bjsxt.mapper.StudentMapper">
    <resultMap type="student" id="mymap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="tid" property="tid"/>
        <association property="teacher" select="com.bjsxt.mapper.TeacherMapper.selById" column="tid"></association>
    </resultMap>
    <select id="selById" resultMap="mymap" parameterType="int">
        select * from student where id = #0
    </select>
</mapper>

  2.2如果当前查询结果包含该对象的属性,则不需要调用别的查询方法

    <association>标签属性:

  (1) 此时把<association/>看成小的<resultMap>看待

  (2)javaType 属性:<association/>专配完后返回一个什么类型的对象.取值是一个类(或类的别名)

<?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">
<mapper namespace="com.bjsxt.mapper.StudentMapper">
    <resultMap type="student" id="mymap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="tid" property="tid"/>
        <association property="teacher" javaType="Teacher" >
            <id column="tid" property="id"/>
            <result column="tname" property="name"/>
        </association>
    </resultMap>
    <select id="selById" resultMap="mymap" parameterType="int">
        select s.id sid,s.name sname,age age,t.id tid,t.name tname FROM student s left outer join teacher t on s.tid=t.id where s.id = #0
    </select>
</mapper>            

 

3,当要映射的实体类中包含一个集合对象,使用<collection>标签对集合进行映射。

技术图片

  3.1当前查询不包含集合数据,调用其他方法进行查询集合的数据

<resultMap type="teacher" id="mymap">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <collection property="list" select="com.bjsxt.mapper.StudentMapper.selByTid" column="id"></collection>
    </resultMap>
<select id="selAll" resultMap="mymap">
    select * from teacher
</select>

   3.2当前查询已经包含集合的数据,不需要调用其他方法查询

    属性:ofType与javaType相似,表示该标签配置完返回一个什么类型的对象。

<resultMap type="teacher" id="mymap1">
    <id column="tid" property="id"/>
    <result column="tname" property="name"/>
    <collection property="list" ofType="student" >
        <id column="sid" property="id"/>
        <result column="sname" property="name"/>
        <result column="age" property="age"/>
        <result column="tid" property="tid"/>
    </collection>
</resultMap>
<select id="selAll1" resultMap="mymap1">
    select t.id tid,t.name tname,s.id sid,s.name sname,age,tid from teacher t LEFT JOIN student s on t.id=s.tid;
</select>

注意:在上面的代码中查询结果包含多个Student,则肯定创建了多个student对象,那teacher会不会也被创建了多个呢?其实不会的,虽然查询的结果确实每一条数据都会包含teacher的数据,但是每条的teacher的id属性都是一样的,MyBatis相同的id值只会创建一个对象。

 

Auto Mapping 也可对对象进行映射

  1,将查到的属性名改为 `teacher.id`的形式,Mybatis就会去寻找teacher对象的id属性进行映射。

<select id="selAll" resultType="student">
    select t.id `teacher.id`,t.name `teacher.name`,s.id id,s.name name,age,tid
from student s LEFT JOIN teacher t on t.id=s.tid
</select>

 

以上是关于mybatis多表查询的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis从入门到精通系列 09——Mybatis多表查询之一对多查询

mybatis多表查询

MyBatis中实现多表查询

mybatis多表关联查询

Mybatis从入门到精通系列 10——Mybatis多表查询之多对多查询

mybatis多表关联查询