• MyBatis——表的关联关系,事务,ORM,缓存机制


    目录

    一,一对多的关联关系

    二,多对一

     三,一对一

    四,多对多关联关系

    五,事务

    六,缓存机制

    使用缓存访问数据库的流程:

    缓存的作用域:

    七,ORM:对象关系映射


    表的关联关系

    关联关系是存在方向的

    1,一对一

    2,一对多

    3,多对一

    4,多对多

    一,一对多的关联关系

    创建表:

    1. use ssm;
    2. Create table customer(
    3. id int primary key auto_increment,
    4. name varchar(32),
    5. age int
    6. );
    7. insert into customer values(1,'张三',22);
    8. insert into customer values(2,'李四',23);
    9. insert into customer values(3,'王五',24);
    10. create table orders(
    11. id int primary key auto_increment,
    12. orderNumber varchar(16),
    13. orderPrice double,
    14. customer_id int ,
    15. foreign key (customer_id) references customer(id)
    16. );
    17. insert into orders values(11,20,22.22,1);
    18. insert into orders values(12,60,16.66,1);
    19. insert into orders values(13,90,19.99,2);
    20. select * from customer;
    21. select * from orders;

    创建实体类:

    1. public class Customer {
    2. private Integer id;
    3. private String name;
    4. private Integer age;
    5. //用户订单信息
    6. private List ordersList;
    7. ...
    8. }
    9. public class Orders {
    10. private Integer id;
    11. private String orderNumber;
    12. private Double orderPrice;
    13. //因为customer_id是一个外键,本不属于order这个类的属性,所以,不需要创建该属性
    14. ...
    15. }

    创建CustomerMapper接口和xml文件

    1. mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.mybatis.mapper.CustomerMapper">
    5. <resultMap id="customerMap" type="customer">
    6. <id property="id" column="cid">id>
    7. <result property="name" column="name">result>
    8. <result property="age" column="age">result>
    9. <collection property="ordersList" ofType="orders">
    10. <id property="id" column="oid">id>
    11. <result property="orderNumber" column="orderNumber">result>
    12. <result property="orderPrice" column="orderPrice">result>
    13. collection>
    14. resultMap>
    15. <select id="getById" parameterType="int" resultMap="customerMap">
    16. select c.id cid,name,age,o.id oid,orderNumber,orderPrice,customer_id
    17. from customer c left join orders o on c.id = o.customer_id
    18. where c.id = #{id}
    19. select>
    20. mapper>
    1. package com.mybatis.mapper;
    2. import com.mybatis.pojo.Customer;
    3. public interface CustomerMapper {
    4. //根据用户的ID查询用户的ID,和ID下的所有订单信息,返回的是Customer这个对象
    5. Customer getById(Integer id);
    6. }

    测试:

    1. @Test
    2. //一对多关联表查询
    3. public void testGetCustomerById(){
    4. Customer customer = customerMapper.getById(1);
    5. System.out.println(customer);
    6. }

    查询结果:

    分析:

     

    二,多对一

    订单与客户是多对一的关系,站在订单查用户

    1. package com.mybatis.mapper;
    2. import com.mybatis.pojo.Orders;
    3. public interface OrdersMapper {
    4. //根据订单的编号查询订单信息及下单用户的信息
    5. Orders getById(Integer id);
    6. }

     

    1. <resultMap id="ordersMap" type="orders">
    2. <id property="id" column="oid">id>
    3. <result property="orderNumber" column="orderNumber">result>
    4. <result property="orderPrice" column="orderPrice">result>
    5. <association property="customer" javaType="customer">
    6. <id property="id" column="cid">id>
    7. <result property="name" column="name">result>
    8. <result property="age" column="age">result>
    9. association>
    10. resultMap>
    11. <select id="getById" parameterType="int" resultMap="ordersMap">
    12. select o.id oid,orderNumber,orderPrice,customer_id,c.id cid,name,age
    13. from orders o inner join customer c on o.customer_id = c.id
    14. where o.id = #{id}
    15. select>
    1. //多对一关联表查询
    2. @Test
    3. public void testGetOrdersById(){
    4. Orders orders = ordersMapper.getById(11);
    5. System.out.println(orders);
    6. }

     三,一对一

    一个实体中包含另一个实体的对象既可通过一次查询,得到两个实体的关系

     

    四,多对多关联关系

    添加一个中间表来化简

     

     

    五,事务

    一组逻辑操作的最小单元
    一致性,持久性,原子性,隔离性

    MyBatis中的事务处理

    通过transactionManager来管理事务是否是程序自己提交

    <transactionManager type="JDBC">transactionManager>
            sqlSession = factory.openSession();

    factory.openSeesion()里面如果是空或者false,表示手动提交,如果true是自动提交。

    六,缓存机制

    MyBatis框架提供两级缓存,一级缓存和二级缓存,默认开启一级缓存,提高查询数据访问的效率。

    使用缓存访问数据库的流程:

     如果数据库中发生了数据变化,会将缓存中的数据全部清空,保证数据的一致性。

    缓存的作用域:

    一级缓存:使用的SqlSession的作用域,同一个SqlSession共享一级缓存作用域

    二级缓存:使用的mapper的缓存作用域,不同的SqlSession只要访问的同一个mapper.xml文件,则共享二级缓存作用域。

    七,ORM:对象关系映射

    Java中以对象关系操作数据,将数据库中的数据以对象的形式存储,在对象中的数据交换到数据库存储。叫对象关系映射。

  • 相关阅读:
    前端之用html做一个用户登陆界面
    AP1272 线性稳压IC 电子地称 无绳电话 水表 电表芯片
    Worthington核糖核酸测定详细攻略
    go版本升级
    3.DesignForVias\2.AutoRoutingSecondStep
    网络协议,数据传输,网络通讯
    Linux环境变量详解
    手游联运平台都具备哪些功能?
    JavaScript(短信验证码)
    Java - 由ReflectionFactory引发的对final关键字的思考
  • 原文地址:https://blog.csdn.net/qq_52655865/article/details/126349153