概念:MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis中,#{ } 和${ }区别?
#{ } | #{} 是占位符,预编译处理,Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; 使用#{}可以有效的防止SQL注入,提高系统安全性。 |
${} | ${}是字符串替换,Mybatis在处理${}时,就是把${}替换成变量的值, |
MyBatis编程步骤?
1、 创建SqlSessionFactory
2、 通过SqlSessionFactory创建SqlSession
3、 通过sqlsession执行数据库操作
4、 调用session.commit()提交事务
5、 调用session.close()关闭会话
MyBatis,resultType 和 resultMap区别?
如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性;
如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过resultMap手动建立对象关系映射,resultMap要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来
MyBatis中动态SQL 标签?
1. <if>if是为了判断传入的值是否符合某种规则,比如是否不为空.
2. <where> where标签可以用来做动态拼接查询条件,当和if标签配合的时候,不用显示的声明类型where 1 = 1这种无用的条件
3. <foreach> foreach标签可以把传入的集合对象进行遍历,然后把每一项的内容作为参数传到sql语句中.
4. <include> include可以把大量的重复代码整理起来,当使用的时候直接include即可,减少重复代码的编写;
5. <set>适用于更新中,当匹配某个条件后,才会对该字段进行跟新操作
MyBatis的缓存机制?
Mybatis有两级缓存,一级缓存是SqlSession级别的,默认开启,无法关闭;二级缓存是Mapper级别的,二级缓存默认是没有开启的,但是手动开启
1. 一级缓存:基础PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,Session中的所有Cache就将清空
2. 二级缓存其存储作用域为Mapper(Namespace),使用二级缓存属性类需要实现Serializable序列化接口
3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C(增加)/U(更新)/D(删除)操作后,默认该作用域下所有select中的缓存将被clear.需要在setting全局参数中配置开启二级缓存,如下conf.xml配置
<setting>
<setting name="cacheEnabled" value="true"/> 默认是false,关闭二级缓存
</setting>
当我们的配置文件配置了cacheEnabled=true时,就会开启二级缓存,二级缓存是mapper级别的,如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓存→数据库
mytabis从来只是写一个mapper 接口,写一个,xml文件,从来没写过实现类,利用asm 框架用它来在运行期间去动态的拼出一个代理类的字节码,可以随意控制代理类的class字节码的内容,动态代理再生成字节码的时候,在字节码的内部把切面增强的动作和目标动作做了结合,e.g. 把增强的动作放在目标动作之前,就是aop的前置通知