2021-08-05

一. mybatis多表连接操作

对上一篇mybatis的补充

多对多查询

实体类:
Student.java.
Orders.java
OrderDesc.java
Goods.java

一个用户对应多个订单:

<mapper namespace="com.zx.mapper.StudentMapper">

   <resultMap id="studentOrdersMap" type="com.zx.model.Student" autoMapping="true">
       <id property="stu_id" column="stu_id"/>
       <collection property="ordersList"
                   column="stu_id"
                   ofType="com.zx.model.Orders"
                   select="com.zx.mapper.OrderMapper.QueryStudentGoodByOrderStuId"
                   fetchType="lazy"
       autoMapping="true">
       </collection>
   </resultMap>
   <select id="queryStuGoodsByStuId" resultMap="studentOrdersMap">
       select * from student where stu_id=#{stu_id}
   </select>

</mapper>

一个订单对应多个订单明细:

<mapper namespace="com.zx.mapper.OrderMapper">

    <resultMap id="ordersOrderDescMap" type="com.zx.model.Orders" autoMapping="true">
        <id property="order_id" column="order_id"/>
        <collection property="ordersDescList"
                    column="order_id"
                    select="com.zx.mapper.OrderDescMapper.queryStudentGoodsByOrderDescOrderId"
                    ofType="com.zx.model.OrderDesc"
                    fetchType="lazy"
        autoMapping="true">
        </collection>
    </resultMap>
    <select id="QueryStudentGoodByOrderStuId" resultMap="ordersOrderDescMap">
        select * from orders where stu_id=#{stu_id}
    </select>
</mapper>

多个订单明细对应一个商品:

<mapper namespace="com.zx.mapper.OrderDescMapper">
    
    <resultMap id="OrderDescGoods" type="com.zx.model.OrderDesc" autoMapping="true">
        <id property="g_id" column="g_id"/>
        <association property="goods" column="g_id"
                     select="com.zx.mapper.GoodsMapper.queryStudentGoodsByGoodId"
                     fetchType="lazy"></association>
    </resultMap>
    <select id="queryStudentGoodsByOrderDescOrderId" resultMap="OrderDescGoods">
        select * from orderDesc where order_id=#{order_id}
    </select>

</mapper>

商品查询:

<mapper namespace="com.zx.mapper.GoodsMapper">
    <select id="queryStudentGoodsByGoodId" resultType="com.zx.model.Goods">
        select * from goods where g_id=#{g_id}
    </select>

</mapper>
注意:在一般情况下,在一对多关联的时候,一方使用延迟加载的策略获取关联对象(多方);在多对一的情况下,
多方一般使用立即加载所对应的一方对象(关联对象);如果在mybatis中使用了表连接的方式来查询,则无法使
用延迟加载机制。

二. 基于注解的方式


    //注解的方式编写简单的SQL语句
    @Insert("insert into tbl_user values(default," +
            "#{stu_name},#{stu_sex},#{stu_age},#{stu_major},#{stu_address}")
    void addStudent(Student student);
    @Select("select * from student where stu_id=#{stu_id}")
    Student findStudent(int stu_id);
    @Delete("delete from student where stu_id=#{stu_id}")
    void deletStudent(int stu_id);
    @Update("update student set stu_name=#{stu_name} stu_age=#{stu_age} where stu_id=#{stu_id}")
    void updateStudent(Student student);
 MyBatis 常用注解
   1.@Insert:等同于<insert>定义 insert SQL 语句
   2.@Update:等同于<updatet>定义 update SQL 语句
   3.@Delete: 等同于<delete>定义 delete SQL 语句
   4.@Select: 等同于<select>定义 select SQL 语句
   5. @Results:等于与<resultMap>定义结果映射
   6.@Result:等同于<id>和<result>,用于映射属性     @ResultMap:用于引用 Results 定义的结果映射
   7.@one:等同于<association>,用于多对一关联中映射单个对象
   6. @Many: 等同于<collection>,用于一对多关联中映射多方

对于简单的sql语句来说推荐使用注解的方式,但对于复杂的sql语句,还是建议使用xml文件的方式

