MyBatis框架解析与优化

MyBatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

什么是 MyBatis?

        MyBatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

MyBatis 与 Hibernate 有什么不同?

        MyBatis 和 Hibernate 都是 ORM 框架,但 MyBatis 是半自动的,需要手动编写 SQL 语句,而 Hibernate 是全自动的,可以自动生成 SQL 语句。MyBatis 更加灵活,适合对 SQL 优化有较高要求的项目,而 Hibernate 适合对数据库操作不熟悉或者对 SQL 优化要求不高的项目。

MyBatis的优缺点?

优点

1)易于上手和掌握

2)Sql写在xml里面,便于统一管理和优化

3)减少Sql与程序代码的耦合

4)提供xml标签,支持动态Sql编写

缺点

1)Sql工作量大,尤其是字段多,关联表多时,更是如此

2)Sql依赖于数据库,导致数据库移植性差

3)由于xml里面标签id必须唯一,导致DAO中方法不支持方法重载。所以dao层必须是接口

mybatis的基本工作流程?

1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。

2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡

3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭

4.当用户使用mapper.xml文件中配置的的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。

5.将返回的结果通过映射,包装成java对象。

总结:

创建SqlSessionFactory

通过SqlSessionFactory创建SqlSession

通过SqlSession执行数据库操作

调用session.commit()提交事务

调用session.close()关闭事务

MyBatis应用中#与$有什么异同

相同点:都是通过get来取值的;

不同点:$传过去的字符串不带引号,#号带引号;

1. #{}是预编译处理,${}是字符串替换。

2. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

3. Mybatis在处理${}时,就是把${}替换成变量的值,相当于字符串拼接

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

mybatis的缓存机制,一级,二级介绍一下?

1.一级缓存:默认开启

SqlSession级别的缓存,实现在同一个会话中数据的共享

一级缓存的生命周期和SqlSession一致

当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据。

2.二级缓存:默认不开启,需手动开启

SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量;

可自定义存储源,如Ehcache;

当开启缓存后,数据查询的执行的流程是:二级缓存>一级缓存>数据库;

不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现;

JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

1) 数据库连接的创建、释放频繁造成系统资源浪费从而影响了性能,如果使用数据库连接池就可以解决这个问题。当然JDBC同样能够使用数据源。

解决:在xml中配置数据连接池,使用数据库连接池管理数据库连接。

2) SQL语句在写代码中不容易维护,事件需求中SQL变化的可能性很大,SQL变动需要改变JAVA代码。

解决:将SQL语句配置在mapper.xml文件中与java代码分离。

3) 向SQL语句传递参数麻烦,因为SQL语句的where条件不一定,可能多,也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射到sql语句。

4) 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mbatis自动将SQL执行结果映射到java对象。

  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值