MyBatis的关联查询
Posted 婷好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()+"\\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的关联查询的主要内容,如果未能解决你的问题,请参考以下文章