码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis的关联查询

时间:2019-10-13 17:11:19      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:bms   商品   app   print   pre   NPU   图片   OLE   -name   

一、关联映射一对多

  1举例以国家和省份对应的一对多关系举例。

  2、案例:

    (1)实体类:创建Country类(国家类)

      技术图片

    (2)实体类2:创建Provincial类(省份类)

      技术图片

 

    (3)Dao层:创建CountryDao接口 

package com.user.dao;

import com.user.entity.Provincial;

import java.util.List;

public interface CountryDao {
    //检索全部   创建List泛型集合,泛型类型为省份对象
    List<Provincial> getAll();
}

    (4)Dao.xml:创建CountryDao.xml

<?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.user.dao.CountryDao">
    <resultMap id="proMap" type="Provincial">
        <id property="pid" column="pid"></id>
        <result property="pname" column="pname"></result>
        <!--出现的是单个关联对象 association-->
        <association property="country" javaType="Country">
            <id property="cid" column="cid"></id>
            <result property="cname" column="cname"></result>
        </association>
    </resultMap>

    <select id="getAll" resultMap="proMap">
        select * from provincial p inner join country c on p.cid=c.cid
    </select>
</mapper>

    (5)Test测试类:创建OneToManyTest

@Test
public void getAll(){
CountryDao mapper = Sqlsession.getMapper(CountryDao.class);
List<Provincial> all = mapper.getAll();
for (Provincial pro:all) {
System.out.println(pro.getPname());
}
}

二、关联映射多对一

  1、举例:多个员工对应一个职位。

  2、案例:

    (1)实体类:创建SmbmsUserEntity类(用户类)

      技术图片

 

     (2)实体类2:创建SmbmsRoleEntity类

      技术图片

     (3)Dao层:创建ISmbmsUserDao接口

package com.user.dao;

import com.user.entity.SmbmsUserEntity;

import java.util.List;

public interface ISmbmsUserDao {
    List<SmbmsUserEntity> getUserList();
}

 

    (4)Dao.xml:创建ISmbmsUserDao.xml

<?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.user.dao.ISmbmsUserDao">
    <resultMap id="userListAndRole" type="SmbmsUserEntity">
        <id column="id" property="id"></id>
        <result property="userName" column="userName"></result>
        <!--映射少的一方 property代表实体当中多的一方的属性名   javaType代表集合当中泛型类型-->
        <!--select 代表执行查询的ID   column 代表所引用的条件列-->
        <association property="smbmsrole" javaType="SmbmsRoleEntity" select="getRole" column="userRole">

        </association>
    </resultMap>

    <select id="getUserList" resultMap="userListAndRole">
        select * from smbms_user
    </select>
    <select id="getRole" resultType="SmbmsRoleEntity">
        select * from smbms_role where rid=#{userRole}
    </select>
</mapper>

    (5)Test测试类:创建ManytoOneTest类

import com.user.dao.ISmbmsUserDao;
import com.user.entity.SmbmsUserEntity;
import com.user.util.mysyutil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class ManytoOneTest {
    @Test
    public void getUserListTest(){
        SqlSession sqlSession = mysyutil.getSqlSession();
        ISmbmsUserDao mapper = sqlSession.getMapper(ISmbmsUserDao.class);
        List<SmbmsUserEntity> userList = mapper.getUserList();

        for (SmbmsUserEntity user: userList) {
            System.out.println("用户角色:"+user.getUserName()+"\t对应角色:"+user.getSmbmsrole().getRoleName());
        }
    }
}

三、关联映射多对多

   1、举例:多个教员教授多名学生     学名学生被多名教员教授

    2、案例:

    (1)实体类:创建Studeng类(学生类)

      技术图片

 

     (2)实体类2:创建Teacher类(教师类)

      技术图片

 

     (3)Dao层:创建IStudentDao接口

package com.user.dao;

import com.user.entity.Student;

import java.util.List;

public interface IStudentDao {
    //查询所有学生信息   以及授课教员
    public List<Student> getStudentInfo();
}

    (4)Dao.xml:创建IStudentDao.xml

<?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.user.dao.IStudentDao">
    <resultMap id="studentAndTeacherMapper" type="Student">
        <id column="stuid" property="stuid"></id>
        <result column="studentName" property="studentName"></result>
        <collection property="teachers" ofType="Teacher">
            <id property="tid" column="tid"></id>
            <result property="tname" column="tname"></result>
        </collection>
    </resultMap>


    <select id="getStudentInfo" resultMap="studentAndTeacherMapper">
        select * from studentinfo,teacher,stut where studentinfo.stuid=stut.stuid and teacher.tid=stut.tid
    </select>
</mapper>

    (5)Test测试类:创建ManytoOneTest类

import com.user.dao.IStudentDao;
import com.user.dao.IUserDao;
import com.user.entity.Student;
import com.user.entity.Teacher;
import com.user.util.mysyutil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class ManeyTooManey {
   @Test
    public void getStudentInfoTest(){
       SqlSession sqlSession = mysyutil.getSqlSession();
       IStudentDao mapper = sqlSession.getMapper(IStudentDao.class);


       List<Student> studentInfo = mapper.getStudentInfo();
       for (Student stu:studentInfo) {
           System.out.println("学生:"+stu.getStudentName());
           for (Teacher teacher:stu.getTeachers()) {
               System.out.println("\t教员:"+teacher.getTname());
           }
       }
   }
}

三、关联映射多对多     

  1、举例:三级菜单的查询

  2、案例:

    (1)实体类:创建Cation类(商品分级类)

      技术图片

 

     (2)Dao层:创建CationDao接口

package com.user.dao;

import com.user.entity.Cation;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface CationDao {
    //查询一级分类(包括其下的子分类)
    List<Cation> getAllCategory(int parentId);
}

    (3)Dao.xml:创建CationDao.xml

<?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.user.dao.CationDao">
    <resultMap id="cationMap" type="Cation">
        <id column="cationId" property="cationId"></id>
        <result property="cation" column="cation"></result>
        <result column="typeId" property="typeId"></result>

        <collection property="list" ofType="Cation" select="getAllCategorySQL" column="cationId"/>
    </resultMap>

    <select id="getAllCategory" resultMap="cationMap">
        select * from cation where cationId=#{cationId}
    </select>
    <select id="getAllCategorySQL" resultMap="cationMap">
        select * from cation where parentId=#{cationId}
    </select>
</mapper>

    (4)Test测试类:创建CationTest类

import com.user.dao.CationDao;
import com.user.dao.CountryDao;
import com.user.entity.Cation;
import com.user.entity.Provincial;
import com.user.util.mysyutil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class CationTest {
    @Test
    public void getAllCategory(){
        SqlSession sqlSession = mysyutil.getSqlSession();
        CationDao mapper = sqlSession.getMapper(CationDao.class);


        List<Cation> allCategory = mapper.getAllCategory(21);
        for (Cation cation:allCategory) {
            System.out.println(cation.toString());
        }
    }
}

 

 

MyBatis的关联查询

标签:bms   商品   app   print   pre   NPU   图片   OLE   -name   

原文地址:https://www.cnblogs.com/tinghao/p/11662948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!