myBatis关系查询与缓存
来源:互联网 发布:人物动作设计软件 编辑:程序博客网 时间:2024/05/18 00:12
myBatis关系查询与缓存
JAVA中再好的封装,在反射眼里都是裸奔,框架即是最好的体现之一。
1、表的关系
A:一对一
B:一对多
C:多对一
D:多对多
2、myBatis中通过resultMap来维护关系
(一)代码:JavaBean,xml:<association>
(多)代码:List<T>,xml:<collection>
3、关系查询示例
这里就直接给例子,如果具体配置细节等不明白参考我前面的文章(《myBatis入门》,《myBatis接口编程》)
A:工程整体构架
B:数据库表
(1)部门表
(2)员工表
C:DeptMapper.xml的内容(要是多表关联查询不太清楚,可以参考我的文章《mySql》)
<?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">
<mapper namespace="cn.gson.mybatis2.Dao">
<!-- 部门对应员工返回结果集 -->
<resultMap type="cn.gson.mybatis2.Deptment" id="dept">
<id column="dept_id" property="dept_id"/>
<result column="dept_name" property="dept_name"/>
<!-- 一对多 -->
<collection property="employee" ofType="cn.gson.mybatis2.Employee">
<result column="empl_name" property="empl_name" />
</collection>
</resultMap>
<!-- 员工对应部门 返回结果集-->
<resultMap type="cn.gson.mybatis2.Employee" id="empl">
<id property="empl_id" column="empl_id"/>
<result property="empl_name" column="empl_name"/>
<!-- 多对一 -->
<association property="deptment" javaType="cn.gson.mybatis2.Deptment">
<result column="dept_name" property="dept_name"/>
</association>
</resultMap>
<!-- 根据员工查询对应部门 -->
<select id="selectEmpl" resultMap="empl">
select e.*, d.* from empl e left join dept d on e.id = d.dept_id
</select>
<!-- 根据部门查询对应员工 -->
<select id="selectDept" resultMap="dept">
select d.*,e.* from dept d left join empl e on d.dept_id = e.id;
</select>
</mapper>
C:DAO接口内容
public interface Dao {
List<Deptment> selectDept();
List<Employee> selectEmpl();
}
D:Deptment部门实体类
public class Deptment {
private int dept_id;
private String dept_name;
//一个部门里放一个员工集合,体现出一对多的关系
private List<Employee> employee;
public int getDept_id() {
return dept_id;
}
public void setDept_id(int dept_id) {
this.dept_id = dept_id;
}
public String getDept_name() {
return dept_name;
}
public void setDept_name(String dept_name) {
this.dept_name = dept_name;
}
public List<Employee> getEmployee() {
return employee;
}
public void setEmployee(List<Employee> employee) {
this.employee = employee;
}
public Deptment(int dept_id, String dept_name, List<Employee> employee) {
super();
this.dept_id = dept_id;
this.dept_name = dept_name;
this.employee = employee;
}
public Deptment() {
super();
}
@Override
public String toString() {
return "Deptment [dept_id=" + dept_id + ", dept_name=" + dept_name + "]";
}
}
F:Employee员工实体类
public class Employee {
private int empl_id;
private String empl_name;
//一个员工只属于一个部门
private Deptment deptment;
public int getEmpl_id() {
return empl_id;
}
public void setEmpl_id(int empl_id) {
this.empl_id = empl_id;
}
public String getEmpl_name() {
return empl_name;
}
public void setEmpl_name(String empl_name) {
this.empl_name = empl_name;
}
public Deptment getDeptment() {
return deptment;
}
public void setDeptment(Deptment deptment) {
this.deptment = deptment;
}
public Employee() {
super();
}
public Employee(int empl_id, String empl_name, Deptment deptment) {
super();
this.empl_id = empl_id;
this.empl_name = empl_name;
this.deptment = deptment;
}
@Override
public String toString() {
return "Employee [empl_id=" + empl_id + ", empl_name=" + empl_name + "]";
}
}
G:测试类
public class TestDao {
public static void main(String[] args) {
InputStream is;
try {
is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
Dao td = session.getMapper(Dao.class);
//一个部门对应多个员工
List<Deptment> depts = td.selectDept();
for (Deptment deptment : depts) {
System.out.println(deptment.getDept_name()+"有: "+deptment.getEmployee().size()+"人");
}
//多个员工对应一个部门
List<Employee> empls = td.selectEmpl();
for (Employee employee : empls) {
System.out.println(employee.getEmpl_name()+"在: "+employee.getDeptment().getDept_name());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
H:测试结果
4、缓存
A:MyBatis包含一个强大的、可配置、可定制的查询缓存机制。MyBatis 3的缓存实现有了许多改进,使它更强大更容易配置。默认的情况,缓存是没有开启,除了会话缓存以外,它可以提高性能,且能解决循环依赖。开启二级缓存,您只需要在SQL映射文件中(DeptMapper.xml文件)加入简单的一行:<cache/>并配置相应的属性即可,同时实体类要实现Serializable接口。
B:<cache/>作用
(1)所有映射文件里的select语句的结果都会被缓存。
(2)所有映射文件里的insert、update和delete语句执行都会清空缓存。
(3)缓存使用最近最少使用算法(LRU)来回收。
(4)缓存不会被设定的时间所清空。
(5)每个缓存可以存储1024 个列表或对象的引用(不管查询方法返回的是什么)。
(6)缓存将作为“读/写”缓存,意味着检索的对象不是共享的且可以被调用者安全地修改,而不会被其它调用者或者线程干扰。
C:<cache/>属性
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
创建一个FIFO 缓存让60秒就清空一次,存储512个对象结果或列表引用,并且返回的结果是只读。
D:eviction回收算法
LRU–最近最少使用:移出最近最长时间内都没有被使用的对象(默认)
FIFO–先进先出:移除最先进入缓存的对象。
SOFT–软引用:空间内存不足时才进行回收。
WEAK–弱引用:垃圾回收器扫描到时即进行回收。
D:参数解析
flushInterval: 设置任何正整数,缓存刷新时间
Size: 缓存大小,默认是1024。
readOnly: 属性可以被设置为true或false。只读缓存将对所有调用者返回同一个实例。因此这些对象都不能被修改,这可以极大的提高性能。可写的缓存将通过序列化来返回一个缓存对象的拷贝。这会比较慢,但是比较安全。所以默认值是false。
- myBatis关系查询与缓存
- Mybatis入门基础--查询与缓存
- Hibernate查询方法与缓存的关系
- Hibernate查询方法与缓存的关系
- Hibernate查询方法与缓存的关系
- Hibernate查询方法与缓存的关系
- Hibernate查询方法与缓存的关系
- Mybatis - 查询缓存(一级缓存,二级缓存,与ehcache整合)
- MyBatis--查询缓存--一级缓存
- mybatis查询缓存
- mybatis的查询缓存
- 【Mybatis】查询缓存
- Mybatis查询缓存
- mybatis--查询缓存
- Mybatis 查询缓存
- MyBatis--查询缓存
- Mybatis查询缓存机制
- MyBatis--查询缓存
- Substance Painter学习笔记
- Canvas 源码
- SESSION与COOKIE
- Android的主线程与子线程
- Android练习-----星级评分条(RatingBar)
- myBatis关系查询与缓存
- Unity5网络模块UNet介绍
- 如何在Java中使用注释
- 对象死亡的过程
- 现今主流的编程语言的来历
- iOS PCH
- 过采样和欠采样
- lua中用table实现队列
- 深度学习框架Tensorflow分布式实战多机多卡GPU,CPU并行