Mybatis教程及使用配置

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Mybatis教程及使用配置2013-11-22|所属分类:Mybatis教程入门配置12_17一.Mybatis简介MyBatis由ClintonBegin在2002年创建,其后,捐献给了Apache基金会,成立了iBatis项目。2010年5月,将代码库迁至GoogleCode,并更名为MyBatis。MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis只使用简单的XML和注解来配置和映射基本数据类型、Map接口和POJO到数据库记录。相对Hibernate和ApacheOJB等“一站式”ORM解决方案而言,Mybatis是一种“半自动化”的ORM实现。二.从JDBC到Mybatis1.JDBC查询数据库数据,一般需要以下七个步骤:(1)加载JDBC驱动(2)建立并获取数据库连接(3)创建JDBCStatements对象(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到对应的数据结构上。接下来,我们可以进而考虑对SQL执行结果的缓存来提升性能。缓存数据都是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.总体流程(1)加载配置并初始化触发条件:加载配置文件配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。(2)接收调用请求触发条件:调用Mybatis提供的API传入参数:为SQL的ID和传入参数对象处理过程:将请求传递给下层的请求处理层进行处理。(3)处理操作请求触发条件:API接口层传递请求过来传入参数:为SQL的ID和传入参数对象处理过程:(A)根据SQL的ID查找对应的MappedStatement对象。(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。(E)释放连接资源。(4)返回结果处理将最终的处理结果返回2.功能架构设计把Mybatis的功能架构分为三层:(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。3.框架架构设计框架架构讲解:(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。(3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。四.Mybatis入门每一个Mybatis应该都是以一个SqlSessionFactory实例为中心的,一个SqlSessionFactory实例都可以使用SqlSessionFactoryBuilder来创造。从配置类中创造的定制SqlSessionFactoryBuilder实例,可以使用XML配置文件来生成一个SqlSessionFactory实例。1.从xml中创造SqlSessionFactoryMyBatis有一个Resources通用类,类中有许多方法可以简单地从类路径和其他地址中加载资源。Stringresource=org/mybatis/example/Configuration.xml;Readerreader=Resources.getResourceAsReader(resource);sqlMapper=newSqlSessionFactoryBuilder().build(reader);XML文件包含了许多MyBatis的核心设置,包括一个获取数据库连接(Connection)实例的数据源(DataSource),一个决定事务作用域和操作的TransactionManager。全部的XML配置文件的内容将在以后提到,先给出一个简单的样子。?xmlversion=1.0encoding=UTF-8?!DOCTYPEconfigurationPUBLIC-//mybatis.org//DTDConfig3.0//EN=developmentenvironmentid=developmenttransactionManagertype=JDBC/dataSourcetype=POOLEDpropertyname=drivervalue=${driver}/propertyname=urlvalue=${url}/propertyname=usernamevalue=${username}/propertyname=passwordvalue=${password}//dataSource/environment/environmentsmappersmapperresource=org/mybatis/example/XXMapper.xml//mappers/configuration2.不使用xml文件新建SqlSessionFactoryDataSourcedataSource=DataSourceFactory.getDataSource();TransactionFactorytransactionFactory=newJdbcTransactionFactory();Environmentenvironment=newEnvironment(development,transactionFactory,dataSource);Configurationconfiguration=newConfiguration(environment);configuration.addMapper(XXMapper.class);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(configuration);3.使用SqlSessionFactory获取SqlSession通过一个SqlSessionFactory,就可以获取一个SqlSession实例,SqlSession包含了针对数据库执行语句的每一个方法,直接使用SqlSes

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功