• 数据模型分析思路

    • 每张表记录的数据内容

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

      • 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表比关联查询多表速度要快。
      • 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. [error] - Build path is incomplete. Cannot find class file for org/aspectj/weaver/refl

    将本地仓库中mybatis 的jar 包删除,然后在eclipse 中右键工程选中 Maven->upgrade ..

  2. unittest测试套件

    测试套件就是测试集,测试集是测试用例的集合. a.按用例顺序执行(addtest) 当addtest与unittest的测试规则冲突时,仍然按照ASCII码的顺序执行. import unittest ...

  3. [AI开发]Python+Tensorflow打造自己的计算机视觉API服务

    "与其停留在概念理论层面,不如动手去实现一个简单demo ."       ——鲁迅 没有源码都是耍流氓github 前言 目前提供AI开发相关API接口的公司有很多,国外如微软. ...

  4. Python爬虫7-Cookie & Session

    GitHub代码练习地址:1.手动利用cookie访问网页:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac10_cook ...

  5. MySQL 的分页查询 SQL 语句

    MySQL一般使用 LIMIT 实现分页.基本语句为: SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... 在中小数据量的情况下,这样的SQL足够 ...

  6. 使用Nginx做图片服务器时候,配置之后图片访问一直是 404问题解决

    我的错误配置是: 服务器文件根地址: 想通过浏览器输入这个地址访问到图片: 但是会发现文件找不到会一直404,原因是根路径配置错误,来看下root路径原理: root 配置的意思是,会在root配置的 ...

  7. [Swift]LeetCode775. 全局倒置与局部倒置 | Global and Local Inversions

    We have some permutation Aof [0, 1, ..., N - 1], where N is the length of A. The number of (global) ...

  8. Mysql数据库和表的增删改查以及数据备份&恢复

    数据库 查看所有数据库 show databases; 使用数据库 use 数据库名; 查看当前使用的数据库 select database(); 创建数据库 create database 数据库名 ...

  9. 一文掌握 Linux 性能分析之网络篇(续)

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 这是 Linu ...

  10. JavaScript03-基本概念一

    js包括:语法.语句.类型.关键字.保留字.操作符和对象. 语法.关键字.保留字 1.js中一切区分大小写,包括变量.函数名.操作符: 2.标识符规则,第一个字符必须是字母.下划线_.或者美元符号,其 ...