• 数据模型分析思路

    • 每张表记录的数据内容

      • 分模块对每张表记录对内容进行熟悉,相当于学习系统需求(功能)的过程
    • 每张表重要的字段设置
      • 非空字段、外键字段
    • 数据库级别表与表之间的关系
      • 外键关系
    • 表与表之间的业务关系
      • 在分析表与表之间的业务关系时一定要建立在某个业务意义基础上去分析
  • 延时加载
    • 什么是延时加载

      • 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表比关联查询多表速度要快。
      • mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting设置
      •   <settings>
        <!-- 全局设置懒加载,如果设为'false',则所以相关联的都会初始化加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 当设置为'true'的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载 -->
        <setting name="aggressiveLoadingEnabled" value="false"/> </settings>
      •     <!-- 可以使用继承extends,来避免代码重复配置 -->
        <resultMap id="userResultMap" type="cn.xxx.mybatis.po.User" extends="">
        <!--
        id标识查询结果集中唯一标识
        column:查询出来的列名
        property:type指定的pojo类型中的属性名
        最终resultMap对column和property作一个映射关系(对应关系)
        -->
        <id column="id_" property="id"/>
        <!--
        result:对普通名映射定义
        column:查询出来对列名
        property:type指定对pojo类型中对属性名
        最终resultMap对column和property做一个映射关系(对应关系)
        -->
        <result column="username_" property="username"/> <!-- 配置映射的关联的用户信息 -->
        <!--
        association:用于映射关联查询单个对象的信息
        property:要将关联查询的用户信息映射到指定表user中的那个属性
        select:指定延迟加载需要执行的statement的id,若查询的statement的id不在当前的mapper中,需要在statement的id前面加namespace
        column:表中关联延迟表查询的列
        -->
        <association property="" javaType="" >
        <!--id标识查询结果集中唯一标识
        column:查询出来的列名
        property:type指定的pojo类型中的属性名
        最终resultMap对column和property作一个映射关系(对应关系)-->
        <id column="" property=""/>
        <result column="" property=""/> </association> <!--
        collection:对关联查询到多条记录映射到集合对象中
        property:将关联查询到到多条记录映射到type的指定属性名中
        ofType:指定映射到list集合属性中pojo的类型
        -->
        <collection property="" ofType="">
        <id column="" property=""/>
        <result column="" property=""/>
        </collection>
        </resultMap>
  • 查询缓存
    • 什么是查询缓存

      • mybatis提供查询缓存,用于减轻数据压力提高数据库性能
      • mybatis提供一级缓存、二级缓存
    • 一级缓存
      • 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的SqlSession之间的缓存数据区域(HashMap)是互不影响的
    • 二级缓存
      • 二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper的Sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的
      • 每一个namespace的mapper都有一个二级缓存区;拥有相同的namespace的mapper,拥有共同的二级缓存区
      • 使用场景
        • 对于访问多的查询请求且用户对查询结果实时性要求不高。例如耗时较高的统计分析sql、电话账单查询sql等。
      • 局限性
        • mybatis二级缓存对细粒度的数据级别的缓存时间不好。例如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新对商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新商品的缓存信息而不刷新其它商品信息。因为mybatis的二级缓存区域以单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。
      • 除了在SqlMapConfig.xml设置二级缓存的总开关,还需要在具体的mapper.xml中开启二级缓存
        •  <!-- SqlMapConfig.xml配置 -->
          <!-- 二级缓存 -->
          <settings>
          <!-- 对在此配置文件下对所有cache进行全局性开/关设置 -->
          <setting name="cacheEnabled" value="true"/>
          </settings> <!-- mapper.xml配置 -->
          <!-- type:指定cache接口对实现类的类型
          flushInterval:刷新间隔,取值为任意正整数。代表一个合理的毫秒形式的时间段,若不设置则没有刷新间隔,缓存仅仅调用语句时刷新
          size:引用数目,取值为任意正整数。要记住缓存的对象数目和运行环境的可用内存资源数目。默认值1024
          readOnly:只读,设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。这些对象不能被修改。
          这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但安全。因此默认是False。
          --> <!-- 加入ehcache-core-2.6.8.jar和mybatis-ehcache-1.0.3.jar两个jar包,配置mapper中的cache中的type为ehcache对cache接口对实现类型 -->
          <cache type="org.mybatis.caches.ehcache.EhcacheCache" flushInterval="5" size="1024" readOnly="false"/>
          <!-- 针对每次查询需要最新数据的sql,要设置useCache='false',禁用二级缓存 -->
          <select id="selectXXX" resultType="xxx" useCache="false">
          select * from xxx
          </select>
          <!-- 一般情况下执行完commit操作都需要刷新缓存, flushCache='true'表示刷新缓存,这样可以避免数据库脏读 -->
          <insert id="insertXxx" parameterType="cn.xxx.mybatis.po.xxx" flushCache="true"> <!-- 为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一样在内存 -->
          <!-- pojo接口反序列化 -->
    • 为什么要使用缓存
      • 如果缓存中有数据就不用从数据库中获取,大大提高系统性能。
  • mybatis整合ehcache
    • ehcache是一个分布式缓存框架
    • 为什么要使用分布缓存
      • 不使用分布缓存,缓存的数据在各个服务器单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。
    • 为什么要整合
      • mybatis无法实现分布式缓存,需要和其他分布式缓存框架进行整合
    • 如果整合
      • 实现Cache接口

        •     <!-- 加入ehcache-core-2.6.8.jar和mybatis-ehcache-1.0.3.jar两个jar包,配置mapper中的cache中的type为ehcache对cache接口对实现类型 -->
          <cache type="org.mybatis.caches.ehcache.EhcacheCache" flushInterval="5" size="1024" readOnly="false"/> <!-- 创建一个ehcache的配置文件 -->
          <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <!-- -->
          <diskStore path="java.io.tmpdir"/>
          <!--
          maxElementsInMemory:
          eternal:
          timeToIdleSeconds:
          timeToLiveSeconds:
          maxElementsOnDisk:
          diskExpiryThreadIntervalSeconds:
          memoryStoreEvictionPolicy:
          -->
          <defaultCache
          maxElementsInMemory="10000"
          eternal="false"
          timeToIdleSeconds="120"
          timeToLiveSeconds="120"
          maxElementsOnDisk="10000000"
          diskExpiryThreadIntervalSeconds="120"
          memoryStoreEvictionPolicy="LRU">
          <!-- -->
          <persistence strategy="localTempSwap"/>
          </defaultCache>
          </ehcache>

