配色: 字号:
ibatis教程简介
2015-09-07 | 阅:  转:  |  分享 
  
为什么要使用Ibatis?在系统的开发过程中,你可能碰到如下一些问题:什么是Ibatis?半自动化ORM框架 相对于Hiberna
te等“一站式”ORM框架,Ibatis是一种“半自动化”的ORM框架实现。也就是说,ORM概念中,Ibatis只强调O/R部分的
内容,而将M(mapping)这部分概念进行了淡化。因为它将对于SQL语句的操作权,最终交还给了程序员。 上面提到的“半自动化
”这个概念可能大家理解起来比较生涩,通过我们对Hibernate或EJB3的了解,可以发现在它们都是针对POJO到数据库提供了一种
较为完整的封装。程序只需要对POJO进行操作,就达到操作数据库持久层的目的,我们程序员对SQL语句都不需要太多的了解,因为Hibr
enate会根椐POJO的映射关系生成对应的SQL语句,最终调用JDBC完成操作。 大部分情况,Hibernate这种操作机
制无往不利,但是在特定的情况下,这种“一站式”的解决方案却不见得灵光。我们来思考在开发过程中的一些问题:什么是Ibatis?使
用Ibatis解决前述问题 使用“半自动化”化的Ibatis框架,可以解决前面系统开发过程中存在的问题。 针对H
ibernate在POJO与数据库之间建立映射,以及自动生成SQL并执行的过程,Ibatis着力点,则在于POJO与SQL语句之间
的映射。也就是说,Ibatis在运行过程中不会自动生成SQL语句执行,具体的SQL语句由程序员编写,然后通过映射配置文件,将SQL
语句所需的参数,获得的返回结果字段映射到指定的POJO。 使用Ibatis提供的ORM机制,在业务逻辑层实现人员而言,操作的是
JAVA对象,这一层面与Hibernate机制中一样的。对于具体的数据库操作,Hibernate会自动生成SQL并执行,而Ibat
is要求开发人员具体编写SQL语句。Ibatis通过在数据库移植性和SQL开发工作量上面做出了让步,换来了为系统设计更多的灵活性和
自由空间。 如何使用Ibatis?准备工作导入Ibatis相关的jar包
目前ibatis的最新版本为2.3.4。使用ibatis非常简单,只需要将相关的jar包复制到指定的目录下便可,具体情况如下表
: IBATIS2.0的一个主要的关注点是管理并降低JAR文件的依赖性。因此,如果您用的是JD
K1.4,IBATIS仅仅依赖于JakartaCommonsLogging框架。如何使用Ibatis
?构建基础代码ibatis的基础代码包括以下几个部分:ibatis实例配置(SqlMapConfig.
xml)Pojo(PlainOrdinaryJavaObject)映射文件如何使用Ibatis?构建基础代码
如何使用Ibatis?构建基础代码 与Hibernate不同,因为需要人工手动编写SQL,所以Ibatis的映射文件一般通
过手动编写的方式完成。如何使用Ibatis?创建SqlMapClient对象使用Ibatis 通过SqlMapClient
对象以及调用此对象上面的API,可以完成通过Ibatis进行持久层操作。使用SqlMapClient对象完成持久化的步骤1、读
取SqlMapConfig.xml文件2、创建SqlMapClientBuilder对象3、创建SqlMapClient对象
4、调用SqlMapClient对象相关APISqlMapConfig.xml配置文件说明元素 tting>元素用于配置和优化SqlMapClient实例的各选项。元素本身及其所有的属性都是可选的。下表列出了
元素支持的属性及其功能:SqlMapConfig.xml配置文件说明元素 eAlias>元素让您为一个通常较长的、全限定类名指定一个较短的别名。在ibatis中默认定义了几个别名,如下:Sql
MapConfig.xml配置文件说明元素
素让您为SQLMap配置事务管理服务。属性type指定所使用的事务管理器类型。这个属性值可以是一个类名,也可以是一个别名。包含在
框架的三个事务管理器分别是:JDBC,JTA和EXTERNAL。JDBC:通过常用的Connectioncommit()和ro
llback()方法,让JDBC管理事务。JTA:本事务管理器使用一个JTA全局事务,使SQLMap的事务包括在更大的事务范围
内,这个更大的事务范围可能包括了其他的数据库和事务资源。EXTERNAL:这个配置可以让您自己管理事务。您仍然可以配置一个数据源
,但事务不再作为框架生命周期的一部分被提交或回退。这意味着SQLMap外部应用的一部分必须自己管理事务。也可以用于没有事务管理的
数据库配置(比如说只读性质的数据库操作)SqlMapConfig.xml配置文件说明元素 <
datasource>是的一部分,为SQLMap数据源设置了一系列参数。目前
为止,ibatis支持三种数据源,如下:SimpleDataSourceFactory 为DataSource提供了
一个基本的实现,适用于在没有J2EE容器提供DataSource的情况。DbcpDataSourceFactory
实现使用JakartaDBCP(DatabaseConnectionPool)的DataSourceAPI提供连接池
服务。适用于应用/Web容器不提供DataSource服务的情况。JndiDataSourceFactory 在应用
容器内部从JNDIContext中查找DataSource实现。SqlMapConfig.xml配置文件说明
元素 元素用于包括SQLMap映射文件和其他的SQLMap配置文件。每个SqlMapClient对象使用
的所有SQLMap映射文件都要在此声明。映射文件作为streamresource从类路径或URL读入。您必须在这里指定所有的S
QLMap文件。SQLMapXML文件说明MappedStatements SQLMap的核心概念是Mapped
Statement。MappedStatement可以使用任意的SQL语句,并拥有parametermap(输入)和resu
ltmap(输出)。如果是简单情况,MappedStatement可以使用Java类来作为parameter和result。M
appedStatement也可以使用缓存模型,在内存中缓存常用的数据。MappedStatement的结构如下所示:SQ
LMapXML文件说明Statement的类型 元素是个通用声明,可以用于任何类型的SQL语句。通
常,使用具体的statement类型是个好主意。具体statement类型提供了更直观的XMLDTD,并拥有某些nt>元素没有的特性。下表总结了statement类型及其属性和特性:SQLMapXML文件说明SQL语句 SQL
显然是mappedstatement中最重要的部分,可以使用对于数据库和JDBCDriver合法的任意SQL语句。只要JDBC
Driver支持,可以使用任意的函数,甚至是多条语句。因为SQL语句是嵌在XML文档中的,因此有些特殊的字符不能直接使用,例如大
于号和小于号(<>)。幸运的是,解决的办法很简单,只需将包含特殊字符的SQL语句放在XML的CDATA区里面就可以了。例如:S
QLMapXML文件说明parameterClass属性 parameterClass属性的值是Java类的全限定名(即
包括类的包名)。parameterClass属性是可选的,但强烈建议使用。它的目的是限制输入参数的类型为指定的Java类,并优化框
架的性能。如果您使用parameterMap,则没有必要使用parameterClass属性。例如,如果要只允许Java类“cn.
com.Person”作为输入参数,可以这样作:SQLMapXML文件说明parameterMap属性 属性para
meterMap的值等于一个预先定义的元素的名称。parameterMap的基本思想是定义一系列有次序
的参数系列,用于匹配JDBCPreparedStatement的值符号:SQLMapXML文件说明InlinePara
meter简介 parameterMap的语法虽然简单,但很繁琐。还有一种更受欢迎更灵活的方法,可以大大简化定义和减少代码量。
这种方法把JavaBean的属性名称嵌在MappedStatement的定义中(即直接写在SQL语句中)。缺省情况下,任何没有
指定parameterMap的MappedStatement都会被解析成inlineparameter(内嵌参数)。用上面的例
子(即Product)来说,就是SQLMapXML文件说明基本类型输入参数 假如没必要写一个JavaBean作为参数
,可以直接使用基本类型的包装类(即String,Integer,Date等)作为参数。例如: 假设PRD_ID的数
据类型是NUMERIC,要调用上面的mappedstatement,可以传入一个java.lang.Integer对象作为参数。
Integer对象的值将代替#value#参数。当使用基本类型包装类代替JavaBean时,切记要使用#value#作为参数。
SQLMapXML文件说明Map类型输入参数 假如没必要写一个JavaBean作为参数,而要传入的参数又不只一个时,可
以使用Map类(如HashMap,TreeMap等)作为参数对象。 可以注意到mappedstatement的
形式完全没有区别!上面的例子中,如果把Map对象作为输入参数去调用mappedstatement,Map对象必须包含键值“cat
Id”和“code”。键值引用的对象必须是合适的类型,以上面的例子来说,必须是Integer和String。ResultMap也
支持使用Map类型作为结果参数。SQLMapXML文件说明resultClass属性 resultClass
属性的值是Java类的全限定名(即包括类的包名)。resultClass属性可以让您指定一个Java类,根据ResultSetMe
taData将其自动映射到JDBC的ResultSet。只要是JavaBean的属性名称和ResultSet的列名匹配,属性自动
赋值给列值。这使得查询mappedstatement变得很短。SQLMapXML文件说明resultMap属性 re
sultMap是最常用和最重要的属性。ResultMap属性的值等于预先定义的resultMap元素的name属性值。使用resu
ltMap可以控制数据如何从结果集中取出,以及哪一个属性匹配哪一个字段。不象使用resultClass的自动映射方法,result
Map属性可以允许指定字段的数据类型,NULL的替代值复杂类型映射(包括其他JavaBean,集合类型和基本类型包装类)。S
QLMapXML文件说明基本类型的Result(即String,Integer,Boolean) 除了支持符合Java
Bean规范的Java类,ResultMap还可以给基本类型包装类如String,Integer,Boolean等赋值。基本类型
可以象JavaBean一样映射,只是要记住一个限制,基本类型只能有一个属性,名字可以任意取(常用“value”或“val”)。例
如,如果您要获得所有产品描述的一个列表而不是整个Product类,ResultMap如下: 更简单的办法:SQLM
apXML文件说明Map类型的Result ResultMap也可以方便为一个Map(如HashMap或TreeMap)
对象赋值。使用下面讨论的API(参见queryForList()),还可以得到Map对象的集合(即Map的List)。Map对象与
JavaBean同样的方式映射,只是使用name属性值作为Map的键值,用它来索引相应的数据库字段值,而不是象JavaBean
一样给属性赋值。例如,如果您要将Product对象的数据装入Map,可以这样做:SQLMapXML文件说明xmlResu
ltName属性 当直接把查询结果映射成XMLdocument时,属性xmlResultName的值等于XMLdocume
nt根元素的名称。例如:ibatis常用APISqlMapClientBuilder 此类的主要作用用于读取指定位置的S
qlMapConfig.xml(一般情况下位于classpath下),创建一个SqlMapClient接口的对象。Sq
lMapClientinsertObjectinsert(String?id)Objectinsert(String?
id,Object?parameterObject)deleteintdelete(String?id,Object?
parameterObject)intdelete(String?id)updateintupdate(java.la
ng.String?id)intupdate(String?id,Object?parameterObject)que
ry…execute… ibatis常用API事务处理 缺省情况下,调用SqlMapClient对象的任意exe
cuteXxxx()方法将缺省地自动COMMIT/ROLLBACK。这意味着每次调用executeXxxx()方法都是一个独立的事
务。这确实很简单,但对于需要在同一个事务中执行多个语句的情况(即只能同时成功或失败),并不适用。这正是事务处理要关心的事情。
如果您在使用GlobalTransaction(在SQLMap配置文件中设置),您可以使用自动提交并且可以得到在同一事务中执
行的效果。但为了提高性能,最好是明确地划分事务的范围,因为这样做可以减少连接池的通讯流量和数据库连接的初始化。SqlMapClie
nt对象拥有让您定义事务范围的方法。使用下面SqlMapClient类的方法,可以开始、提交和/或回退事务:ibatis常用A
PI用SqlMapClient执行持久层化操作ibatis常用API用SqlMapClient执行持久层化操作insert
()、update()、delete()不同之处 上面这些方法用于数据更新(即非查询语句)。这就是说,使用
下面的查询方法来执行数据更新操作并不是不可能。但这显得很奇怪,并明显依赖于JDBC的驱动程序。执行update(),返回受影响数据
记录的数目。queryForObject不同之处 queryForObject()方法有两个版本。一个返回查
询得到的新对象,另一个用一个事先生成的对象作为参数。后者对于使用多个查询为对象赋值很有用。ibatis常用API用Sql
MapClient执行持久层化操作queryForList()ibatis常用API用SqlMapClient执行持久层
化操作queryForPaginatedList() 对于要返回一个可以向前和向后翻页的数据子集,queryFor
PaginatedList()方法很有用,它返回一个可管理的List对象。ibatis常用API用SqlMapClient执
行持久层化操作queryForMap() queryForMap()方法将结果集放在一个Map对象中,这个Map对象用一个
传入参数keyProperty作为key值。Ibatis高级特性数据关联 前面我们讲解的都是针对独立数据的操作,在实际情
况中经常碰到数据关联的情况,如每个User对象包含多个Address对象,每个Address描述了对应的User对象,在这种情况下
我们该如何处理啦? ibatis中提供了对statement嵌套支持,从而实现数据关联 Ibatis高级特性数据关联
Ibatis高级特性数据关联 一对一是一对多的一种特例。如果采用前面的一对多会导致N+1条SQL语句的执行,对于这种情况,
我们可以采用一次SELECT二张表的方式,避免这样的性能开销。(假设上面示例中User对应只有一个Address记录)Ibati
s高级特性如何避免出现N+1查询 在上面的示例中,是通过二条select语句进行查询的,也就是说在先查询出T_USER表中的
记录后,再根椐USER_ID去查询T_ADDRESS表的中记录,这样的话会导致出现N+1次查询,如果T_USER表中的记录相当大的
情况下,会出现严重的性能问题,如何解决N+1问题啦?Ibatis高级特性ibatis中如何调用存储过程 通过ure>元素支持存储过程。Ibatis高级特性Ibatis与Spring集成 针对ibatis,Spring配置文件
如下:ThankyoupublicvoidstartTransaction()throwsSQLException
publicvoidcommitTransaction()throwsSQLExceptionpubl
icvoidendTransaction()throwsSQLExceptiontry{sqlMap.star
tTransaction();Itemitem=(Item)sqlMap.queryForObject("getI
tem",itemId);item.setDescription(newDescription);sqlMap.upd
ate("updateItem",item);sqlMap.commitTransaction();}finall
y{ sqlMap.endTransaction();}注意:事务不能嵌套。在调用commit()或rollbac
k()之前,从同一线程多次调用.startTransaction,将引起抛出例外。换句话说,对于每个SqlMap实例,每个线
程最多只能打开一个事务。在上面的每个方法中,MappedStatement的名称作为第一个参数。这个名称要对应ment>的名称属性。另外,第二个参数总是参数对象。如果不需要参数对象,可以为null。sqlMap.startTransac
tion();Productproduct=newProduct();product.setId(1);pr
oduct.setDescription(“ShihTzu”);introws=sqlMap.insert(“in
sertProduct”,product);sqlMap.commitTransaction();sqlMap.star
tTransaction();Integerkey=newInteger(1);Productproduct
=(Product)sqlMap.queryForObject(“getProduct”,key);sqlMap.com
mitTransaction();1查询成对象sqlMap.startTransaction();Cus
tomercustomer=newCustomer();sqlMap.queryForObject(“getCust”
,parameterObject,customer);sqlMap.queryForObject(“getAddr”,p
arameterObject,customer);sqlMap.commitTransaction();2用预赋值的
结果对象查询成对象1执行一个查询并返回所有的查询结果sqlMap.startTransaction();Listlis
t=sqlMap.queryForList(“getProductList”,null);sqlMap.commitT
ransaction();2允许指定跳过结果的数目(即开始点)和返回结果的最大数sqlMap.startTransacti
on();Listlist=sqlMap.queryForList(“getProductList”,null,0
,40);sqlMap.commitTransaction();PaginatedList接口中的方法:nex
tPage()(查询下一页)previousPage()(查询前一页)gotoPage()(跳转到指定页
)isFirstPage()isMiddlePage()isLastPage()isPre
viousPageAvailable()getPageIndex()getPageSize()Paginat
edListlist=sqlMap.queryForPaginatedList(“getProductList”,nu
ll,10);list.nextPage();list.previousPage();实现分页查询sqlMa
p.startTransaction();Mapmap=sqlMap.queryForMap(“getProductL
ist”,null,“productCode”);sqlMap.commitTransaction();Product
p=(Product)map.get(“EST-93”);1单向一对多关联alias="user"type="cn.com.ibatis.TUserPojo"/>address"type="cn.com.ibatis.TAddressPojo"/>serResult"class="user">
ddress"column="UID" select="getAddressByUserId"/>ap>addressId"column="AID"/>aNAME"/>resultMap="getUserResult">SELECTUID,UNAMEFROMT_USERWHER
EUID=#id#erClass="int" resultMap="addResult">SELECTAID,ANAMEFRO
MT_ADDRESSWHEREUSER_ID=#value#
指定实体类别名指
定User对象的reslutMap指定addrss属性的statement单向一对多2双向一对多<
typeAliasalias="user"type="cn.com.ibatis.TUserPojo"/>asalias="address"type="cn.com.ibatis.TAddressPojo"/>pid="getUserResult"class="user">mn="UID"/>roperty="address"column="UID" select="getAddressByUserId"/>
property="addressId"column="AID"/>"column="aNAME"/>etUsers"/>"resultMap="getUserResult">SELECTUID,UNAMEFROMT_USERWH
EREUID=#id#eterClass="int" resultMap="addResult">SELECTAID,ANAMEF
ROMT_ADDRESSWHEREUSER_ID=#value#
3一对一关联
ne.TUserPojo"/>ne2oneUser">perty="userName"column="UNAME"/>lumn="AID"/>esultproperty="telphone"column="telphone"/>ectid="getUsersOfOne2One"parameterClass="int"resultMap="getUse
rResultOfOne2one">SELECTFROMT_USER,T_ADDRESSWHERET_US
ER.UID=T_ADDRESS.USER_ID
事实上这里不是严格意义上的一对一
在这里我们只是将属于Address表的属性也设置在User实体类中1调用带返回值的函数="projectDataParam"class="java.util.Map">ty="results"jdbcType="VARCHAR" javaType="java.lang.String"mode
="OUT"/>CHAR" javaType="java.lang.String"mode="IN"/>

m"> {?=callFN_CI_PROJECT_TO_PD(?)}定义一个存储过程的参数类
型在这里指定了哪些是输入参数哪些是输出参数(INOUTINOUT)这个名称可以随便给定,作用是定义返回Map结构中的
key。Mapmap=newHashMap();map.put("projectCodeList",”123”);thi
s.sqlMapClient.update("pdProjectDataToPd",map);Stringtemp=(Stri
ng)map.get("results"); 这二个名称与映射文件中的parameterMap的名称保持一样,
一个作为输入参数,一个是输出参数通过使用update方法调用"DriverManagerDataSource">…"SqlMapClientFactoryBean"> alue>classpath:SqlMapConfig.xml nid="transactionManager"class="DataSourceTransactionManager"> <
propertyname="dataSource"> ty> ataSource“local=“dataSource”/> cal=“sqlMapClient”>Ibatis与spring整合核心部件相当于hibernate中的se
ssionFactoryDao中注入了dataSource与sqlMapClient要求在Dao类中提供setter方法<
sqlMapConfig>

SqlMapConfig.xml文件publicclassUserDAOextendsSqlMapClientDaoSu
pportimplementsIUserDAO{publicvoidinsertUser(Useruser){
getSqlMapClientTemplate().update("insertUser",user);}}dao类的编写
,注意这里extendsSqlMapClientDaoSupport模板类所以不需要提供了dataSource与sqlMap
Client属性及注入方法ibatis简介1.系统的部分或全部数据都来源于现有数据库,出于安全考虑,客户只给你提
供一些selectsql语句(或存储过程)来获取数据,具体的表结构不公开。(金融行业项目常见)2.开发规范过程中要求,所有涉及
到业务逻辑部分的数据库表的操作,必顺通过存储过程进行实现3.系统数据处理量巨大,对性能要求非常高请问此时你将选择Hiberna
te来操作,还是选择JDBC呢?当你选择使用Hibernate,却发现其优点荡然无存!当你选择使用JDBC,却发现拖沓的代码到
处存在!Ibatis中可能需要的一些jar包<
!DOCTYPEsqlMapConfigPUBLIC"-//iBATIS.com//DTDSQLMapConfig2
.0//EN""http://www.ibatis.com/dtd/sql-map-config-2.dtd">Config>"true" lazyLoadingEnabled="true"maxRequests="32" maxSess
ions="10"maxTransactions="5" useStatementNamespaces="false"/
>IMPLE"> …
<
sqlMapresource=“cn/com/ibatis/Person.xml"/>引用d
td文件用于配置和优化SqlMapClient实例的各选项配置事务管理服务引入映射文件假设我们在数据库中建立了一个Pers
on表,其中包括三个字段:CreatetablePerson(pidnumber(10)primarykey,
pnamevarchar2(30)notnull,sexchar(1))publicclassPe
rsonimplementsSerializable{ privateIntegerpid; privateS
tringpname; privateStringsex; setter/getter....}Pojo对象
EsqlMapPUBLIC"-//iBATIS.com//DTDSQLMap2.0//EN""http://www.
ibatis.com/dtd/sql-map-2.dtd"> lias="person"type="cn.com.ibatis.Person"/> on"parameterClass=“int" resultClass="person"> select
fromPersonwherePID=#id# n"parameterClass="person">Person(pid,pname,sex) VALUES(person_seq.nextval,#pname#,#s
ex#)]]>Person.xml(Ibatis映射文件)
为实体类定义别名定义查询操作SQL通过使用com\ibatis\common\resources\Resources对象来读
取SqlMapConfig.xml文件(要求位于classpath下面)结合问题static{try{Readerres
ource=Resources.getResourceAsReader("SqlMapConfig.xml");client=
SqlMapClientBuilder.buildSqlMapClient(resource);}catch(Exception
k){ k.printStackTrace();}}读取位于classpath下面的文件try{ client.st
artTransaction();//开始事务处理 Personobj=newPerson(); obj.setPname
("测试2"); obj.setSex("0"); client.insert("insertPerson",obj);
client.commitTransaction();//提交事务}catch(Exceptionk){ k.printSt
ackTrace();}finally{try{ client.endTransaction();//结束事
务}catch(Exceptionk){ k.printStackTrace();}}通过ib
atis实现保存方法此名称来源于Person.xml文件Personobj=null;try{ obj=(Person)
client.queryForObject("getPersonOfObject",1);}catch(Exceptionk
){ k.printStackTrace();}通过ibatis查询方法同时进入SqlMapClient.startTra
nsaction()的最大线程数。大于这个值的线程将阻塞直到另一个线程退出。maxTransactions同一时间内活动的最大
session数。它应该总是大于或等于maxTransactions并小于maxRequests。减小这个参数值通常能减少内存使用
。maxSessions全局性地启用或禁用SqlMapClient的所有延迟加载。调试程序时使用。(默认值为:true)l
azyLoadingEnabled如果启用本属性,必须使用全限定名来引用mappedstatement。Mappedstat
ement的全限定名由sql-map的名称和mapped-statement的名称合成。如(默认值为:false)queryF
orObject(“sqlMapName.statementName”);useStatementNamespaces同时执行
SQL语句的最大线程数。大于这个值的线程将阻塞直到另一个线程执行完成。通常这个值应该至少是maxTransactions(参见以下
)的10倍,并且总是大于maxSessions和maxTranactions。减小这个参数值通常能提高性能。maxRequest
s
最佳实践:2.0版本只允许一个数据源。要使用多个数据源,最好使用多个属性文件,不同的系统使用不同的属性文件,或在创建SQLM
apClient时传入不同的属性文件。type="SIMPLE">river.OracleDriver"/>jdbc:oracle:thin:@127.0.0.1:1521:wangyf"/>sername"value="accp"/>p"/>pertyname="Pool.MaximumActiveConnections"value="10"/>name="Pool.MaximumIdleConnections"value="5"/>ool.MaximumCheckoutTime"value="120000"/>meToWait"value="500"/>lect1fromACCOUNT"/>alse"/>>ataSource>SimpleDataSourceFactorytionManagertype="JDBC">"JDBC.Driver"value="${driver}"/>URL"value="${url}"/>rname}"/>ropertyname="Pool.MaximumActiveConnections"value="10"/>tyname="Pool.MaximumIdleConnections"value="5"/>"Pool.MaximumWait"value="60000"/>nQuery"value="selectfromACCOUNT"/>bandoned"value="false"/>alue="false"/>="50000"/> DbcpDataSourceFac
tory
/>使用JDBC进行事务处理onManagertype="JTA">ava:/ctx/con/UserTransaction"/>rtyname="DataSource"value="java:comp/env/jdbc/jpetstore"/>ataSource>基于JTA进行事务管理"/>qlMapresource="com/ibatis/examples/sql/Product.xml"/>qlMapurl="file:///c:/config/Account.xml"/>//c:/config/Product.xml"/>meterClass=”some.class.Name”] [resultClass=”some.class.Name”]
[parameterMap=”nameOfParameterMap”] [resultMap=”nameOfResultMa
p”] [cacheModel=”nameOfCache”]>SQL语句State
ment有多种类型在上面的表达式中,括号[]里的部分时可选的属性,并且在某些情况下只有特定的组合才是合法的ntid="getPersonsByAge"parameterClass="int" resultClass="c
n.com.accp.Person">GE>#value#]]> parameterClass=”cn.com.Person”>insertintoPRODUCTvalue
s(#id#,#description#,#price#)与java类的属性名称一样最佳
实践:虽然2.0向后兼容,但强烈建议使用parameterClass(除非没必要)。通过提供parameterClass,您可以
获得更好的性能。=”com.domain.Product”>operty=”description”/>duct” parameterMap=”insert-product-param”>insertintoPR
ODUCT(PRD_ID,PRD_DESCRIPTION)values(?,?);说明:p
arameterMap属性很少使用,更多的是使用上面的parameterClass和inlineparameterementid=”insertProduct” parameterClass=”cn.com.Product”
>insertintoPRODUCT(PRD_ID,PRD_DESCRIPTION)values(#id#,#
description#);eterClass=”java.lang.Integer”>selectfromPRODUCTwherePRD_I
D=#value#可以使用int简写代替uct”parameterClass=”java.util.Map”>selectfromPRODUCTwher
ePRD_CAT_ID=#catId#andPRD_CODE=#code#tementid="getPerson"parameterClass=”int” resultClass="examples
.domain.Person">SELECTPER_IDasid,PER_FIRST_NAMEasfirstNa
me,PER_LAST_NAMEaslastName,PER_BIRTH_DATEasbirthDate,PE
R_WEIGHT_KGasweightInKilograms,PER_HEIGHT_MasheightInMeters
FROMPERSONWHEREPER_ID=#value#也可以使用别名代替一
般情况下,列名和属性名称不匹配,就需要使用“as”关键字lass=”com.ibatis.example.Product”>”PRD_ID”/> selectfromPRODUCT selectcount(1)asvaluefromPRODUCT selectfromPRODUCT selectfromPRODUCTSELECTPER_IDasid,PER_FIRST_NAMEasfirstName,PER_LAST_NAMEaslastName,PER_BIRTH_DATEasbirthDate,PER_WEIGHT_KGasweightInKilograms,PER_HEIGHT_MasheightInMetersFROMPERSONWHEREPER_ID=#value#指定xml的根元素名称1ClintonBegin1900-01-01891.77Stringresource=“SqlMapConfig.xml”;Readerreader=Resources.getResourceAsReader(resource);SqlMapClientsqlMap=SqlMapClientBuilder.buildSqlMap(reader);指定配置文件位置
献花(0)
+1
(本文系文梅文档首藏)