mybatis-04【小结】java
一、Mybatis 中 # 和 $ 的区别?
#至关于对数据 加上 双引号,$至关于直接显示数据
1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:order by #user_id#,若是传入的值是111,那么解析成 sql 时的值为 order by "111", 若是传入的值是 id,则解析成的 sql 为 order by "id".
2)$将传入的数据直接显示生成在 sql 中。
如:order by $user_id$,若是传入的值是 111,那么解析成 sql 时的值为order by user_id, 若是传入的值是 id,则解析成的 sql 为 order by id.
3) #方式可以很大程度防止 sql 注入。
4)$方式没法防止 Sql 注入。
5)$方式通常用于传入数据库对象,例如传入表名.
6)通常能用#的就别用$.sql
二、mybatis执行过程?
1)配置mybatis的配置文件,mybatis-cfg.xml
2)经过配置文件,加载mybatis运行环境,建立SqlSessionFactory会话工厂SqlSessionFactory在实际使用时按单例方式。
3)经过SqlSessionFactory建立SqlSession,SqlSession是一个面向用户接口(提供操做数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内。
4)调用sqlSession的方法去操做数据。若是须要提交事务,须要执行SqlSession的commit()方法。
5)释放资源,关闭 session.close()数据库
三、Mybatis与Hibernate比较
1)MyBatis能够进行更为细致的SQL优化,能够减小查询字段。
2)MyBatis容易掌握,而Hibernate门槛较高。
3)Hibernate功能强大,数据库无关性好,O/R映射能力强,须要代码量少,开发速度快编程
四、Mybatis缓存机制【MyBatis有两级缓存】
一级缓存是SqlSession级别的缓存,他的做用域是同一个SqlSession,在同一个sqlSession中执行相同的Sql语句,第一次执行完毕的会将结果集写到缓存中,第二次就会从缓存中获取数据;
二级缓存是mapper级别的缓存,做用域是mapper的同一个namespace,多个SqlSession去操做同一个Mapper的sql语句,多个SqlSession能够共用二级缓存,二级缓存是跨SqlSession的。
Mybatis默认开启一级缓存,没有开启二级缓存,二级缓存须要在xml配置中手动配置开启。
在全局配置文件 mybatis-cfg.xml 开启缓存
<!--开启二级缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
五、JDBC 编程有哪些不足之处,MyBatis 是如何解决?
1)数据库连接建立、释放频繁形成系统资源浪费从而影响系统性能,若是使用数据库连接池可解决此问题。
解决:在 SqlMapConfig.xml 中配置数据连接池,使用链接池管理数据库连接。
2) Sql 语句写在代码中形成代码不易维护,实际应用 sql 变化的可能较大,sql 变更须要改变 java 代码。
解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
3)向 sql 语句传参数麻烦,由于 sql 语句的 where 条件不必定,可能多也可能少,占位符须要和参数一一对应。
解决: Mybatis 自动将 java 对象映射至 sql 语句
4)对结果集解析麻烦,sql 变化致使解析代码变化,且解析前须要遍历,若是能将数据库记录封装成 pojo 对象解析比较方便。
解决:Mybatis 自动将 sql 执行结果映射至 java 对象。缓存
六、使用 MyBatis 的 mapper 接口调用时有哪些要求?
1)Mapper 接口方法名和 mapper.xml 中定义的每一个 sql 的 id 相同
2) Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每一个 sql 的 parameterType 的类型相同
3)Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每一个 sql 的 resultType 的类型相同
4)Mapper.xml 文件中的 namespace 便是 mapper 接口的类路径安全