Java数据持久层框架 MyBatis之背景知识二

对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html

对于语言的学习而言,马上上手去编程,多多练习是最好的办法。J

一、概述

  iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

  iBATIS框架

  

二、历史变迁

  MyBatis 本是apache的一个开源项目iBatis,

  2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。

  2013年11月迁移到Github。

  

三、背景介绍

  

  MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。

  MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。

  MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

  每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。

  SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

  

  用xml文件构建SqlSessionFactory实例是非常简单的事情。

  推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。

  MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

四、总体流程

  

(1)加载配置并初始化

触发条件:加载配置文件

将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)返回处理结果

  将最终的处理结果返回。

五、功能架构

  

我们把Mybatis的功能架构分为三层:

  (1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

  (2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

  (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或者基本数据类型,并将最终结果返回。

七、快速入门

1.SqlSessionFactoryBuilder

每一个MyBatis的应用程序的入口是SqlSessionFactoryBuilder

它的作用是通过XML配置文件创建Configuration对象(当然也可以在程序中自行创建),

然后通过build方法创建SqlSessionFactory对象。

ps:没有必要每次访问Mybatis就创建一次SqlSessionFactoryBuilder,通常的做法是创建一个全局的对象就可以了。

示例程序如下:

1     private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
2     private static SqlSessionFactory sqlSessionFactory;
3     private static void init() throws IOException {
4         String resource = "mybatis-config.xml";
5         Reader reader = Resources.getResourceAsReader(resource);
6         sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
7         sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);
8     }

2.SqlSessionFactory

SqlSessionFactory对象由SqlSessionFactoryBuilder创建。

它的主要功能是创建SqlSession对象,

和SqlSessionFactoryBuilder对象一样,没有必要每次访问Mybatis就创建一次SqlSessionFactory,通常的做法是创建一个全局的对象就可以了。

SqlSessionFactory对象一个必要的属性是Configuration对象,它是保存Mybatis全局配置的一个配置对象,通常由SqlSessionFactoryBuilder从XML配置文件创建。

这里给出一个简单的示例:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration PUBLIC
 3     "-//mybatis.org//DTD Config 3.0//EN"
 4     "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!-- 配置别名 -->
 7     <typeAliases>
 8         <typeAlias type="org.iMybatis.abc.dao.UserDao" alias="UserDao" />
 9         <typeAlias type="org.iMybatis.abc.dto.UserDto" alias="UserDto" />
10     </typeAliases>
11
12     <!-- 配置环境变量 -->
13     <environments default="development">
14         <environment id="development">
15             <transactionManager type="JDBC" />
16             <dataSource type="POOLED">
17                 <property name="driver" value="com.mysql.jdbc.Driver" />
18                 <property name="url" value="jdbc:mysql://127.0.0.1:3306/iMybatis?characterEncoding=GBK" />
19                 <property name="username" value="iMybatis" />
20                 <property name="password" value="iMybatis" />
21             </dataSource>
22         </environment>
23     </environments>
24
25     <!-- 配置mappers -->
26     <mappers>
27         <mapper resource="org/iMybatis/abc/dao/UserDao.xml" />
28     </mappers>
29
30 </configuration>

要注意XML头部的声明,需要用来验证XML文档正确性。

typeAliases 元素是包含所有typeAlias(别名)的列表,别名用来替换完整类名,这样在需要完整类名的地方就可以用别名来代替。

environment元素体中包含对事务管理和连接池的环境配置。

mappers元素是包含所有mapper(映射器)的列表,这些mapper的XML文件包含SQL代码和映射定义信息。

当然,在XML配置文件中还有很多可以配置的,上面的示例指出的则是最关键的部分,其他配置请参考Mybatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html

3.SqlSession

SqlSession对象的主要功能是完成一次数据库的访问和结果的映射,它类似于数据库的session概念,由于不是线程安全的,所以SqlSession对象的作用域需限制方法内。SqlSession的默认实现类是DefaultSqlSession,它有两个必须配置的属性:Configuration和Executor。

SqlSession对数据库的操作都是通过Executor来完成的。

  到目前为止,我们看到的都是mybatis的流程,我们的应用程序在什么地方插入到这个流程中并获得我们想要的结果呢?就是SqlSession这里。

  SqlSession有一个重要的方法getMapper,顾名思义,这个方式是用来获取Mapper对象的。

  什么是Mapper对象?根据Mybatis的官方手册,应用程序除了要初始并启动Mybatis之外,还需要定义一些接口,接口里定义访问数据库的方法,存放接口的包路径下需要放置同名的XML配置文件。SqlSession的getMapper方法是联系应用程序和Mybatis纽带,应用程序访问getMapper时,Mybatis会根据传入的接口类型和对应的XML配置文件生成一个代理对象,这个代理对象就叫Mapper对象。

  应用程序获得Mapper对象后,就应该通过这个Mapper对象来访问Mybatis的SqlSession对象,这样就达到里插入到Mybatis流程的目的。

  示例代码如下:

  

1     SqlSession session= sqlSessionFactory.openSession();
2     UserDao userDao = session.getMapper(UserDao.class);
3     UserDto user = new UserDto();
4     user.setUsername("iMybatis");
5     List<UserDto> users = userDao.queryUsers(user);

对应的接口:

1 public interface UserDao {
2     public List<UserDto> queryUsers(UserDto user) throws Exception;
3 }

对应的配置文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="org.iMybatis.abc.dao.UserDao">
 4     <select id="queryUsers" parameterType="UserDto" resultType="UserDto"
 5         useCache="false">
 6         <![CDATA[
 7         select * from t_user t where t.username = #{username}
 8         ]]>
 9     </select>
10 </mapper>

4.Executor

Executor对象在创建Configuration对象的时候创建,并且缓存在Configuration对象里。

Executor对象的主要功能是调用StatementHandler访问数据库,并将查询结果存入缓存中(如果配置了缓存的话)。

5.StatementHandler

StatementHandler是真正访问数据库的地方,并调用ResultSetHandler处理查询结果。

6.ResultSetHandler

处理查询结果。

八、动态SQL

  MyBatis 最强大的特性之一就是它的动态语句功能。

  如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。

http://www.mybatis.org/mybatis-3/zh/java-api.html

参考链接:1.http://baike.baidu.com/link?url=PBElzaUry4jFTEuCjDlmjKKe93r0WOVtTdYZRx7mAKcKQMQw1SWkDaQjvJnB_ORUb_mgEyAdmHwe84D__rx7hq

     2.http://blog.csdn.net/hupanfeng/article/details/9068003/

     3.http://www.mybatis.org/mybatis-3/zh/index.html

时间: 2024-11-05 09:56:35

Java数据持久层框架 MyBatis之背景知识二的相关文章

Java数据持久层框架 MyBatis

MyBatis 详细介绍 MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的 JPetStore实例. 源码来源:minglisoft.cn/technology

优秀的持久层框架Mybatis,连接数据库快人一步

我们之前学习了JDBC和连接池之后,攻城狮们对编程的效率仍然不是很满意.于是乎!有了今天更加优秀的内容,那就是Mybatis框架.它的出现解决了jdbc中的一些问题,提升了代码的鲁棒性.我们一起来看一下吧~ Mybatis介绍 Mybatis是在2010年由阿帕奇下的开源项目ibatis迁移到谷歌codde后,更改为mybatis. 这是一个十分好用的持久层的框架,我们能过通过这种框架实现对jdbc操作的数据库进行封装,我们只需要关心我们数据库SQL本身就可以了,不用麻烦的去注册驱动,连接数据库

java持久层框架mybatis如何防止sql注入

sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=’1’”这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这

Hibernate: 数据持久层框架

Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有.基于LGPL V2.1协议发布. 它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来.无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate. Hibernate不仅负

数据持久层框架iBatis, Hibernate 与 JPA 比较

在本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persistence API(JPA).我们介绍每种解决方案并讨论其所规定的品质,以及在广泛的应用场景中其各自的长处和缺点.然后我们会基于诸如性能.移植性.复杂性以及对数据模型改变的适应性等因素来比较iBATIS.Hibernate和JPA. 如果你是一个刚起步的Java程序员,新接触持久性概念的话,那么就把阅读此文当作是接受一次这一主题以及大部分流行的开源持久性解决方案的启蒙.如果你对这

第六作业 持久层框架mybatis小记

1.mybatis和Hibernate的比较 首先Mybatis和Hibernate相比的优点是动态SQL,轻量级的框架.在整合其他框架的时候可以省去Dao的实现.轻量级,动态SQL,省去Dao层的实现,使Mybatis比较受欢迎. 2.Myeclipse使用数据库表生成实体类和映射文件需要应如相关的jar包,配置Mybatis启动的时候加载相应的jar包路径. a.首先下载相应的jar包到本地放到Myeclipse的安装目录下 新建一个文件放Myeclipse启动时加载的路径 打开添加加载的路

MyBatis持久层框架使用总结

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2013年11月迁移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Dat

MyBatis持久层框架使用总结 转载

MyBatis持久层框架使用总结 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2013年11月迁移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久

Rexdb:高性能的数据持久层(ORM)框架

Rexdb是一款使用Java语言编写的,开放源代码的数据持久层框架(腾云科技ty300.com).提供了查询.更新.批处理.调用.(JTA)事务.数据源管理等功能,可以取代Mybatis.Hibernate作为系统的核心ORM框架(基础教程qkxue.net). Rexdb提供了工具类风格的接口,不需要编写映射配置,使用简便:同时,它还具备同类框架中最高效的执行效率. Rexdb的某次性能测试结果为:查询性能是Hibernate的2.3倍,Mybatis的1.7倍.