ibatis 教程 详解
ibatis调用存储过程

iBatis调用存储过程1. 什么是iBatisiBatis是一种持久层框架,用于简化Java应用程序与关系型数据库之间的交互。
它提供了一种简单的方式来执行数据库操作,使开发人员能够更加专注于业务逻辑的实现,而无需过多关注底层数据库的细节。
2. 存储过程的概念存储过程是一组预定义的SQL语句集合,被存储在数据库中并可以通过名称进行调用。
存储过程可以接受参数,并可以返回结果集或输出参数。
它提供了一种封装和重用SQL代码的方式,提高了数据库的性能和安全性。
3. iBatis调用存储过程的步骤使用iBatis调用存储过程需要以下步骤:3.1 配置数据源首先,需要在iBatis的配置文件中配置数据库连接信息,包括数据库的URL、用户名、密码等。
这样iBatis才能够连接到数据库。
3.2 定义存储过程的映射在iBatis的映射文件中,需要定义存储过程的映射关系。
这包括存储过程的名称、参数列表、以及结果集的映射方式等。
3.3 调用存储过程在Java代码中,可以使用iBatis提供的API来调用存储过程。
首先,需要获取一个iBatis的SqlMapClient对象,然后通过该对象来执行存储过程的调用。
// 获取SqlMapClient对象SqlMapClient sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);// 调用存储过程sqlMapClient.queryForObject("proc_get_user", parameterObject);3.4 处理存储过程的结果在执行存储过程之后,可以通过返回的结果对象来获取存储过程的执行结果。
根据存储过程的定义,可能会返回一个结果集或者输出参数。
// 获取存储过程的执行结果ResultObject result = (ResultObject) sqlMapClient.queryForObject("proc_get_user", parameterObject);// 处理结果...4. 示例:调用存储过程获取用户信息下面以一个示例来说明如何使用iBatis调用存储过程来获取用户信息。
iBATIS教程

2.2 XML配置--SqlMap XML配置-配置--SqlMap
parameterMap
输入值的映射,里面的参数是对应的POJO类的属性.class=“person ..这个 输入值的映射,里面的参数是对应的POJO类的属性.class= person ..这个 POJO类的属性.class= person”.. 是所对应的POJO类的别名.是在typeAlias POJO类的别名 是所对应的POJO类的别名.是在typeAlias 中定义的
2.1
2.实际操作
1. MVC三层架构 MVC三层架构 2. XML配置 3. 方法调用
2.1.MVC三层架构 MVC三层架构
个人理解的MVC及分包
Web目录为为视图层 目录为为视图层(V) 1. Web目录为为视图层(V) Com.nstek. com.nstek. 2. Com.nstek.interfaces 和 com.nstek.dao 属于业务逻辑层 3. 控制层不明显,后面详细说明 控制层不明显, Com.nstek.util. 4. Com.nstek.util.*下为本工程的实用工具 包 , 在本工程中主要是存放对数据库进行 连接的类, 连接的类 , 和连接数据库所需要的配置文 件 Com.nstek.entity此包下存放的是POJO类 此包下存放的是POJO 5. Com.nstek.entity此包下存放的是POJO类 持久化类)这是iBATIS所控制的持久化层, iBATIS所控制的持久化层 (持久化类)这是iBATIS所控制的持久化层, 是在业务逻辑层是基础上细分出的一层 Com.nstek.xml存放的是iBATIS的XML配置 存放的是iBATIS 6. Com.nstek.xml存放的是iBATIS的XML配置 文件
【推荐下载】ibatis学习之道:iBatis简单入门教程

