1.多表设计 多表查询
a.多表设计
(1)一对一
在任意一方设计外键保存另一张表的主键,维系表和表的关系
(2)一对多
在多的一方设计外键保存一的一方的主键,维系表和表的关系
(3)多对多
设计一张第三方关系表,存储两张表的主键的对应关系,将一个多对多拆成两个一对多来存储
b.多表查询
笛卡尔积查询
内连接查询
外连接查询
左外连接查询
右外连接查询
全外连接查询
2.MyBatis中的一对一查询
create table room(id int primary key,name varchar(255)); insert into room values (1,'mhw'),(2,'兰花屋'),(3,'桃花屋'); create table grade(id int primary key,name varchar(255), rid int); insert into grade values (999,'向日葵班',2),(888,'玫瑰花班',3),(777,'菊花班',1);
在通过MyBatis实现一对一的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,
在一对一的bean中,如果包含了另一个表的对应对象,则可以在resultMap中通过association标签来声明映射方式:
配置方式:
<!-- 一对一查询 --> <resultMap type="cn.tedu.mybatis.beans.Grade" id="gradeRM"> <id column="gid" property="id"/> <result column="gname" property="name"/> <association property="room" javaType="cn.tedu.mybatis.beans.Room"> <id column="rid" property="id"/> <result column="rname" property="name"/> </association> </resultMap> <select id="queryO2O" resultMap="gradeRM"> select grade.id as gid,grade.name as gname ,room.id as rid,room.name as rname from room,grade where room.id = grade.rid; </select>
测试类:
// 根据配置文件创建sqlSessionFactory private SqlSessionFactory factory = null; @Before public void before() throws Exception{ //1.读取MyBatis核心配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); //2.根据配置文件创建sqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); } /** * 多表查询:一对一 */ @Test public void test13(){ //1.创建sqlSession SqlSession session = factory.openSession(); //2.执行操作 List<Grade> list = session.selectList( "cn.tedu.mybatis.beans.UserMapper.queryO2O"); //3.打印结果 System.out.println(list); }
3.MyBatis中的一对多查询
create table dept(id int primary key,name varchar(255));
insert into dept values (1,'财务部'),(2,'行政部'),(3,'人事部'),(4,'销售部');
create table emp(id int primary key,name varchar(255), deptid int);
insert into emp values (999,'孙悟空',4),(888,'萨达姆',3),(777,'哈利波特',1),(666,'特朗普',2);
在通过MyBatis实现一对多的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,在一对多的bean中,
如果包含了另一个表的对应对象的集合,则可以在resultMap中通过collection标签来声明映射方式:
<!-- 一对多查询 --> <resultMap type="cn.tedu.mybatis.beans.Dept" id="deptRM"> <id column="did" property="id"/> <result column="dname" property="name"/> <collection property="empList" ofType="cn.tedu.mybatis.beans.Emp"> <id column="eid" property="id"/> <result column="ename" property="name"/> </collection> </resultMap> <select id="queryO2M" resultMap="deptRM"> select dept.id as did, dept.name as dname, emp.id as eid, emp.name as ename from dept inner join emp on dept.id = emp.deptid; </select>
测试类:
/** * 多表查询:一对多 */ @Test public void test14(){ //1.创建sqlSession SqlSession session = factory.openSession(); //2.执行操作 List<Dept> list = session.selectList( "cn.tedu.mybatis.beans.UserMapper.queryO2M"); //3.打印结果 System.out.println(list); }
3.MyBatis中的多对多查询
create table stu(id int primary key,name varchar(255));
insert into stu values (1,'小新'),(2,'小白'),(3,'美伢'),(4,'风间');
create table teacher(id int primary key,name varchar(255));
insert into teacher values (999,'孙悟空'),(888,'猪八戒'),(777,'萨达姆'),(666,'哈利波特');
create table stu_teacher (sid int,tid int);
insert into stu_teacher values (1,999),(1,888),(2,999),(2,777),(3,666),(4,888),(4,666);
在通过MyBatis实现多对多的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,在多对多的bean中,
如果包含了另一个表的对应对象的集合,则可以在resultMap中通过collection标签来声明映射方式
<!-- 多对多查询 --> <resultMap type="cn.tedu.mybatis.beans.Teacher" id="teacherRM"> <id column="tid" property="id"/> <result column="tname" property="name"/> <collection property="stuList" ofType="cn.tedu.mybatis.beans.Stu"> <id column="sid" property="id"/> <result column="sname" property="name"/> </collection> </resultMap> <select id="queryM2M" resultMap="teacherRM"> select stu.id as sid, teacher.id as tid, stu.name as sname, teacher.name as tname from stu,teacher,stu_teacher where stu.id = stu_teacher.sid and teacher.id = stu_teacher.tid; </select>
测试类:
/** * 多表查询:多对多 */ @Test public void test15(){ //1.创建sqlSession SqlSession session = factory.openSession(); //2.执行操作 List<Teacher> list = session.selectList( "cn.tedu.mybatis.beans.UserMapper.queryM2M"); //3.打印结果 System.out.println(list); }