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

  • 相关阅读:
    史蒂夫·乔布斯-读书笔记3
    史蒂夫·乔布斯-读书笔记2
    史蒂夫·乔布斯-读书笔记1
    Mac配置Qt环境——Could not resolve SDK path for 'macosx10.8'
    相信
    搞笑语录 一
    C++ 引用
    C++ inline函数
    AI-随机迷宫&迷宫求解
    sizeof && strlen 的区别
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/9642829.html
Copyright © 2011-2022 走看看