• MyBatis的关联查询


    一、关联映射一对多

      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()+"	对应角色:"+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("	教员:"+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());
            }
        }
    }

      

     

  • 相关阅读:
    ubuntu16.04安装opencv3.4.0
    基于flask+gunicorn+nginx来部署web App
    ubuntu更换pip install,apt-get,conda install 成国内源
    Ubuntu16.04安装编译caffe以及一些问题记录
    Tutorial for MI5 ! flash MI5 to Native Anriod 9
    在服务器上实现SSH(Single Stage Headless)
    .NET Core容器化开发系列(一)——Docker里面跑个.NET Core
    .NET Core容器化开发系列(零)——计划
    基于.NET Standard的分布式自增ID算法--美团点评LeafSegment
    基于.NET Standard的分布式自增ID算法--Snowflake代码实现
  • 原文地址:https://www.cnblogs.com/tinghao/p/11662948.html
Copyright © 2020-2023  润新知