myBatis关系查询与缓存

来源:互联网 发布:人物动作设计软件 编辑:程序博客网 时间:2024/05/18 00:12

myBatis关系查询与缓存

 

JAVA中再好的封装,在反射眼里都是裸奔,框架即是最好的体现之一。

 

1、表的关系

A:一对一

B:一对多

C:多对一

D:多对多

 

2、myBatis中通过resultMap来维护关系

(一)代码:JavaBeanxml<association>

(多)代码:List<T>xml<collection>

 

3、关系查询示例

这里就直接给例子,如果具体配置细节等不明白参考我前面的文章(《myBatis入门》,《myBatis接口编程》)

A:工程整体构架

 

 

B:数据库表

(1)部门表


(2)员工表

 

 

 

CDeptMapper.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>

 

CDAO接口内容

public interface Dao {

List<Deptment> selectDept();

List<Employee> selectEmpl();

}

 

DDeptment部门实体类

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 + "]";

}

}

 

FEmployee员工实体类

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、缓存

AMyBatis包含一个强大的、可配置、可定制的查询缓存机制。MyBatis 3的缓存实现有了许多改进,使它更强大更容易配置。默认的情况,缓存是没有开启,除了会话缓存以外,它可以提高性能,且能解决循环依赖。开启二级缓存,您只需要在SQL映射文件中(DeptMapper.xml文件)加入简单的一行:<cache/>并配置相应的属性即可,同时实体类要实现Serializable接口。

 

B<cache/>作用

(1)所有映射文件里的select语句的结果都会被缓存。

(2)所有映射文件里的insertupdatedelete语句执行都会清空缓存。

(3)缓存使用最近最少使用算法(LRU)来回收。

(4)缓存不会被设定的时间所清空。

(5)每个缓存可以存储1024 个列表或对象的引用(不管查询方法返回的是什么)。

(6)缓存将作为“读/写”缓存,意味着检索的对象不是共享的且可以被调用者安全地修改,而不会被其它调用者或者线程干扰。

 

C<cache/>属性

<cache

eviction="FIFO"

flushInterval="60000"

size="512"

readOnly="true"/>

创建一个FIFO 缓存让60秒就清空一次,存储512个对象结果或列表引用,并且返回的结果是只读。

 

Deviction回收算法

LRU–最近最少使用:移出最近最长时间内都没有被使用的对象(默认)

FIFO–先进先出:移除最先进入缓存的对象。

SOFT–软引用:空间内存不足时才进行回收。

WEAK–弱引用:垃圾回收器扫描到时即进行回收。

 

D:参数解析

flushInterval: 设置任何正整数,缓存刷新时间

Size: 缓存大小,默认是1024

readOnly: 属性可以被设置为truefalse。只读缓存将对所有调用者返回同一个实例。因此这些对象都不能被修改,这可以极大的提高性能。可写的缓存将通过序列化来返回一个缓存对象的拷贝。这会比较慢,但是比较安全。所以默认值是false

 

 

 

 

 

 

0 0
原创粉丝点击