【SSM框架】MyBatis笔记 --- 表之间的关联关系;MyBatis事务;MyBatis缓存机制;ORM概述
一、表之间的关联关系:
- 关联关系是有方向的。
1、四种关联关系:
1)一对多关联:一个老师可以教多个学生,多个学生只有一个老师来教,站在老师方,就是一对多关联。
2)多对一关联:一个老师可以教多个学生,多个学生只有一个老师来教,站在学生方,就是多对一关联。
3)一对一关联:一个老师辅导一个学生,一个学生只请教一个老师,学生和老师是一对一。
4)多对多关联:园区划线的车位和园区的每一辆车,任意一个车位可以停任意一辆车,任意一车辆车可以停在任意一个车位上。
2、一对多关联关系:
客户和订单就是典型的一对多关联关系;
一个客户名下可以有多个订单;
客户表是一方,订单表是多方.客户一中持有订单的集合;
使用一对多的关联关系,可以满足查询客户的同时查询该客户名下的所有订单.;
需求:根据客户的id查询客户所有信息并同时查询该客户名下的所有订单
<!--
//customer表中的三个列
private Integer id;
private String name;
private Integer age;
//该客户名下的所有订单的集合
private List<Orders> ordersList;
-->
<resultMap id="customermap" type="customer">
<!--主键绑定-->
<id property="id" column="cid"></id>
<!--非主键绑定-->
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<!--多出来的一咕噜绑定ordersList
Orders实体类:
private Integer id;
private String orderNumber;
private Double orderPrice;
-->
<collection property="ordersList" ofType="orders">
<!--主键绑定-->
<id property="id" column="oid"></id>
<!--非主键绑定-->
<result property="orderNumber" column="orderNumber"></result>
<result property="orderPrice" column="orderPrice"></result>
</collection>
</resultMap>
<select id="getById" parameterType="int" resultMap="customermap">
select c.id cid,name,age,o.id oid,orderNumber,orderPrice,customer_id
from customer c
left ,join orders o on c.id = o.customer_id
where c.id=#{id}
</select>
3、多对一关联关系:
订单和客户就是多对一关联;
站在订单的方向查询订单的同时将客户信息查出;
订单是多方,会持有一方的对象,客户是一方;
需求:根据订单的id查询订单所有信息并同时查询该订单对应的用户信息
<mapper namespace="com.bjpowernode.mapper.OrdersMapper">
<!--
实体类
private Integer id;
private String orderNumber;
private Double orderPrice;
//关联下此订单的客户信息,多方持有一方的对象
private Customer customer;
-->
<resultMap id="ordersmap" type="orders">
<!--主键绑定-->
<id property="id" column="oid"></id>
<!--非主键绑定-->
<result property="orderNumber" column="orderNumber"></result>
<result property="orderPrice" column="orderPrice"></result>
<!--多出来的一咕噜绑定
private Integer id;
private String name;
private Integer age;
//该客户名下的所有订单的集合,一方持有多方的集合
private List<Orders> ordersList; //不用管
-->
<association property="customer" javaType="customer">
<id property="id" column="cid"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
</association>
</resultMap>
<select id="getById" parameterType="int" resultMap="ordersmap">
select o.id oid,orderNumber,orderPrice,customer_id,c.id cid,name,age
from orders o inner join customer c on o.customer_id = c.id
where o.id=#{id}
</select>
</mapper>
总结:无论是什么关联关系,如果某方持有另一方的集合,则使用<collection>标签完成映射,如果某方持有另一方的对象,则使用<association>标签完成映射。
二、事务:
- 多个操作同时完成,或同时失败称为事务处理。事务有四个特性:一致性,持久性,原子性,隔离性.
在MyBatis框架中设置事务:
<!--程序员自己控制处理的提交和回滚-->
<transactionManager type="JDBC"></transactionManager>
//默认是手工提交事务,设置为false也是手工提交事务,如果设置为true,则为自动提交.
sqlSession = factory.openSession();
//设置为自动提交,在增删改后不需要commit();
sqlSession = factory.openSession(true);
三、缓存:
- MyBatis框架提供两级缓存,一级缓存和二级缓存,默认开启一级缓存。缓存就是为了提交查询效率。
1、使用缓存后,查询的流程:
查询时先到缓存里查,如果没有则查询数据库,放缓存一份,再返回客户端,下次再查询的时候直接从缓存返回,不再访问数据库;
如果数据库中发生commit()操作,则清空缓存。
2、一级缓存使用的是SqlSession的作用域,同一个sqlSession共享一级缓存的数据。
二级缓存使用的是mapper的作用域,不同的sqlSession只要访问的同一个mapper.xml文件,则共享二级缓存作用域。
四、ORM:
- ORM(Object Relational Mapping):对象关系映射
1、MyBatis框架是ORM非常优秀的框架。
java语言中以对象的方式操作数据,存到数据库中是以表的方式进行存储,对象中的成员变量与表中的列之间的数据互换称为映射,整个这套操作就是ORM。
2、持久化的操作:将对象保存到关系型数据库中 ,将关系型数据库中的数据读取出来以对象的形式封装
MyBatis是持久化层优秀的框架。