Java

MyBatis实现多表查询

2019-08-07  本文已影响0人  kanaSki

1.多表查询方式:
业务装配(对两个表编写单表查询语句,在业务(service层)将查询的两个结果进行关联)
使用AutoMapping特性,在实现两表联合查询时通过别名完成映射
使用MyBatis的resultMap标签进行实现
2.多表查询时,类中包含另一个类的对象的分类:
单个对象
集合对象

<resultMap>标签写在mapper.xml中,有程序员控制sql查询结果与实体类的映射关系。默认MyBatis使用AutoMapping特性。
使用resultMap标签时,select标签内不写resultType属性,而使用resultMap属性引用resultMap标签

一、resultMap实现单表映射:

    <select id="selAll" resultMap="myMap">
        select * from emp
    </select>
    
    <resultMap id="myMap" type="emp">
        <!--主键使用id标签配置映射关系,其余使用result标签配置映射关系-->
        <id property="empno" column="empno"></id>
        <result property="ename" column="ename"></result>
    </resultMap>

column属性指的是数据库中的字段,property指的是实体类中的字段

类中包含一个类对象的结构

二、使用resultMap关联单个对象(N+1方式——先查询出某表的全部信息,再根据这个表的信息查询另一个表的信息)

    <select id="selStu" resultMap="stuMap">
        select * from student
    </select>

    <resultMap id="stuMap" type="student">
        <!--主键使用id标签配置映射关系,其余使用result标签配置映射关系-->
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="age" column="age"></result>
        <result property="tid" column="tid"></result>
        <!--如果关联一个对象,使用association,关联集合,则是使用collection-->
        <association property="teacher" select="com.mapper.StuMapper.selById" column="tid"></association>
    </resultMap>
    
    <select id="selById" resultMap="teacher" parameterType="int">
        select * from teacher where id=#{0}
    </select>

association标签在装配一个对象时使用,其中column属性指将哪个当前表哪个列的值作为参数传入sql语句中,property属性指对象在类中的属性名,select属性指通过哪个查询语句查询出该对象信息

在N+1方式时,如果列名与属性名相同,可以不进行配置,使用AutoMapping特性即可,但是MayBatis只能够给列装配一次,即作为查询条件的列必须写,不能省略

三、使用resultMap关联单个对象(联合查询方式)

    <resultMap type="Student" id="stuMap1">
        <id column="sid" property="id"/>
        <result column="sname" 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="selAll1" resultMap="stuMap1">
         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
    </select>

四、使用resultMap关联集合对象(N+1方式)


类中包含一个集合对象的结构
    <select id="selByTid" parameterType="int" resultType="student">
         select * from student where tid=#{0}
    </select>
    <resultMap type="teacher" id="mymap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="list" select="com.mapper.StudentMapper.selByTid" column="id"></collection>
    </resultMap>
    <select id="selAll" resultMap="mymap">
         select * from teacher
    </select>

五、使用resultMap关联集合对象(联合查询方式)

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

六、使用AutoMapping关联单个对象

    <select id="selAll" resultMap="teacher">
        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.id
    </select>
上一篇下一篇

猜你喜欢

热点阅读