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