mybtis关系映射及多表查询

2018-12-23  本文已影响0人  Zak1

实体关系问题

多表查询

package com.zakl.pojo;

import java.io.Serializable;
//返回的查询类
public class Userwithdetailpojo extends User2pojo implements Serializable {

    private  Userdetailpojo userdetailpojo;
  //省略get set toString
}

 <resultMap id="userwithdetail" type="com.zakl.pojo.Userwithdetailpojo">
        <id  property="userid" column="uid" />
        <result property="phone" column="phone"></result>
        <result property="password" column="password"></result>
        <result property="createDate" column="creatdate"></result>
        <result property="status" column="status"></result>
      <!--关联的信息 -->
        <!--持有Userdetialpojo的封装
      property是Userwithdetailpojo类的属性
      不像result简单属性
      需要用javaType来额外指明他的java数据类型
      官方推荐方式
      -->
      <!--列名有重复的时候,使用别名-->
        <association property="userdetailpojo" javaType="com.zakl.pojo.Userdetailpojo">
            <id property="udid" column="udid"></id>
            <result property="address" column="address"></result>
            <result property="cid" column="cid"></result>
            
            <!--也可以使用连缀点法 -->
            <!--
            <result property="Userdetailpojo.udid" column="udid"></result>
            <result property="Userdetailpojo.address" column="address"></result>
            <result property="Userdetailpojo.cid" column="cid"></result>
          -->
        </association>

    </resultMap>

    <select id="querybyid" resultMap="userwithdetail">
        select t1.userid as uid, t1.phone, t1.password ,t1.creatdate, t1.status, t2.udid , t2.address, t2.cid
        from user2 as t1 ,userdetail as t2
        <where>
            t1.userid=t2.userid and t1.userid =#{id};
        </where>

使用泛型方法进行测试

    public static<T> void  queryautocommit(String methodname,Object[] objs) throws InvocationTargetException, IllegalAccessException {
        SqlSession sqlSession = MybatisUtil.getSession();
        User2Mapper user2Mapper = sqlSession.getMapper(User2Mapper.class);
        Method[] methods=user2Mapper.getClass().getMethods();
        Method method=null;
        for (int i=0;i<methods.length;i++){
            if (methods[i].getName().equals(methodname)){
                method=methods[i];
                System.out.println(methods[i].getName());
            }
        }
        List<T> userwithdetailpojos= (List<T>) method.invoke(user2Mapper,objs);
        System.out.println(userwithdetailpojos);
        sqlSession.close();
    }

    @Test
    public void testdemo() throws InvocationTargetException, IllegalAccessException {
        Object[] objects=new Object[]{1};
        queryautocommit("querybyid",objects);
    }

使用分步查詢

  <resultMap id="basic" type="com.zakl.pojo.User2pojo">
        <id  property="userid" column="userid" />
        <result property="phone" column="phone"></result>
        <result property="password" column="password"></result>
        <result property="createDate" column="creatdate"></result>
        <result property="status" column="status"></result>
    </resultMap>
  
 <resultMap id="resultmap2" extends="basic" type="com.zakl.pojo.Userwithdetailpojo" >     <!-- select属性是用来选择接口中的方法 -->
        <association property="userdetailpojo" select="com.zakl.mapper.UserdetailMapper.querybyUseridbystep" column="userid"></association>
    </resultMap>

<select id="querybystepid" resultMap="resultmap2">
        select userid , phone,password ,creatdate, status
        from user2
        <where>
            userid =#{id};
        </where>
    </select>

UserdetailMapper查詢文件

    <select id="querybyUseridbystep" resultType="com.zakl.pojo.Userdetailpojo">
        select * from userdetail where userid=#{userid}
    </select>
public interface User2Mapper {
    List<Userwithdetailpojo> querybyid(@Param("id") Integer id);
    List<Userwithdetailpojo> querybystepid(@Param("id") Integer id);
}
public interface UserdetailMapper {
    List<Userwithdetailpojo> querybyUseridbystep(@Param("userid") Integer userid);
}


 @Test
    public void demo11() {
        SqlSession sqlSession = MybatisUtil.getSession();
        User2Mapper user2Mapper=sqlSession.getMapper(User2Mapper.class);
        List<Userwithdetailpojo> userwithdetailpojos = user2Mapper.querybystepid(1);
        System.out.println(userwithdetailpojos);
        sqlSession.commit();
        sqlSession.close();
    }

注意每次新增Mapper.xml時都應該在mybatis.cfg.xml中進行配置

    <mappers>
        <!-- resource : 相对路径查询资源的属性.
        相对于当前核心配置文件的位置开始查找映射文件.
        -->
        <mapper resource="com.zakl.pojo/userpojoMapper.xml"/>
        <mapper resource="com.zakl.pojo/AddressMapper.xml"/>
        <mapper resource="com.zakl.pojo/User2pojpMapper.xml"/>
        <mapper resource="com.zakl.pojo/UserdetailMapper.xml" />
    </mappers>

多表联合查询

​ 三表结构

​ [图片上传失败...(image-b43e37-1545553459517)]

​ 三个pojo类

public class UserwithBlog extends User2pojo implements Serializable {
    private List<Blog> blogs;
}

public class Blog {
    private Integer id;
    private User2pojo user2pojo;
    private String title;
    private String content;
    private List<Comment> comments;
}

public class Comment {
    private Integer id;
    private String comment;
    private Blog blog;
}

//接口方法
@interface
  UserwithBlog querblogbyid(@Param("userid")Integer userid);

mapper.xml配置

<!--多表联合查询 有1对多关系时使用 connection标签 使用oftype来声明类型 -->
  <resultMap id="userwithblog" extends="basic" type="com.zakl.pojo.UserwithBlog">
        <collection property="blogs" ofType="com.zakl.pojo.Blog">
            <id property="id" column="bid"></id>
            <result property="title" column="title"></result>
            <result property="content" column="content"></result>
          <!--  <result property="user2pojo.userid" column="aid"></result>-->
            <collection property="comments" ofType="com.zakl.pojo.Comment">
                <id property="id" column="cid"></id>
                <result property="comment" column="comment"></result>
               <!-- <result property="blog.id" column="blogid"></result>-->
            </collection>
        </collection>
    </resultMap>


    <select id="querblogbyid" resultMap="userwithblog">
           select t1.userid as aid ,t1.phone ,t1.password,t1.creatdate,t1.status,
                  t2.id as bid,t2.userid,t2.title,t2.content,
                  t3.id as cid, t3.comment,t3.blogid
            from user2 as t1 ,blog as t2,comment as t3
            <where>
                t1.userid=t2.userid and
                 t2.id=t3.blogid and
                  t1.userid=#{userid}
            </where>

    </select>
上一篇下一篇

猜你喜欢

热点阅读