从JDBC到Mybatis

##从JDBC到Mybatis ###JDBC操做数据库过程java

  1. 加载JDBC驱动程序员

  2. 创建并获取数据库链接数据库

  3. 建立JDBC Statements对象缓存

  4. 设置SQL语句的传入参数session

  5. 执行SQL语句并获取查询结果数据结构

  6. 对查询结果进行转换处理并将处理结果返回app

  7. 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)模块化

###Mybatis操做数据库过程性能

  1. 从配置文件(一般是XML配置文件中)获得 sessionfactory优化

  2. 由sessionfactory产生session

  3. 在session中完成对数据的增删改查和事务提交等

  4. 用完以后关闭session

备注:在java对象和数据库之间有作mapping的配置文件,也一般是xml文件。

##Mybatis对于JDBC的优化

  • 链接获取和释放

问题描述:

数据库链接频繁的开启和关闭自己就形成了资源的浪费,影响系统的性能。

解决问题:

数据库链接的获取和关闭咱们可使用数据库链接池来解决资源浪费的问题。经过链接池就能够反复利用已经创建的链接去访问数据库了。减小链接的开启和关闭的时间。

问题描述:

当链接池多种多样,可能存在变化,有可能采用DBCP的链接池,也有可能采用容器自己的JNDI数据库链接池。

解决问题:

们能够经过DataSource进行隔离解耦,咱们统一从DataSource里面获取数据库链接,DataSource具体由DBCP实现仍是由容器的JNDI实现均可以,因此咱们将DataSource的具体实现经过让用户配置来应对变化。

  • SQL统一存取

问题描述:

咱们使用JDBC进行操做数据库时,SQL语句基本都散落在各个JAVA类中,这样有三个不足之处: 第一,可读性不好,不利于维护以及作性能调优。 第二,改动Java代码须要从新编译、打包部署。 第三,不利于取出SQL在数据库客户端执行(取出后还得删掉中间的Java代码,编写好的SQL语句写好后还得经过+号在Java进行拼凑)。

解决问题:

咱们能够考虑不把SQL语句写到Java代码中,那么把SQL语句放到哪里呢? (1)首先须要有一个统一存放的地方,咱们能够将这些SQL语句统一集中放到配置文件或者数据库里面(以key-value的格式存放)。 (2)而后经过SQL语句的key值去获取对应的SQL语句。既然咱们将SQL语句都统一放在配置文件或者数据库中,那么这里就涉及一个SQL语句的加载问题。

  • 传入参数映射和动态SQL

问题描述:

不少状况下,咱们均可以经过在SQL语句中设置占位符来达到使用传入参数的目的,这种方式自己就有必定局限性,它是按照必定顺序传入参数的,要与占位符一一匹配。可是,若是咱们传入的参数是不肯定的(好比列表查询,根据用户填写的查询条件不一样,传入查询的参数也是不一样的,有时是一个参数、有时多是三个参数),那么咱们就得在后台代码中本身根据请求的传入参数去拼凑相应的SQL语句,这样的话仍是避免不了在Java代码里面写SQL语句的命运。既然咱们已经把SQL语句统一存放在配置文件或者数据库中了,怎么作到可以根据前台传入参数不一样,动态生成对应的SQL语句呢?

解决问题:

咱们先解决这个动态问题,按照咱们正常的程序员思惟是,经过if和else这类的判断来进行是最直观的,这个时候咱们想到了JSTL中的<if test=””></if>这样的标签,那么,能不能将这类的标签引入到SQL语句中呢?假设能够,那么咱们这里就须要一个专门的SQL解析器来解析这样的SQL语句,可是,if判断的变量来自于哪里呢?传入的值自己是可变的,那么咱们得为这个值定义一个不变的变量名称,并且这个变量名称必须和对应的值要有对应关系,能够经过这个变量名称找到对应的值,这个时候咱们想到了key-value的Map。解析的时候根据变量名的具体值来判断。假如前面能够判断没有问题,那么假如判断的结果是true,那么就须要输出的标签里面的SQL片断,可是怎么解决在标签里面使用变量名称的问题呢?这里咱们须要使用一种有别于SQL的语法来嵌入变量(好比使用#{变量名})。这样,SQL语句通过解析后就能够动态的生成符合上下文的SQL语句。

  1. 结果映射和结果缓存

问题描述:

执行SQL语句、获取执行结果、对执行结果进行转换处理、释放相关资源是一整套下来的。假如是执行查询语句,那么执行SQL语句后,返回的是一个ResultSet结果集,这个时候咱们就须要将ResultSet对象的数据取出来,否则等到释放资源时就取不到这些结果信息了。咱们从前面的优化来看,以及将获取链接、设置传入参数、执行SQL语句、释放资源这些都封装起来了,只剩下结果处理这块尚未进行封装,若是能封装起来,每一个数据库操做都不用本身写那么一大堆Java代码,直接调用一个封装的方法就能够搞定了。

解决问题:

们分析一下,通常对执行结果的有哪些处理,有可能将结果不作任何处理就直接返回,也有可能将结果转换成一个JavaBean对象返回、一个Map返回、一个List返回等等,结果处理多是多种多样的。从这里看,咱们必须告诉SQL处理器两点:第一,须要返回什么类型的对象;第二,须要返回的对象的数据结构怎么跟执行的结果映射,这样才能将具体的值copy到对应的数据结构上。接下来,咱们能够进而考虑对SQL执行结果的缓存来提高性能。缓存数据都是key-value的格式,那么这个key怎么来呢?怎么保证惟一呢?即便同一条SQL语句几回访问的过程当中因为传入参数的不一样,获得的执行SQL语句也是不一样的。那么缓存起来的时候是多对。能够将SQL语句和传入参数两部分合起来能够做为数据缓存的key值。

  1. 解决重复SQL语句问题

问题描述:

因为咱们将全部SQL语句都放到配置文件中,这个时候会遇到一个SQL重复的问题,几个功能的SQL语句其实都差很少,有些多是SELECT后面那段不一样、有些多是WHERE语句不一样。有时候表结构改了,那么咱们就须要改多个地方,不利于维护。

解决问题:

当咱们的代码程序出现重复代码时怎么办?将重复的代码抽离出来成为独立的一个类,而后在各个须要使用的地方进行引用。对于SQL重复的问题,咱们也能够采用这种方式,经过将SQL片断模块化,将重复的SQL片断独立成一个SQL块,而后在各个SQL语句引用重复的SQL块,这样须要修改时只须要修改一处便可。

###优化总结

  1. 使用数据库链接池对链接进行管理

  2. SQL语句统一存放到配置文件

  3. SQL语句变量和传入参数的映射以及动态SQL

  4. 动态SQL语句的处理

  5. 对数据库操做结果的映射和结果缓存

  6. SQL语句的重复

相关文章
相关标签/搜索