zoukankan      html  css  js  c++  java
  • MyBatis

    一、MyBatis

    1、概念

    MyBatis 是一种优秀的持久层框架jdbc操作数据库的过程进行了封装

    mybatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回。

    2、工作原理

    ① 通过配置文件创建SqlSessionFactory 
    ② 通过SqlSessionFactory根据配置文件(xml、java注解)创建SqlSession 
    ③ 通过sqlsession执行数据库操作(增删改查)
    ④ 调用session.commit()提交事务 
    ⑤ 调用session.close()关闭会话

    3、缓存机制

    MyBatis有两级缓存

    一级缓存是SqlSession级别的缓存,他的作用域是同一个SqlSession,在同一个sqlSession中执行相同的Sql语句,第一次执行完毕的会将结果集写到缓存中,第二次就会从缓存中获取数据;

    二级缓存是mapper级别的缓存,作用域是mapper的同一个namespace,不同的sqlsession在同一个namespace下执行相同的sql语句,第一次查询的结果缓存到缓存中,第二次则可从缓存中获取数据。

    Mybatis默认开启一级缓存,没有开启二级缓存,二级缓存需要在xml配置中手动配置开启。

    4、优点

    使用数据库连接池管理链接,避免频繁创建、关闭链接,浪费资源影响性能;

    xml管理sql语句,与java代码分离,代码更易维护;

    Mybatis自动将结果集封装成java对象,通过statement的resultType定义输出的类型避免因sql变化对结果集处理麻烦的问题;

    5、Dao接口工作原理

    Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

    Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

    Mapper接口是没有实现类的当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement

    6、#{}${}的区别是什么?

    答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换

    #{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值

    7、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

    答:Hibernate属于全自动ORM映射工具,“全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

    Mybatis的着力点,则在于POJO与SQL之间的映射关系在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

    二、索引

    1、索引结构

    B-tree索引

    Hash索引

    2、建立索引的原则

    最左匹配原则:向右匹配直到遇到范围查询(>、<、between、like)

    选择区分度高的列作为索引;

    索引列不能参与计算;

    索引不含null值的列

    3、常见的索引

    主键索引;不允许空值

    唯一索引;索引列(含组合)的值唯一,允许空值

    普通索引;

    全文索引;耗时

    组合索引;最左匹配原则

    4、sql优化

    1)只返回需要的数据,不要写select *

    2)适当建立索引,以下几种会全表扫描:

           左模糊查询‘%...’

           使用不等操作符 !=

           Or使用不当,or两边都需要有索引才行

           In ,not in

    5、存储引擎

     Innodb:

     myIsam

  • 相关阅读:
    tyvj 1031 热浪 最短路
    【bzoj2005】 [Noi2010]能量采集 数学结论(gcd)
    hdu 1394 Minimum Inversion Number 逆序数/树状数组
    HDU 1698 just a hook 线段树,区间定值,求和
    ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力
    ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS
    ZeptoLab Code Rush 2015 A. King of Thieves 暴力
    hdoj 5199 Gunner map
    hdoj 5198 Strange Class 水题
    vijos 1659 河蟹王国 线段树区间加、区间查询最大值
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/9642829.html
Copyright © 2011-2022 走看看