ibatis 学习之道:iBatis 简单入门教程iBatis 简介:iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。
如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。
官网为:mybatis/搭建iBatis 开发环境:1、导入相关的jar 包,ibatis-2.3.0.677.jar、mysql-connector-java-5.1.6-bin.jar2、编写配置文件:Jdbc 连接的属性文件总配置文件,SqlMapConfig.xml关于每个实体的映射文件(Map 文件)Demo:Student.java:publicclassStudent { // 注意这里需要保证有一个无参构造方法,因为包括Hibernate 在内的映射都是使用反射的,如果没有无参构造可能会出现问题privateintid; privateString name; privateDate birth; privatefloatscore; publicintgetId() { returnid; publicvoidsetId(intid) { this.id = id; publicString getName() { returnname; publicvoidsetName(String name) { = name; publicDate getBirth() { returnbirth; publicvoidsetBirth(Date birth) { this.birth = birth; publicfloatgetScore() { returnscore; publicvoidsetScore(floatscore) { this.score = score; @Override publicString toString() { return”id=“+id +”\tname=“+name +”\tmajor=“+birth +”\tscore=“+ score +”\n”;?xmlversion=“1.0”encoding=“UTF-8”?!DOCTYPE sqlMap PUBLIC “-//ibatis.apache//DTD SQL Map 2.0//EN”“ibatis.apache/dtd/sql-map-2.dtd”sqlMap !--。
iBatis详细使用手册(.net版)

目录系列(1) 总览 (2)系列(2) 配置运行环境和日志处理 (4)系列(3) 映射文件基础 (11)系列(4) iBatisNet API基础 (14)系列(5) ParameterMap (19)系列(6) ResultMap (23)系列(1) 总览学习和使用Ibatisnet已经有一段时间了,前段时间也有写过一些与iBatis相关的Blog。
也答应过一些朋友要比较全面地介绍一下iBatis,分享自己的学习过程和使用经验,记录一些常见且容易出现的问题。
但由于前段时间一直在准备考试,而且当前的项目时间进度也比较紧,所以一直迟迟未能开始,在这里表示歉意,希望现在开始不会晚。
不过最近社区(博客园)好消息不断,我发现越来越多的人开始关注iBatis了,并且也有热心网友在极力推广,如果您已经对它已经有一些了解了,那么更推荐您去阅读ShanYou的文章,他写的文章可能更加适合您。
我本人也是一名初学者,这里记录的一些东西可能不会有很多的理论知识(理论知识还不够扎实),更多的可能是突出自己学习过程中需要很长时间来解决的一些问题,或者是个人认为特别重要,并且容易忘记的细节。
水平有限,出现错误在所难免,如在这过程中不当之处敬请愿谅,并请不啬赐教。
废话一翻后,进入今天的正题。
今天的主题是Introduction,非官方正式介绍的中文版,更多详细的介绍请参阅官方文档。
我们要使用它就必须要知道它是干什么用的,能为我们做哪些工作,开发效率如何,执行效率如何,技术难度怎么样。
提到iBatis,大家可能会与ORM技术联系起来。
是的,没错,它与ORM技术有一定程度上的联系,但是更确切地讲,它并不是一种很正统的ORM解决方案。
因为它不像NHi bernate那样,具备全自动的数据操作,包括查询,插入,更新,删除;也没有像它那样,与数据库的约束关系有紧密的联系(对NHibernate的了解不多,如果有不妥之处,希望能留下你们的臭鸡蛋,等着下回用)。
ibatis 缓存 (cacheModel)详解

ibatis 缓存(cacheModel)详解cacheModel的属性值等于指定的cacheModel元素的name 属性值。
属性cacheModel定义查询mapped statement 的缓存。
每一个查询mapped statement 可以使用不同或相同的cacheModel,以下给出个例子。
<cacheModel id="product-cache" imlementation="LRU"(或type ="LRU")[readOnly=“true” serialize=“false”]> // [ ] 表示可选<flushInterval hours="24"/><flushOnExecute statement="insertProduct"/><flushOnExecute statement="updateProduct"/><flushOnExecute statement="deleteProduct"/><property name="size" value="1000" /></cacheModel><statement id="getPoductList"parameerClass="int" cacheModel="product-cache">select * from PRODUCT where PRD_CAT_ID = #value#</statement>// 使用“近期最少使用”(LRU)实现// 上面例子中,“getProductList”的缓存每24 小时刷新一次,或当更新的操作发生时刷新。
ibaties 动态sql 解析

ibaties 动态sql 解析iBATIS (现在已经更名为MyBatis) 是一款流行的Java 持久化框架,具有强大的动态SQL 解析功能。
动态SQL 在开发过程中经常用到,它允许我们创建灵活的SQL 查询,根据不同的条件生成不同的SQL 语句。
本文将以"iBATIS 动态SQL 解析" 为主题,详细介绍如何使用iBATIS 动态SQL 解析功能进行动态SQL 查询。
第一步: 环境准备在开始使用iBATIS 的动态SQL 解析功能之前,首先需要准备开发环境。
我们需要安装Java JDK 和一个Java 开发环境,例如Eclipse 或者IntelliJ IDEA。
另外,还需要在项目中引入iBATIS 的相关依赖库。
第二步: 配置数据源和iBATIS在准备好开发环境后,接下来需要配置数据源和iBATIS。
首先,我们需要连接到数据库,可以选择MySQL、Oracle 或者其他主流的数据库。
在项目中,可以通过配置数据源的方式连接到数据库。
接下来,需要在项目中引入iBATIS 的配置文件,通常命名为"SqlMapConfig.xml"。
在该配置文件中,我们需要配置数据库连接信息、iBATIS 的相关设置以及动态SQL 查询语句的配置。
第三步: 创建实体类和映射文件在配置好数据源和iBATIS 后,接下来需要创建实体类和映射文件。
实体类是与数据库中的表对应的Java 类,我们需要定义实体类的属性和相应的getter 和setter 方法。
映射文件是iBATIS 中的核心组件,用于描述数据库表和实体类之间的映射关系。
在映射文件中,我们需要定义SQL 查询语句,包括静态SQL 和动态SQL。
其中,动态SQL 部分使用iBATIS 的"动态SQL 标签" 实现。
第四步: 使用动态SQL在准备好实体类和映射文件后,我们可以开始使用iBATIS 的动态SQL 功能。
ibatis 传递集合参数

ibatis 传递集合参数Ibatis是一种数据持久化框架,它与Hibernate和Mybatis类似。
Ibatis强调SQL语句的重要性,并提供实现与数据库进行数据交互的方案。
在使用ibatis时,如果我们需要传递多个参数,集合参数是一个很有用的功能。
本文将详细阐述如何在ibatis中传递集合参数。
第一步,定义SQL查询语句,包括where语句和动态参数。
例如,我们需要查询某一项数据集合,将会使用如下SQL语句:SELECT id, name, age FROM user WHERE age > ?在这个查询语句中,我们定义了一个参数age,其值将在运行时动态地传递给SQL查询。
下面将介绍如何使用ibatis传递集合参数:第二步,定义集合参数类型。
在ibatis中,支持两种集合参数类型:java.util.List和java.util.Map。
如果我们选择使用List类型作为集合参数类型,那么我们需要在查询语句中使用in关键字。
如下所示:SELECT id, name, age FROM user WHERE age IN(:ageList)其中,ageList是一个List类型的集合参数。
与此类似的,如果我们需要使用Map类型作为集合参数类型,那么我们需要在查询语句中使用foreach关键字。
示例如下:SELECT id, name, age FROM user WHERE age IN<foreach collection="ageMap" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>其中,ageMap代表一个Map类型的集合参数。
遍历ageMap集合的过程中,index代表当前Map对象的键,item表示当前Map对象的值。
Ibatis操作Mysql数据库含存储过程-22页word资料

显示数据库所有数据iBatis是个像Hibernate, JDO,EJB一类的数据持久框架,它能将对象映射为SQL 语句.它是个轻量级的框架并且持久性API适合持久化POJO.iBatis也与Hibernate, JDO不同,因为它使用存储过程和现有的SQL来处理数据库.本节我们将向你讲述如何配置iBatis来运行一个小型程序.既然一次性将所有知识全部解释很难,我们索性把本教程分为几个单独的例子来陈述.该例是关于如何从数据库读取数据并将结果显示在你的命令提示符上.在第二个例子中你将学习如何添加更多的数据到数据库中,在此之后的第三个例子将会向你展示如何通过iBatis从记录中删除数据.现在的第一个例子将会向你展示如何从数据库中读取记录,我们需要一个数据库来执行查询,所以我们使用MySQL5.0作为这个例子的数据库.这里我们将要检索一些人的contact的信息, contact的表结构给出如下 :根据Contact表我们需要创建一个POJO类,在我们的例子中,数据库vin有一个表Contact,包括四个字段 :∙id∙firstName∙lastName∙emailContact.java为了映射配置我们需要创建SqlMapConfig.xml来指定如下信息 : •针对映射语句的命名空间前缀•我们的数据库将使用JDBC来进行访问•针对MySQL的JDBC驱动为" com.mysql.jdbc.Driver"•连接URL为"jdbc:mysql://192.168.10.112:3306/vin"•用户名与密码分别为"root"和"root"•我们的SQL语句描述在"Contact.xml"SqlMapConfig.xml映射文件在下面给出,它主要负责为我们的程序执行SQL查询. Contact.xml的代码如下 :现在为了显示数据库中的数据我们需要创建一个类----IbatisExample,它从SqlMapConfig.xml中读取配置并在你的控制台输出所有数据. IbatisExample.java的代码如下 :为了运行该例,你需要遵循如下步骤 :•在你的MySQL数据库中创建表Contact•下载iBatis的JAR文件(ibatis-common-2.jar,ibatis-dao-2.jar,ib atis-sqlmap-2.jar),并将其放置在你的lib目录中•设置类路径•创建Contact.java将其编译•创建Contact.java•创建SqlMapConfig.xml•创建IbatisExample.java并将其编译•执行IbatisExample文件输出 :你的命令提示符应该有像这样的输出 :2.向数据库插入数据iBatis最棒的特点就是它的简洁,这也是唯一令它在任何数据库程序中更容易使用的原因.iBatis使得通过Java或者任何其它的Microsoft的程序来使用数据库变得非常简单.本章我们将会通过一个例子向你介绍如何向数据库插入一行数据.我们使用MySQL作为本例的数据库,和我们上一章中使用的是一样的.这是"Contact"表和我们上一章使用过的两个文件:"Contact.java"和"SqlMapC onfig.xml"Contact.javaSqlMapConfig.xml我们使用<insert>标签来映射SQL语句,在该标签中我们定义了一个"id",它将上面的代码意味着表中被插入数据的下一行.Contact.xml如何执行本例 :1.创建Contact.java并将其编译2.创建Contact.xml和SqlMapConfig.xml3.创建IbatisInsertion.java4.执行IbatisInsertion类文件,结果将在你的命令提示符上输出如下 : "Record Inserted Successfully"输出 :3.iBatis删除操作教程我希望通过上面的例子,你能完全懂得如何向数据库执行插入或者查询操作.所以在本例中你将学习到如何通过iBatis在数据库中删除数据.所以你需要分析代码并清楚的理解在这些代码里到底发生了什么.然而你绝对不需要再创建一个不同的数据库,虽然你知道我们使用上一个MySQL作为数据库而且你已经知道了我们的表名是Contact.但你可以选择是使用这个数据库还是再创建一个,这都由你决定!你唯一需要确定的就是你定义的表名是正确的,否则将会产生Bug.如果你从本iBatis教程的开始学下来的,那么你是不需要修改代码的.仅仅将给定的代码拷贝到文件夹并执行,最终删除数据库表中的数据.正如我之前提到的,在iBatis的本章,我们将要从Ctract表中删除记录,我们使用MySQL的数据库"vin"我们的Contact.java和SqlMapConfig.xm与上一个例子中的是一样的. Contact.javaSqlMapConfig.xml上面几行代码删除了Contract表中的所有记录,这里定义的id"deleteAll"会在以后在IbatisDeletion类中执行数据库的查询操作.Contact.xml我们需要引入下面的包 :com.ibatismon.resourcescom.ibatis.sqlmap.client上面的代码能从"SqlMapConfig.xml"中读取配置信息, IbatisDeletion.java的代码如下 :IbatisDeletion.java按照如下步骤执行本例 :创建Contact.xml和SqlMapConfig.xml创建Contract.java并将其编译创建IbatisDeletion.java并将其编译执行IbatisDeletion你将会在你的命令提示符中得到如下输出 :4.更新表中的数据对任何数据库程序来说,添加,更新,删除都是十分常见且必要的特性.在该教程里我们已经讲解了使用iBatis在Java中进行插入和删除操作,现在本章将讲述如何使用iBatis在数据表中更新数据.在iBatis中执行一条更新语句是非常简单的.为了更新数据你得在SQL映射文件"Contact.xml"中添加SQL的update 语句.iBatis更新语句例子 :Contact.javaSqlMapConfig.xmliBatis更新查询在我们的例子中,我们通过参数中指定的id更新了表中的数据,因此对于"id"我们将"parameterClass"的属性值分配为"long".Contact.xml现在我们可以在Java程序中通过如下代码执行更新操作了 :sqlMap.update("Contact.updateById",contactId);IbatisUpdate.java代码如下 :为了执行update的例子,遵照如下步骤 : 创建Contact.java和SqlMapConfig.xml 编译Contact.java创建Contact.xml创建IbatisUpdate.java并将其编译执行IbatisUpdate类文件,你会得到如下输出 :5.iBatis ResultMap例子如果你使用iBatis的Result Map来工作,那么你一定知道iBatis的Result Map 是用来提供数据库查询结果和它的对象属性之间的映射的,这是iBatis最常见且重要的特性了.本章仅是一个ResultMap的简单介绍.我们的Contact.java and SqlMapConfig.xml文件和我们的上一个例子是一样的,没有任何变化. Contact POJO的代码如下 :Contact.javaSqlMapConfig.xml要想使用ResultMap我们得使用<resultMap></resultMap>标签.它由一个id 组成,该id需要在<select>标签下的resultMap属性中运行resultMap.这是为了执行resultMap例子,我们需要将下面的Java代码引入进来. sqlMap.queryForObject("Contact.getById",new Integer(1)); 这里我们传递值为1的id来显示所有该id的信息. IbatisResultMap.java为了运行该程序 :创建Contact.xml和SqlMapConfig.xml创建并编译Contact.java创建并编译IbatisResultMap.java在执行IbatisResultMap类文件的时候,该id的所有信息将会显示出来 : 6.iBatis存储过程例子正如你在本教程上面部分看到的,通过iBatis我们可以在数据库表中执行内嵌的insert , delete, update SQL命令.本例中你将看到如何在iBatis中调用存储过程.就像我在上一个例子中提到的,我们使用MySQL数据库,并且使用和上一个例子中一样的Contact表.我们在数据库"vin"中创建了一个叫showData()的存储过程,它将显示Contract表中的所有的contact信息.为了创建存储过程,我们打开MySQL并创"Contact.java"和"SqlMapConfig.xml"与上一个例子中的是一样的 :Contact.javaSqlMapConfig.xml上面几行代码调用了存储过程并集合了contract表.下面是Contact.xml的代现在我们可以这样调用存储过程 :sqlMap.queryForList("Contact.storedInfo",null); "sqlMap"是请依照如下步骤执行本例 :创建Contact.xml和SqlMapConfig.xml创建Contact.java并将其编译创建IbatisStoredProcedure.java并将其编译执行IbatisStoredProcedure类文件,所有的Contract信息将在你的命令提示符下显示 :。
ibatis教程简介

ibatis教程简介为什么要使用Ibatis?在系统的开发过程中,你可能碰到如下一些问题:什么是Ibatis?半自动化ORM框架相对于Hiberna te等“一站式”ORM框架,Ibatis是一种“半自动化”的ORM 框架实现。
也就是说,ORM概念中,Ibatis只强调O/R部分的内容,而将M(mapping)这部分概念进行了淡化。
因为它将对于SQL语句的操作权,最终交还给了程序员。
上面提到的“半自动化”这个概念可能大家理解起来比较生涩,通过我们对Hibernate 或EJB3的了解,可以发现在它们都是针对POJO到数据库提供了一种较为完整的封装。
程序只需要对POJO进行操作,就达到操作数据库持久层的目的,我们程序员对SQL语句都不需要太多的了解,因为Hibrenate会根椐POJO的映射关系生成对应的SQL语句,最终调用JDBC完成操作。
大部分情况,Hibernate这种操作机制无往不利,但是在特定的情况下,这种“一站式”的解决方案却不见得灵光。
我们来思考在开发过程中的一些问题:什么是Ibatis?使用Ibatis解决前述问题使用“半自动化”化的Ibatis框架,可以解决前面系统开发过程中存在的问题。
针对Hibernate在POJO与数据库之间建立映射,以及自动生成SQL并执行的过程,Ibatis着力点,则在于POJO与SQL语句之间的映射。
也就是说,Ibatis在运行过程中不会自动生成SQL语句执行,具体的SQL语句由程序员编写,然后通过映射配置文件,将SQL语句所需的参数,获得的返回结果字段映射到指定的POJO。
使用Ibatis提供的ORM机制,在业务逻辑层实现人员而言,操作的是JAVA对象,这一层面与Hibernate机制中一样的。
对于具体的数据库操作,Hibernate会自动生成SQL并执行,而Ibatis要求开发人员具体编写SQL语句。
Ibatis通过在数据库移植性和SQL开发工作量上面做出了让步,换来了为系统设计更多的灵活性和自由空间。
iBatis_dotNET基础教程_上册

的SQL映射
14
如何工作
实例:
A sample SQL mapping descriptor <select id="getAddress" parameterClass="int" resultClass="Address"> SELECT ADR_ID as id, ADR_DESCRIPTION as description, ADR_STREET as street, ADR_CITY as city, ADR_PROVINCE as province, ADR_POSTAL_CODE as postalCode FROM ADDRESS WHERE ADR_ID = #id# </select> Java Code: Address address = (Address) sqlMap.queryForObject("getAddress",new Integer(5)); .net Code: Address address = (Address) sqlMap.QueryForObject("getAddress", 5);
11
SQL Maps介绍
• SQL Maps使用一个简单的XML文件来实现从 实体到SQL statements的映射 • SQL Map API允许程序员很简单的把DOTNET 对象映射到PreparedStatement参数或者 ResultMap • SQL Maps的机制很简单,提供一个框架, 来实现用20%的代码来实现80% 的 功能
6
iBATIS简介
iBATIS是一个持久层框架
7
为何使用
ibatis简单应用培训

Ibatis2简单应用培训一、ibatis简单介绍一个ORM解决方案,iBATIS最大的特点就是小巧,上手很快。
使用iBATIS提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibernate实现ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL 语句,而iBATIS 则要求开发者编写具体的SQL语句。
相对Hibernate等“全自动”ORM机制而言,iBATIS 以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间二、环境搭建与配置1.依赖环境与对应配置i.使用JDBC的方式连接数据库,最简单的环境只需JDK及数据库驱动;配置文件SmlMapConfig.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE sqlMapConfig PUBLIC "-////DTD SQL Map Config 2.0//EN" "/dtd/sql-map-config-2.dtd"><sqlMapConfig><settings cacheModelsEnabled="true" enhancementEnabled="true"maxSessions="64" maxTransactions="16" maxRequests="128"useStatementNamespaces="true" /><prop erties resource="jdbc.properties"/><transactionManager type="JDBC"><dataSource type="JDBC"><property name="JDBC.Driver" value="${jdbc.driverClassName}"/><property name="JDBC.ConnectionURL" value="${jdbc.url}"/><property name="ername" value="${ername}"/><property name="JDBC.Password" value="${jdbc.password}"/></dataSource></transactionManager><sqlMap resource="cn/test/dao/impl/ibatis/maps/oracle/sqlMap_corpdepart.xml"/></sqlMapConfig>ii.使用DBCP来管理连接池,所需JAR包如下:配置文件SmlMapConfig.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE sqlMapConfig PUBLIC "-////DTD SQL Map Config 2.0//EN" "/dtd/sql-map-config-2.dtd"><sqlMapConfig><settings cacheModelsEnabled="true" enhancementEnabled="true"maxSessions="64" maxTransactions="16" maxRequests="128"useStatementNamespaces="true" /><prop erties resource="jdbc.properties"/><transactionManager type="JDBC"><dataSource type="DBCP"><property name="JDBC.Driver" value="${jdbc.driverClassName}"/><property name="JDBC.ConnectionURL" value="${jdbc.url}"/><property name="ername" value="${ername}"/><property name="JDBC.Password" value="${jdbc.password}"/></dataSource></transactionManager><sqlMap resource="cn/test/dao/impl/ibatis/maps/oracle/sqlMap_corpdepart.xml"/></sqlMapConfig>iii.ISS系统环境,所需JAR包如下:Spring相关配置appContext-common.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""/dtd/spring-beans.dtd"><beans><bean id="ResourceConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:server.properties</value></list></property></bean><bean id="dataSource"class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"> <property name="targetDataSource"><bean class="mons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName"value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${ername}" /><property name="password" value="${jdbc.password}" /></bean></property></bean><bean id="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation"><value>classpath:/conf/sqlmap/sqlMapConfig-oracle.xml</value></property><property name="dataSource" ref="dataSource" /></bean><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"><ref local="dataSource" /></property></bean><bean id="_transactionInterceptor"class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /><property name="transactionAttributes"><props><prop key="insert*">PROPAGATION_REQUIRED,-Throwable</prop><prop key="update*">PROPAGATION_REQUIRED,-Throwable</prop><prop key="delete*">PROPAGATION_REQUIRED,-Throwable</prop><prop key="create*">PROPAGATION_REQUIRED,-Throwable</prop><prop key="save*">PROPAGATION_REQUIRED,-Throwable</prop><prop key="remove*">PROPAGATION_REQUIRED,-Throwable</prop><prop key="edit*">PROPAGATION_REQUIRED,-Throwable</prop></props></property></bean><!-- 自动代理配置,事务和业务并行,支持嵌套事务 --><bean id="BeanNameAutoProxyCreator"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"><value>*Logic</value></property><property name="interceptorNames"><list><value>_transactionInterceptor</value></list></property></bean><bean id="_baseSqlMapClientTarget" abstract="true"><property name="sqlMapClient"><ref bean="sqlMapClient" /></property></bean></beans>配置文件SqlMapConfig.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE sqlMapConfig PUBLIC "-////DTD SQL Map Config 2.0//EN" "/dtd/sql-map-config-2.dtd"><sqlMapConfig><settings cacheModelsEnabled="true" enhancementEnabled="true"maxSessions="64" maxTransactions="16" maxRequests="128"useStatementNamespaces="true" /><sqlMap resource="cn/test/dao/impl/ibatis/maps/oracle/sqlMap_corpdepart.xml"/></sqlMapConfig>三、配置详解1.SqlMapConfig标签<properties>引用属性文件引用属性文件,引用后用EL表达式取属性文件中的值<settings>连接参数设置maxRequests 最大请求数,不能小于maxSession和maxTransaction,512 maxSession 最大的会话,128maxTransactions最大事,32cacheModelsEnabled 启用缓存,truelazyLoadingEnable 延迟加载,trueenhancementEnable 增强模式,需要cglib支持,trueuseStatementNamesapces 使用命名空间,false<resultObjectFactory>对象生成工厂默认使用内部机制class.newInstance(),所以返回的对象要求有无参的构造方法,否则会报错<transactionManager>事务管理器JDBC 普通的JDBC事务管理器JTA 基于容器的事务管理器,企业级的容器中使用EXTERNAL外部的事务管理器,管理事务的是应用程序,而不是iBATIS<dataSource>数据源SIMPLE简单的数据源工厂,配制简单数据连接池的数据源DBCP Apache的DBCP连接池JNDI JNDI目录服务器,基于容器级的开发<typeHandler>特定类型转换器2.2及以后版本中可转换大部分数据库类型,所以此标签基本被废除了<sqlMap>实体映射resource 用于指定本地的映射文件url 指定远程分布式系统中的映射文件2.SqlMap标签详解namespace命名空间<typeAlias>类别名用别名取代包含包名的类命名Ibatis内置类别名别名类型事务管理器型类JDBC com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig JTA com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfigEXTERNAL com.ibatis.sqlmap.engine.transaction.external. ExternalTransactionConfig数据类型string ng.Stringbyte ng.Bytelong ng.Longshort ng.Shortint ng.Integerinteger ng.Integerdouble ng.Doublefloat ng.Floatboolean ng.Booleandate java.util.Datedecimal java.math.BigDecimalobject ng.Objectmap java.util.Maphashmap java.util.HashMaplist java.util.Listarraylist java.util.ArrayListcollection java.util.Collectioniterator java.util.Iterator数据源工厂类型SIMPLE com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory DBCP com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory JNDI com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory 高速缓存控制器类型FIFO com.ibatis.sqlmap.engine.cache.fifo.FifoCacheController LRU com.ibatis.sqlmap.engine.cache.lru.LruCacheController MEMORY com.ibatis.sqlmap.engine.cache.memory.MemoryCacheController OSCACHE com.ibatis.sqlmap.engine.cache.oscache.OSCacheController XML结果类型Dom com.ibatis.sqlmap.engine.type.DomTypeMarkerdomCollection com.ibatis.sqlmap.engine.type.DomCollectionTypeMarkerXml com.ibatis.sqlmap.engine.type.XmlTypeMarkerXmlCollection com.ibatis.sqlmap.engine.type.XmlCollectionTypeMarker<resultMap>返回类型显示映射关系SQL字段与类属性映射关系<resultMap class="corpdepart" id="simpleMap"><result property="depName" column="depName" /><result property="depCode" column="depCode" /></resultMap><parametMap>参数类型外联映射关系SQL字段类型与类属性映射关系,在SQL语句中用?占位符<parametertMap class="corpdepart" id="simpleMap"><parameter property="depName" jdbcType=="VARCHAR" /><parameter property="depCode" jdbcType==" VARCHAR " /></resultMap><selectKey>自动生成键生成方式与数据库有关,MySQL、MS-SQL等先插入数据再获取主键,Oracle等先查出系列的nextVal,再插入数据·Oracle系列值<insert id="insertAccount" parameterClass="Account"><selectKey resultClass="int" keyProperty="id">select sequence.nextVal from dual</selectKey>insert into ACCOUNT (ACC_ID,ACC_FIRST_NAME,ACC_LAST_NAME,ACC_EMAIL)values (#id#, #firstName#, #lastName#, #emailAddress#)</insert>· MySQL自动增长值<insert id="insertAccount" parameterClass="Account">insert into ACCOUNT (ACC_FIRST_NAME,ACC_LAST_NAME,ACC_EMAIL)values (#firstName#, #lastName#, #emailAddress#)<selectKey>select @@IDENTITY as id</selectKey></insert><select>查询属性:id 指定名称parameterClass 参数类型,类的别名或全名parameterMap 传入参数的显示映射resultClass 返回类型,类的别名或全名resultMap 返回类型的显示映射cacheModel 缓存模式resultSetType 结果集类型,如游标的类型只能往前fetchSize 预取回指定大小的数据xmlResultName 当resulClass值为xml时在此指定XML文件的根标签remapResults 如果返回的字段不确定,将此属性设为true 如:select * from $table$ 或select $fields$ from tabletimeout 超时<insert>插入<update> 更新<delete> 删除<procedure>调用存储过程属性:id 指定名称parameterClass 参数类型,类的别名或全名parameterMap 传入参数的显示映射resultClass 返回类型,类的别名或全名resultMap 返回类型的显示映射完整的例子:<parameterMap id="procedureMap" class="map"><parameter property="ACC_FIRST_NAME" jdbcType="VARCHAR"javaType="ng.String" mode="IN"/><parameter property="ACC_LAST_NAME" jdbcType="VARCHAR"javaType="ng.String" mode="OUT"/><parameter property="ACC_EMAIL" jdbcType="VARCHAR"javaType="ng.String" mode="INOUT"/></parameterMap><procedure id="callProcedure" parameterMap="procedureMap"resultClass="AccountResult">{call procedureName(?,?,?)}</procedure><statement>执行DDL语句属性:id 指定名称parameterClass 参数类型,类的别名或全名parameterMap 传入参数的显示映射定义:<statement id="dropTable" parameterClass="String">drop table #tableName#</statement><sql>SQL语句片段与include标签配合使用<include>组合语句将sql标签中的语句片段引入到其它的标签中,<sql>与<include>示例:<sql id="sqlStatement">select ACC_ID, ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL</sql><select id="sqlAndInclude"><include refid="sqlStatement"/> from ACCOUNT</select>。
iBATIS2教程之入门浅析

一、ibatis教程之ibatis介绍:ibatis是什么呢?相对于hibernate和apache ojb等“一站式”orm解决方案而言,ibatis是一种“半自动化”的orm实现。
这个框架将让你能够更好的在java应用中设计和实现实体层。
这个框架有两个主要的组成部分,一个是sql maps,另一个是data access objects。
另外还包括一些可能很有用的工具。
sql maps:sql maps是这个框架中最激动人心的部分,它是整个ibatis database layer的核心价值所在。
通过使用sql maps你可以显著的节约数据库操作的代码量。
sql maps使用一个简单的xml 文件来实现从javabean到sql statements的映射。
跟其他的框架或者对象映射工具相比,sql maps最大的优势是简单。
它需要学习的东西很少,在连接表或复杂查询时也不需要复杂的scheme(怎么翻complex scheme?),使用sql maps,你可以自由的使用sql语句。
data access objects (dao)当我们开发灵活的java应用时,有一个好主意就是通过一个通用api层把实体操作的细节封装起来。
data access objects允许你通过一个简单接口的来操作数据,从而隐藏了实现的细节。
使用dao,你可以动态配置你的应用程序来访问不同的实体存储机制。
如果你有一个复杂的应用需要用到几个不同的数据库,dao可以让你建立一个一致的api,让系统的其他部分来调用。
utilitiesibatis database layer包含一系列的有用的工具,比如simpledatasource,jdbc datasource 2.0(也包括3.0)的一个轻量级实现。
scriptrunner也提供了从单元测试到自动发布的数据库准备工作。
工作流程:sql maps提供一个简单的框架,通过xml描述来映射javabeans,map implementations甚至原始类型的包装(string,integer等)到jdbc preparedstatement。
ibatis配置详解

ibatis批量操作ibatis批量操作存在两种方式:一种是直接在代码中进行循环操作,另一种是在配置文件中进行循环操作。
(1)在配置文件中循环:1.情况一:多个输入参数循环次数不对称:处理方式:新建一个JAVABEAN,将各个参数作为其属性进行赋值。
在配置文件中,获取其值,进行各自循环。
如下例:要更新的字段Opr的值只有一个,而ID的值却有多个。
代码:public void batchClientAppOperation(String[] appDevIds,String operation) throws Exception {try{AppOperation appOpr=new AppOperation();appOpr.setOperation(operation);appOpr.setAppDevIds(appDevIds);this.getSqlMapClientTemplate().update("Device.ClientAppOperation", appOpr);}catch (DataAccessException ex){throw new Exception(Constants.ERROR_CODE_DELETE_USER_BY_ID.getLongValue(),ex);}}ibatis配置文件:<update id="Device.ClientAppOperation" parameterClass="AppOperation">update T_Device_App_R_Infoset Opr=#operation#where ID in<iterate conjunction="," open="(" close=")" property="appDevIds">#appDevIds[]#</iterate></update>2.情况二:多个输入参数循环次数是对称的:处理方式:新建一个hashmap,将各个参数名作为key,参数值作为value。
ibatis教程简介

创建SqlMapClient对象使用 对象使用Ibatis 创建 对象使用
通过使用 Person obj=new Person(); static{ 使用SqlMapClient对象完成持久化的步骤 使用 对象完成持久化的步骤 com\ibatis\common\reso obj.setPname("测试 测试 Person obj=null; 测试2"); try{,读取 urces\Resources对象来读 对象来读 1,读取SqlMapConfig.xml文件 结合问题 文件 obj.setSex("0");resource= try{ Reader 取SqlMapConfig.xml文件 文件 2,创建 ,创建SqlMapClientBuilder对象 client.insert("insertPerson", obj); 对象 obj=(Person)client.queryForObject("getPersonOfObject", 1); Resources.getResourceAsReader("SqlMapConfig.xml"); (要求位于 要求位于classpath下面 下面) 要求位于 下面 mitTransaction();//提交事务 提交事务 }catch(Exception k){ 3,创建 ,创建SqlMapClient对象 对象 client=SqlMapClientBuilder.buildSqlMapClient(resource); }catch(Exception k){ k){ 对象相关 k.printStackTrace(); 4,调用 对象相关API 通过 ,调用SqlMapClient对象相关 }catch(Exception 通过ibatis查询方法 查询方法 k.printStackTrace(); } k.printStackTrace(); }finally{ } try{ } client.endTransaction();//结束事务 结束事务 }catch(Exception k){ k.printStackTrace(); } } 通过ibatis实现保存方法 通过 实现保存方法
Ibatis中文教程

I b a t i s中文教程(总16页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--1.显示数据库所有数据希望能给大家带来帮助iBatis是个像Hibernate, JDO,EJB一类的数据持久框架,它能将对象映射为SQL语句.它是个轻量级的框架并且持久性API适合持久化也与Hibernate, JDO 不同,因为它使用存储过程和现有的SQL来处理数据库.本节我们将向你讲述如何配置iBatis来运行一个小型程序.既然一次性将所有知识全部解释很难,我们索性把本教程分为几个单独的例子来陈述.该例是关于如何从数据库读取数据并将结果显示在你的命令提示符上.在第二个例子中你将学习如何添加更多的数据到数据库中,在此之后的第三个例子将会向你展示如何通过iBatis从记录中删除数据.现在的第一个例子将会向你展示如何从数据库中读取记录,我们需要一个数据库来执行查询,所以我们使用作为这个例子的数据库.DROP TABLE IF EXISTS `contact`;CREATE TABLE `contact` (`id` int(11) NOT NULL auto_increment,`firstName` varchar(20) default NULL,`lastName` varchar(20) default NULL,`email` varchar(20) default NULL,PRIMARY KEY (`id`));根据Contact表我们需要创建一个POJO类,在我们的例子中,数据库vin有一个表Contact,包括四个字段 :idfirstNamelastNameemailpublic class Contact {private String firstName;private String lastName;private String email;= lastName;}}为了映射配置我们需要创建来指定如下信息 : 针对映射语句的命名空间前缀我们的数据库将使用JDBC来进行访问针对MySQL的JDBC驱动为" "连接URL为"jdbc:"用户名与密码分别为"root"和"root"我们的SQL语句描述在""<xml version="" encoding="UTF-8"><!DOCTYPE sqlMapConfigPUBLIC "-的代码如下 :<xml version="" encoding="UTF-8"><!DOCTYPE sqlMapPUBLIC "-的代码如下 :import .*;import .*;public class IbatisExample{public static void main(String[] args)throws IOException,SQLException{Reader reader = ("");SqlMapClient sqlMap =(reader);数据库插入数据iBatis最棒的特点就是它的简洁,这也是唯一令它在任何数据库程序中更容易使用的原因.iBatis使得通过Java或者任何其它的Microsoft的程序来使用数据库变得非常简单.本章我们将会通过一个例子向你介绍如何向数据库插入一行数据.我们使用MySQL作为本例的数据库,和我们上一章中使用的是一样的.这是"Contact"表和我们上一章使用过的两个文件:""和""public class Contact {private String firstName;private String lastName;private String email;private int id;public Contact() {}public Contact(String firstName,String lastName,String email) {= firstName;= lastName;= email;}public String getEmail() {return email;}public void setEmail(String email) {= email;上面的代码意味着表中被插入数据的下一行.public class IbatisInsertion{public static void main(String[] args) throws IOException,SQLException{Reader reader = ("");SqlMapClient sqlMap = (reader);建并将其编译2.创建和3.创建4.执行IbatisInsertion类文件,结果将在你的命令提示符上输出如下 :"Record Inserted Successfully"输出 :删除操作教程我希望通过上面的例子,你能完全懂得如何向数据库执行插入或者查询操作.所以在本例中你将学习到如何通过iBatis在数据库中删除数据.所以你需要分析代码并清楚的理解在这些代码里到底发生了什么.然而你绝对不需要再创建一个不同的数据库,虽然你知道我们使用上一个MySQL作为数据库而且你已经知道了我们的表名是Contact.但你可以选择是使用这个数据库还是再创建一个,这都由你决定!你唯一需要确定的就是你定义的表名是正确的,否则将会产生Bug.如果你从本iBatis教程的开始学下来的,那么你是不需要修改代码的.仅仅将给定的代码拷贝到文件夹并执行,最终删除数据库表中的数据.正如我之前提到的,在iBatis的本章,我们将要从Ctract表中删除记录,我们使用MySQL的数据库"vin"我们的和与上一个例子中的是一样的.上面几行代码删除了Contract表中的所有记录,这里定义的id"deleteAll"会在以后在IbatisDeletion类中执行数据库的查询操作.新表中的数据对任何数据库程序来说,添加,更新,删除都是十分常见且必要的特性.在该教程里我们已经讲解了使用iBatis在Java中进行插入和删除操作,现在本章将讲述如何使用iBatis在数据表中更新数据.在iBatis中执行一条更新语句是非常简单的.为了更新数据你得在SQL映射文件""中添加SQL的update语句.iBatis更新语句例子 :public class Contact {private String firstName;private String lastName;private String email;private int id;public Contact() {}public Contact(String firstName,String lastName,String email) {= firstName;= lastName;= email;}public String getEmail() {return email;}public void setEmail(String email) {= email;}public String getFirstName() {return firstName;PUBLIC "-章仅是一个ResultMap的简单介绍.我们的 and 文件和我们的上一个例子是一样的,没有任何变化. Contact POJO的代码如下 :public class Contact {private String firstName;private String lastName;private String email;private int id;public Contact() {}public Contact(String firstName,String lastName,String email) {= firstName;= lastName;= email;}public String getEmail() {return email;}public void setEmail(String email) {= email;}public String getFirstName() {return firstName;PUBLIC "-由一个id组成,该id需要在<select>标签下的resultMap属性中运行resultMap.这是的代码PUBLIC "-("",new Integer(1));这里我们传递值为1的id来显示所有该id的信息.public class IbatisResultMap{public static void main(String[] args)throws IOException,SQLException{Reader reader = ("");SqlMapClient sqlMap =(reader);例中你将看到如何在iBatis中调用存储过程.就像我在上一个例子中提到的,我们使用MySQL数据库,并且使用和上一个例子中一样的Contact表.我们在数据库"vin"中创建了一个叫showData()的存储过程,它将显示Contract表中的所有的contact信息.为了创建存储过程,我们打开MySQL并创建如下定义的过程 :DELIMITER $$DROP PROCEDURE IF EXISTS `vin`.`showData`$$CREATE PROCEDURE `vin`.`showData`()BEGINselect * from Contact;END$$DELIMITER ;""和""与上一个例子中的是一样的 :public class Contact {PUBLIC "-面是的代码 :PUBLIC "-的代码如下 :"");}}}请依照如下步骤执行本例 :创建和创建并将其编译创建并将其编译执行IbatisStoredProcedure类文件,所有的Contract信息将在你的命令提示符下显示 :。
ibatis教程

SQLMAP API(3)
List queryForList(ng.String id); List queryForList(ng.String id, int skip, int max); List queryForList(ng.String id, ng.Object parameterObject); List queryForList(ng.String id, ng.Object parameterObject, int skip, int max);
二,sqlmapconfig.xml
它是使用iBATIS的起点,负责把所有的SQL 映射文件组合在一起.用于配置文件中告 诉iBATIS如何连接数据库,以及获取哪些 SQL映射文件.
sqlMapConfig标签
<properties>主配置文件之外提供一个名值对列如: <properties resource="db.properties" /> <settings> 添加各种属性如:延迟加载,使用限定名
SQLMAP API(4)
Object insert(String id, Object parameterObject); Object insert(String id); int update(String id, Object parameterObject) ; int update(String id) ; int delete(String id, Object parameterObject) ; int delete(String id);
四,事务处理
1.什么是事务 2.事务的特性ACID 原子性,一致性,隔离性,持久性 3.iBATIS独特的事务机制
ibatis方法

iBatis,开源的并且由Apache推出的数据访问框架,深受开发人员的欢迎。
这个轻量级的对象关系映射(ORM)框架提供了一种简易的方法来访问关系数据库。
与Hibernate, Toplink等持久化框架不同,iBatis被看作是"半自动化"的ORM实现。
它并未对数据库结构提供完全的封装,而是提供了一个全套的从POJO到数据库表的映射机制。
这就意味着在开发过程中,开发者需要手动编写SQL语句来实现数据库与类对象之间的映射。
iBatis还具备一些高级功能,例如缓存和事务管理,使得维护和扩展应用程序变得更加容易。
此外,iBatis也支持存储过程的调用,可以通过配置文件将Java方法与数据库存储过程进行映射。
iBATIS高级查询技术详解

iBATIS In Action为iBATIS展现自己强大功能提供了保证,iBATIS也可以完成更为复杂的任务。
在本章中,我们会了解新的技术,减少我们的编码量;以及改善性能、降低资源消耗(footprint)的几种方法。
1 使用iBATIS操作XML译者注:iBATIS的Java版本可以操作基于XML的数据。
但意义并不是很大,在以后的版本中该特性可能会被移除。
则未提供该功能。
2 使用映射语句关联对象iBATIS框架也提供了多种方法用以关联复杂的对象,比如订单(order)和它的订单项(order item)(还有它们的相关产品、顾客等等)。
每种方法都有其优点和缺点,正所谓“尺有所短,寸有所长”,每一种方案都不是完美的。
应根据需要来选择适合的方案。
注意:为简短起见,在本章的余下的例子中,我们将省略那些对于演示来说不必要的数据。
例如,当我们获取了一个顾客(customer)对象,我们不会获取它的所有字段,而是仅仅获取它的主键和外键。
2.1 复杂的集合属性在第4章中,我们学习了如何使用SELECT语句从数据库获取数据。
在那些例子中,我们获取的结果仅仅是单个对象,即使是连接多表也是如此。
事实上,如果您有多个复杂对象,也可以使用iBATIS加载它们。
如果我们的应用程序模型与数据模型比较类似,那么这个功能会很有用。
可以考虑根据对象的关系(关联)来定义数据模型,然后使用iBATIS将它们一起加载。
例如,如果在数据库中,Account记录对应着相关的Order记录,而Order又对应着相关的OrderItem记录,可以为这些记录建立关系,当我们请求一条Account 记录时,可以一并获取所有的Order和OrderItem记录。
下面的代码清单显示了如何定义我们的SQL映射:图1SQL映射先来看看结果映射(result map,即上面的ResultAccountInfoMap,ResultOrderInfoMap和ResultOrderItemMap),前两个Map都用到了select特性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0.0 2004.8.1 夏昕第一版1.0 2004.9.1 夏昕补充ibatis in Spring 部分OpenDoc 版权说明本文档版权归原作者所有。
在免费、且无任何附加条件的前提下,可在网络媒体中自由传播。
如需部分或者全文引用,请事先征求作者意见。
如果本文对您有些许帮助,表达谢意的最好方式,是将您发现的问题和文档改进意见及时反馈给作者。
当然,倘若有时间和能力,能为技术群体无偿贡献自己的所学为最好的回馈。
另外,笔者近来试图就日本、印度的软件开发模式进行一些调研。
如果诸位可以赠阅日本、印度软件研发过程中的需求、设计文档以供研究,感激不尽!ibatis 开发指南ibatis Quick Start (5)准备工作 (5)构建ibatis 基础代码 (5)ibatis 配置 (11)ibatis 基础语义 (16)XmlSqlMapClientBuilder (16)SqlMapClient (16)SqlMapClient 基本操作示例 (16)OR 映射 (19)ibatis 高级特性 (26)数据关联 (26)一对多关联 (26)一对一关联 (28)延迟加载 (30)动态映射 (31)事务管理 (35)基于JDBC 的事务管理机制 (35)基于JTA的事务管理机制 (36)外部事务管理 (38)Cache (39)MEMORY类型Cache 与WeakReference (40)LRU 型Cache (42)FIFO 型Cache (43)OSCache (43)ibatis 开发指南相对Hibernate 和Apache OJB 等“一站式”ORM 解决方案而言,ibatis 是一种“半自动化”的ORM 实现。
所谓“半自动”,可能理解上有点生涩。
纵观目前主流的ORM ,无论Hibernate 还是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全套映射机制。
程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 或者OJB 提供的方法完成持久层操作。
程序员甚至不需要对SQL 的熟练掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。
大多数情况下(特别是对新项目,新系统的开发而言),这样的机制无往不利,大有一统天下的势头。
但是,在一些特定的环境下,这种一站式的解决方案却未必灵光。
在笔者的系统咨询工作过程中,常常遇到以下情况:1.系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。
2.开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现(就笔者工作所面向的金融行业而言,工商银行、中国银行、交通银行,都在开发规范中严格指定)3.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL 语句(或存储过程)才能达到系统性能设计指标。
面对这样的需求,再次举起Hibernate 大刀,却发现刀锋不再锐利,甚至无法使用,奈何?恍惚之际,只好再摸出JDBC 准备拼死一搏……,说得未免有些凄凉,直接使用JDBC 进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码,乏味的字段读取操作令人厌烦。
“半自动化”的ibatis,却刚好解决了这个问题。
这里的“半自动化”,是相对Hibernate 等提供了全面的数据库封装机制的“全自动化”ORM 实现而言,“全自动”ORM 实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。
而ibatis 的着力点,则在于POJO 与SQL 之间的映射关系。
也就是说,ibatis 并不会为程序员在运行期自动生成SQL 执行。
具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL 所需的参数,以及返回的结果字段映射到指定POJO 。
使用ibatis 提供的ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的Java 对象,这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL 语句,而ibatis 则要求开发者编写具体的SQL 语句。
相对Hibernate 等“全自动”ORM 机制而言,ibatis 以SQL 开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。
作为“全自动”ORM 实现的一种有益补充,ibatis 的出现显得别具意义。
ibatis Quick Start准备工作1. 下载ibatis 软件包()。
2. 创建测试数据库,并在数据库中创建一个t_user 表,其中包含三个字段:. id(int). name(varchar). sex(int) 。
3. 为了在开发过程更加直观,我们需要将ibatis 日志打开以便观察ibatis 运作的细节。
ibatis 采用Apache common_logging,并结合Apache log4j 作为日志输出组件。
在CLASSPA TH 中新建log4j.properties 配置文件,内容如下:log4j.rootLogger=DEBUG, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayout yout.ConversionPattern=%c{1} -%m%n log4j.logger.java.sql.PreparedStatement=DEBUG构建ibatis 基础代码ibatis 基础代码包括:1.ibatis 实例配置一个典型的配置文件如下(具体配置项目的含义见后):<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMapConfigPUBLIC "-//iBA //DTD SQL Map Config 2.0//EN" "/dtd/sql-map-config-2.dtd"><sqlMapConfig><settingscacheModelsEnabled="true"enhancementEnabled="true"lazyLoadingEnabled="true"errorTracingEnabled="true"maxRequests="32"maxSessions="10"maxTransactions="5"useStatementNamespaces="false"/><transactionManager type="JDBC"><dataSource type="SIMPLE"><property name="JDBC.Driver"value="com.p6spy.engine.spy.P6SpyDriver"/><property name="JDBC.ConnectionURL"value="jdbc:mysql://localhost/sample"/><property name="ername" ="user"/><property name="JDBC.Password" ="mypass"/><property name=value="10"/><property name=value="5"/><property name=value="120000"/><property name="Pool.TimeToWait" ="500"/><property name="Pool.PingQuery" ="select 1 from ACCOUNT"/><property name="Pool.PingEnabled" ="false"/><property name=value="1"/><property name=value="1"/></dataSource></transactionManager><sqlMap resource="com/ibatis/sample/User.xml"/></sqlMapConfig>valuevalue"Pool.MaximumActiveConnections""Pool.MaximumIdleConnections""Pool.MaximumCheckoutTime"valuevaluevalue"Pool.PingConnectionsOlderThan""Pool.PingConnectionsNotUsedFor"2.POJO(Plain Ordinary Java Object)下面是我们用作示例的一个POJO:public class User implements Serializable {private Integer id;private String name;private Integer sex;private Set addresses = new HashSet();/** default constructor */public User() {}public Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getName() {return ;}public void setName(String name) { = name;}public Integer getSex() {return this.sex;}public void setSex(Integer sex) {this.sex = sex;}}3.映射文件与Hibernate 不同。