mybatis基础(中)的更多相关文章

  1. JAVA之Mybatis基础入门--框架搭建与简单查询

    JAVA中,操作数据库有JDBC.hibernate.Mybatis等技术,今天整理了下,来讲一讲下Mybatis.也为自己整理下文档: hibernate是一个完全的ORM框架,是完全面向对象的.但 ...

  2. MyBatis基础入门《二十》动态SQL(foreach)

    MyBatis基础入门<二十>动态SQL(foreach) 1. 迭代一个集合,通常用于in条件 2. 属性 > item > index > collection : ...

  3. mybatis基础系列(四)——关联查询、延迟加载、一级缓存与二级缓存

    关本文是Mybatis基础系列的第四篇文章,点击下面链接可以查看前面的文章: mybatis基础系列(三)——动态sql mybatis基础系列(二)——基础语法.别名.输入映射.输出映射 mybat ...

  4. mybatis基础系列(三)——动态sql

    本文是Mybatis基础系列的第三篇文章,点击下面链接可以查看前面的文章: mybatis基础系列(二)--基础语法.别名.输入映射.输出映射 mybatis基础系列(一)--mybatis入门 动态 ...

  5. mybatis基础系列(二)——基础语法、别名、输入映射、输出映射

    增删改查 mapper根节点及其子节点 mybatis框架需要读取映射文件创建会话工厂,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.d ...

  6. mybatis基础系列(一)——mybatis入门

    好久不发博客了,写博文的一个好处是能让心静下来,整理下之前学习过的一些知识一起分享,大神路过~ mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. ...

  7. MyBatis基础入门《十九》动态SQL(set,trim)

    MyBatis基础入门<十九>动态SQL(set,trim) 描述: 1. 问题 : 更新用户表数据时,若某个参数为null时,会导致更新错误 2. 分析: 正确结果: 若某个参数为nul ...

  8. MyBatis基础入门《十八》动态SQL(if-where)

    MyBatis基础入门<十八>动态SQL(if-where) 描述: 代码是在<MyBatis基础入门<十七>动态SQL>基础上进行改造的,不再贴所有代码,仅贴改动 ...

  9. MyBatis基础入门《十七》动态SQL

    MyBatis基础入门<十七>动态SQL 描述: >> 完成多条件查询等逻辑实现 >> 用于实现动态SQL的元素主要有: > if > trim > ...

  10. MyBatis基础入门《十六》缓存

    MyBatis基础入门<十六>缓存 >> 一级缓存 >> 二级缓存 >> MyBatis的全局cache配置 >> 在Mapper XML文 ...

随机推荐

  1. Winform将一个窗体显示在另一个窗体中

    private void ShowForm(Form Indexform) { Form1 form1 = new Form1(); form1 .TopLevel = false; form1 .P ...

  2. 解决idea中 mvn项目导了包找不到包的问题

    ----------------------------------------分割线--------------------------------------------------------- ...

  3. jenkins:一键回滚站点集群

    最近在学习jenkins过程中整理了大量资料,都收录在<jenkins自动化工具使用教程>,但依然缺少一些具体实现细节. 这篇文章,介绍jenkins做集群回滚时的两个设计方案,让一键回滚 ...

  4. PHP_DOC php文档结构及注解浏览

    项目中的PHP文件比较多,为了方便查看,使用PHP写了个小工具,可查看PHP文件的所有类.函数 和特定注释. 显示PHP文件的 Class 和 Function 显示 /// 开头的注解 显示 /// ...

  5. [Swift]LeetCode7. 反转整数 | Reverse Integer

    Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Examp ...

  6. [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List

    Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...

  7. [Swift]LeetCode983. 最低票价 | Minimum Cost For Tickets

    In a country popular for train travel, you have planned some train travelling one year in advance.  ...

  8. 十分钟通过 NPM 创建一个命令行工具

    大过年的,要不要写点代码压压惊?来花十分钟学一下怎么通过 NPM 构建一个命令行工具. 写了一个小 demo,用于代替 touch 的创建文件命令 touchme ,可以创建自带“佛祖保佑”注释的文件 ...

  9. 关于CGI 和 PHP-FPM需要弄清的

    https://blog.csdn.net/gao_yu_long/article/details/79390510 补充一点: 如果php-cgi -b 127.0.0.1:6999,则6999端口 ...

  10. 深入解析 H.265 编码模式,带你了解Apple全面推进H.265的原因

    今天我们聊聊视频编码.视频文件亘古以来存在一个矛盾:高清画质和视频体积的冲突,相同编码标准下,视频更高清,视频体积更大.因此,应用更先进的视频编码标准,降低视频体积,可以大幅降低网站的流量消耗. 目前 ...