Mybatis框架

一、Mybatis简介:

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。

1.Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

2.MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

3.通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。

 

二、Mybatis运行原理

1.工作原理图

2.解析

详细流程如下:

(1)、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。

(2)、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。

(3)、SqlSession对象完成和数据库的交互:
  a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
  b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
  c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
  d、JDBC执行sql。

  e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。

三、注意事项

1.正确合理的使用#{}和${}

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

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

  Mybatis在处理${}时,就是把${}替换成变量的值。

  使用#{}可以有效的防止SQL注入,提高系统安全性。
2.模糊查询问题

  在xml的sql语句中使用通配符,会引起sql注入:

String id = "zhang";
public User selectUser(String id);
 <select id="selectUser" parameterType="String" resultMap="BaseResultMap">
     select * from texttable where id like "%"#{id}"%"
  </select>

  改进方案:在java代码中写通配符

String id = "%zhang%";
public User selectUser(String id);
 <select id="selectUser" parameterType="String" resultMap="BaseResultMap">
     select * from texttable where id like #{id}
  </select>

 

 三、优缺点

1.优点

(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;

(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。

(4)能够与Spring很好的集成;

(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

2.缺点

(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

 

四、使用场景

MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。

对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择

 

分享一篇mybatis知识点比较全面的文章:https://blog.csdn.net/a745233700/article/details/80977133

posted @ 2019-03-21 15:11  Code-Kang  阅读(389)  评论(0编辑  收藏  举报