二.mybatis 的缓存机制

Mybatis提供缓存机制时为了提高查询效率,降低数据库负担,通过缓存机制降低与数据库的交互次数
Mybatis的两种缓存:

  • 一级缓存(sqlsession级缓存):在同一个sqlsession中起作用,sqlsession一旦关闭,一级缓存消失
    一级缓存属于 mybatis 的默认缓存,默认开启,直接使用 当我们执行查询语句时,mybatis 都会将查询的数据存在一级缓存中,直到 session 关闭或事务提交或手动清空缓存 当执行查询时,mybatis 先在一级缓存中查找待查询的数据,如果一级缓存中存在则直 接使用不再访问数据库,如果一级缓存中不存在则访问数据库查询,将查询的结果向 一级缓存中存储一份,等待后续使用;当执行 commit 事务提交时,会自动清空一级缓存中的数据。
  • 二级缓存(mapper级缓存):在同一个mapper中多个sqlsession可以共享缓存
    二级缓存脱离 sqlSession 存在的,而且是同一个 mapper 共享的,所以默认情 况对象并不进入二级缓存,需要手动设置要向二级缓存中存放的对象(一般情况下使 用比较频繁的对象放入二级缓存)
    在 Mapper 中通过标签让当前对象存入到二级缓存中
    需要存入到二级缓存的对象,必须实现序列化接口 Mybatis 中默认开启二级缓存,在需要的 mapper(映射器)中配置要缓存的对象 即可使用当查询一个对象时,会先在二级缓存中查找(该对象允许存入到二级缓存中), 如果找到则直接返回,如果找不到则在到一级缓存中查找,如果找到则返回,如果找 不到会向数据库发送查询请求,并查询相应的数据,将该数据存入到一级缓存和二级 缓存(该对象允许存入到二级缓存中),以备后期使用
这个数据可以使用Python进行解析和处理。可以按照以下步骤进行: 1. 将数据分割成每个数据项。 ``` data_items = data.split(',') ``` 2. 对于每个数据项,将其按#分割成四个小项,并存储到一个列表中。 ``` data_list = [] for item in data_items: item_list = item.split('#') data_list.append(item_list) ``` 3. 对于每个小项,进行相应的类型转换。 ``` for item in data_list: item[0] = int(item[0]) # 题号转换为整数 item[1] = datetime.datetime.strptime(item[1], '%Y-%m-%d %H:%M:%S') # 时间转换为datetime类型 if item[2] != '': # 操作类型转换为整数 item[2] = int(item[2]) item[3] = str(item[3]) # 科目转换为字符串类型 ``` 4. 可以按照需要对数据进行进一步处理,如按照题号、时间等进行排序、筛选等操作。 完整的Python代码如下: ``` import datetime data = '''1#2021-05-18 14:31:55##初级会计实务,2#2021-05-18 14:31:57#12#初级会计实务,2#2021-05-18 14:32:08##初级会计实务,3#2021-05-18 14:32:09#12#初级会计实务,4#2021-05-18 14:32:34#12#初级会计实务,4#2021-05-18 14:32:45##初级会计实务,5#2021-05-18 14:32:46#12#初级会计实务,5#2021-05-18 14:32:57##初级会计实务,6#2021-05-18 14:33:00#12#初级会计实务,7#2021-05-18 14:33:44#12#初级会计实务,7#2021-05-18 14:34:42##初级会计实务,8#2021-05-18 14:34:43#12''' # 将数据分割成每个数据项 data_items = data.split(',') # 对于每个数据项,将其按#分割成四个小项,并存储到一个列表中 data_list = [] for item in data_items: item_list = item.split('#') data_list.append(item_list) # 对于每个小项,进行相应的类型转换 for item in data_list: item[0] = int(item[0]) # 题号转换为整数 item[1] = datetime.datetime.strptime(item[1], '%Y-%m-%d %H:%M:%S') # 时间转换为datetime类型 if item[2] != '': # 操作类型转换为整数 item[2] = int(item[2]) item[3] = str(item[3]) # 科目转换为字符串类型 print(data_list) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小粥呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值