【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是持久化层优秀的框架。

 

posted @ 2022-05-11 00:41  猿头猿脑的王狗蛋  阅读(139)  评论(0编辑  收藏  举报
1