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的?号占位符设置参数值

 使用 #{} 可以有效的防止SQL注入,提高系统安全性。

在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。

 

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

 

posted @ 2018-09-13 20:10  提拉米苏007  阅读(112)  评论(0编辑  收藏  举报