一、表之间的关联关系:
- 关联关系是有方向的。
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是持久化层优秀的框架。
来源:https://www.cnblogs.com/Burning-youth/p/16256206.html
本站部分图文来源于网络,如有侵权请联系删除。