MyBatis知识点总结(-)思想

来源:互联网 发布:豪门体验知乎 编辑:程序博客网 时间:2024/06/01 12:31
参考博客:http://www.coin163.com/doc/mybatis/mybatis.html

1、ORM: 持久层框架

ORM框架的基本思想
产生原因或是解决问题:解决面向对象语言和关系数据库不一致的问题;
程序设计语言发展比较快,一切皆为对象,以对象为单位进行操作;关系数据库存储的是数据之间的关联关系,传统的操作JDBC来操作数据库时,往往需要拼接SQL处理结果之间的对应关系这些重复操作,持久层框架解决了这些问题,简化了代码的编写和实现了代码和程序的解耦,另外使得程序员只关注对象,操作对象的方式来操作数据库;


ORM框架结构分析:
1)框架的总体配置文件:指定驱动、连接、事务、其他属性配置等;
2)从配置文件中获取sesssionFactory
3)从sessionfactory中获取session
4)从session中完成对数据的增删改查和事务控制等
5)用完之后关闭session
6)bean和数据表之间的一个映射关系文件

2、MyBatis框架描述:
     MyBatis是支持普通SQL查询,存储过程和高 级映射的优秀持久层框架。
     MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
    MyBatis使用简单的XML或注解用于配置 和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录.
   
MyBatis和ibatis的区别:    
     
Mybatis是ibatis的升级,Mybatis不需要写dao的实现类,只需要接口和xml配置文件,接口中声明的方法和xml中的操作id名称相同
     
3、JDBC到MyBatis优化改进

1)、  JDBC查询数据库数据,一般需要以下七个步骤:
(1)  加载JDBC驱动
(2)  建立并获取数据库连接
(3)  创建 JDBC Statements 对象
(4)  设置SQL语句的传入参数
(5)  执行SQL语句并获得查询结果
(6)  对查询结果进行转换处理并将处理结果返回
(7)  释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)

实现JDBC有七个步骤,哪些步骤是可以进一步封装的,减少我们开发的代码量?

2)、  JDBC演变到Mybatis过程

第一步优化:连接获取和释放
问题描述:通过JDBC的方式数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能;但是现在连接池多种多样,可能存在变化,有可能采用DBCP的连接池,也有可能采用容器本身的JNDI数据库连接池。
解决问题:数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题,通过连接池就可以反复利用已经建立的连接去访问数据库了,减少连接的开启和关闭的时间。
同时通过DataSource进行隔离解耦,统一从DataSource里面获取数据库连接,DataSource具体由DBCP实现还是由容器的JNDI实现都可以,将DataSource的具体实现通过让用户配置来应对变化。

第二步优化:SQL统一存取
问题描述:通过JDBC的方式,可读性很差,不利于维护以及做性能调优;改动Java代码需要重新编译、打包部署。不利于取出SQL在数据库客户端执行(取出后还得删掉中间的Java代码,编写好的SQL语句写好后还得通过+号在Java进行拼凑)。
     解决问题:把SQL语句统一集中放到配置文件,通过SQL语句的key值去获取对应的SQL语句。

第三步优化:传入参数映射和动态SQL
问题描述:很多情况下,我们都可以通过在SQL语句中设置占位符来达到使用传入参数的目的,这种方式本身就有一定局限性,它是按照一定顺序传入 参数的,要与占位符一一匹配。但是,如果我们传入的参数是不确定的(比如列表查询,根据用户填写的查询条件不同,传入查询的参数也是不同的,有时是一个参 数、有时可能是三个参数),那么我们就得在后台代码中自己根据请求的传入参数去拼凑相应的SQL语句,这样的话还是避免不了在Java代码里面写SQL语 句的命运。
解决问题:通过专门的SQL解析器来解析SQL语句,SQL语句经过解析后就可以动态的生成符合上下文的SQL语句,同时使用#变量名#表示占位符变量,使用$变量名$表示非占位符变量

第四步优化:结果映射和结果缓存
问题描述:执行SQL语句、获取执行结果、对执行结果进行转换处理、释放相关资源是一整套下来的。假如是执行查询语句,那么执行SQL语句后, 返回的是一个ResultSet结果集,这个时候我们就需要将ResultSet对象的数据取出来,不然等到释放资源时就取不到这些结果信息了。我们从前 面的优化来看,以及将获取连接、设置传入参数、执行SQL语句、释放资源这些都封装起来了,只剩下结果处理这块还没有进行封装,如果能封装起来,每个数据 库操作都不用自己写那么一大堆Java代码,直接调用一个封装的方法就可以搞定了
解决问题:一般对执行结果的有哪些处理,有可能将结果不做任何处理就直接返回,也有可能将结果转换成一个JavaBean对象返回、一个Map 返回、一个List返回等等,结果处理可能是多种多样的。从这里看,我们必须告诉SQL处理器两点:第一,需要返回什么类型的对象;第二,需要返回的对象 的数据结构怎么跟执行的结果映射,这样才能将具体的值copy到对应的数据结构上。

 第五步、缓存优化:key-value内存数据库来缓存处理结果
缓存数据都是key-value的格式,那么这个key怎么来呢?怎么保证唯一呢?即使同一 条SQL语句几次访问的过程中由于传入参数的不同,得到的执行SQL语句也是不同的。那么缓存起来的时候是多对。但是SQL语句和传入参数两部分合起来可 以作为数据缓存的key值。

第六步优化:解决重复SQL语句问题
问题描述:将所有SQL语句都放到配置文件中,这个时候会遇到一个SQL重复的问题,几个功能的SQL语句其实都差不多,有些可能是SELECT后面那段不同、有些可能是WHERE语句不同。有时候表结构改了,那么我们就需要改多个地方,不利于维护。
解决问题:通过将SQL片段模块化,将重复的SQL片段独立成一个SQL块,然后在各个SQL语句引用重复的SQL块,这样需要修改时只需要修改一处即可。
 3)、  优化的总结
对JDBC的优化和封装:
(1) 使用数据库连接池对连接进行管理
(2) SQL语句统一存放到配置文件
(3) SQL语句变量和传入参数的映射以及动态SQL
(4) 动态SQL语句的处理
(5) 对数据库操作结果的映射和结果缓存
(6) SQL语句的重复使用



1 0