MyBatis 的级联分为3 种:
鉴别器(discriminator):它是一个根据某些条件决定采用具体实现类的级联,比如根据角色是否可用来决定是否展示权限。
一对一(association):比如公民和身份证,学生和学号都是一种一对一的级联关系。一对多(collection):比如用户和订单,部门和员工都是一对多的级联关系。
对于多对多级联关系,在 MyBatis 中是没有专门的元素来表示的。这也比较好理解,因为多对多关系,比如用户和角色关系,在实际工作中都是拆分成两个一对多来关联。
1.在数据库中创建部门表dept和员工表emp
#部门表
drop table if exists dept;
create table dept(did int primary key,dname varchar(20),dinfo varchar(50)
);insert into dept values(101,'市场部','负责公司市场的开拓');
insert into dept values(102,'产品部','负责公司产品的营销');
insert into dept values(103,'研发部','负责公司产品的研发');
insert into dept values(104,'测试部','负责公司产品的测试');select * from dept;#员工表
drop table if exists emp;
create table emp(eid int primary key auto_increment,ename varchar(20),job varchar(20),sal double,phone varchar(11),address varchar(50),did int
);insert into emp(ename,job,sal,phone,address,did) values('赵德保','市场专员',4600,'15785642139','信阳',101);
insert into emp(ename,job,sal,phone,address,did) values('刘瑞琳','市场经理',7600,'17956248563','商丘',101);
insert into emp(ename,job,sal,phone,address,did) values('张翠萍','产品设计师',5800,'15821563548','郑州',102);
insert into emp(ename,job,sal,phone,address,did) values('刘长河','产品经理',9800,'15821563548','洛阳',102);
insert into emp(ename,job,sal,phone,address,did) values('李耀菲','开发工程师',8800,'13658942168','许昌',103);
insert into emp(ename,job,sal,phone,address,did) values('王长林','项目经理',15800,'13954865721','南阳',103);
insert into emp(ename,job,sal,phone,address,did) values('陈清泰','测试工程师',5300,'13785463249','周口',104);
insert into emp(ename,job,sal,phone,address,did) values('杨国华','测试经理',9800,'13785463249','驻马店',104);select * from emp;
select * from emp inner join dept on emp.did=dept.did;
2.在idea中创建项目并导入jar包,配置核心配置文件;
一对一
外部文件
日志打印
核心配置
部门表dept的接口与映射
public interface DeptDao {Dept selectByDid(int did);
}
员工表emp的接口与映射
public interface EmpDao {Emp selectByEid(int eid);
}
association标签配置一对一级联
property:对应实体类中的属性名名,必填项。
javaType:属性对应的Java类型
resultMap:可以直接使用现有的 resultMap,而不需要在这里配置。
方式一
方式二
测试类
public class EmpTest {InputStream stream = null;SqlSessionFactoryBuilder builder = null;SqlSessionFactory factory = null;SqlSession sqlSession = null;EmpDao empDao = null;@Beforepublic void init() throws IOException {stream = Resources.getResourceAsStream("mybatis.xml");builder = new SqlSessionFactoryBuilder();factory = builder.build(stream);sqlSession = factory.openSession();empDao = sqlSession.getMapper(EmpDao.class);}@Testpublic void testSelectByEid(){Emp emp = empDao.selectByEid(1);System.out.println(emp);}@Afterpublic void destroy() throws IOException {sqlSession.commit();sqlSession.close();stream.close();}
}
控制台日志信息
一对多
员工表emp的接口与映射
public interface EmpDao {Emp selectByEid(int eid);List selectByDid(int did);
}
部门表dept的接口与映射
public interface DeptDao {List selectAll();Dept selectByDid(int did);
}
collection标签配置一对多级联
方式一
方式二
测试类
public class DeptTest {InputStream stream = null;SqlSessionFactoryBuilder builder = null;SqlSessionFactory factory = null;SqlSession sqlSession = null;DeptDao deptDao = null;@Beforepublic void init() throws IOException {stream = Resources.getResourceAsStream("mybatis.xml");builder = new SqlSessionFactoryBuilder();factory = builder.build(stream);sqlSession = factory.openSession();deptDao = sqlSession.getMapper(DeptDao.class);}@Testpublic void testSelectByDid(){Dept dept = deptDao.selectByDid(101);System.out.println(dept);}@Testpublic void testSelectAll(){List deptList = deptDao.selectAll();for (Dept dept : deptList) {System.out.println(dept);}}@Afterpublic void destroy() throws IOException {sqlSession.commit();sqlSession.close();stream.close();}
}
控制台日志信息
下一篇:MySQL事务处理