
员工表pojo
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Emp implements Serializable {
private Integer id;
private String name;
private Integer age;
// private Integer deptId;
private Dept dept;//一个员工对应一个部门,所以使用对象封装
}
部门表pojo
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Dept implements Serializable {
private Integer deptId;
private String deptName;
private List emps;//一个部门有多个员工,所以使用list封装
}
查询员工表emp所对应的部门表dept。两种方式:
1.1单条sql语句查询1.2子查询select emp.id,emp.name,emp.age,emp.dept_id,dept.dept_name from emp join dept on emp.dept_id=dept.dept_id
子查询的说明:
1.column=“子查询的字段信息”
2.select= “sql的ID” 作用:根据column中的数据 实现子查询!!!
关于一对多 数据封装说明:
collection: 封装集合的固定写法.
property: 指定属性
ofType: 封装List集合的泛型对象
SELECT dept.dept_id,dept.dept_name,emp.id,emp.name,emp.age FROM dept LEFT JOIN emp ON dept.dept_id=emp.dept_id
也可以设置驼峰映射配置:
设置之后的代码:(必须设置autoMapping属性为"true",最好保留主键映射)
3.缓存机制 3.1一级缓存SELECT dept.dept_id,dept.dept_name,emp.id,emp.name,emp.age FROM dept LEFT JOIN emp ON dept.dept_id=emp.dept_id
概念说明: Mybatis默认开启一级缓存, 一级缓存可以在同一个SqlSession对象中查询相同的数据,可以实现数据的共享(缓存操作).
3.2二级缓存说明: 二级缓存mybatis中默认也是开启的.但是需要手动标识. 二级缓存可以在同一个SqlSessionFactory内部有效。
一级缓存关闭后才会交给二级缓存(sqlSession.close())
@Test//一级缓存测试对比1
public void testSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
deptMapper.findMore();
deptMapper.findMore();
deptMapper.findMore();//相同的SqlSession,只执行查询一次
sqlSession.close();
}
@Test//一级缓存测试对比2
public void testSqlSession2(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
deptMapper.findMore();
SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
DeptMapper deptMapper2 = sqlSession2.getMapper(DeptMapper.class);
deptMapper2.findMore();
//不同的SqlSession,执行查询了两次
sqlSession.close();
sqlSession2.close();
}
@Test//二级缓存测试
public void testSqlSession3(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
deptMapper.findMore();
sqlSession.close();//关闭后交给二级缓存
SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
DeptMapper deptMapper2 = sqlSession2.getMapper(DeptMapper.class);
deptMapper2.findMore();
sqlSession2.close();
}