iBatis学习笔记手册

chyou1988 贡献于2012-02-18

作者 dooioo  创建于2010-09-15 08:16:00   修改者dooioo  修改于2010-09-15 08:17:00字数12102

文档摘要:parameterMap的语法虽然简单,但很繁琐。还有一种更受欢迎更灵活的方法,可以大大简化定义和减少代码量。这种方法把Java Bean的属性名称嵌在Mapped Statement的定义中(即直接写在SQL语句中)。缺省情况下,任何没有指定parameterMap的Mapped Statement都会被解析成inline parameter(内嵌参数)。
关键词:

Ibatis学习随笔 < person >       < id > 1     < firstName > Clinton     < lastName > Begin     < birthDate > 1900-01-01     < weightInKilograms > 89     < heightInMeters > 1.77   一、SQL MAP Statement          一个简单的sql map statement。它通过最简单的方式实现了对数据库的添加、删除、修改。 < sqlMap  namespace ="Tuser" >      < typeAlias  alias ="tuser"  type ="com.ibatis.pojo.TuserPO" />       < select  id ="getTuser"  resultClass ="tuser" >                             < insert  id ="insrtTuser"  parameterClass ="tuser" >                       < update  id ="updateTuser"  parameterClass ="tuser" >                         < delete  id ="deleteTuser"   >                       再看下面这个较复杂点的SQL Map Statement < sqlMap  id =”Product”>                                   < typeAlias  alias =”product”  type =”com.ibatis.example.Product”  />   < parameterMap  id =”productParam”  class =”product”>                         < resultMap  id =”productResult”  class =”product”>                              < select  id =”getProduct”  parameterMap =”productParam”  resultMap =”productResu      t”  cacheModel =”product-cache”>            select * from PRODUCT where PRD_ID  = ?    对比两个不同的定义文件,第二个的定义比较麻烦,但运行效率却比第一个要高。因为第一个定义文件使用了Ibatis框架的自动映射特性。 在一个Sql map XML映射击文件可以包含多个Mapped Statement ,Parameter Map和ResultMap,但它们的名称在该SQL Map XML文件中必须是唯一的 Mapped Statements SQL Map的核心概念是Mapped Statement。Mapped Statement可以使用任意的SQL语句,并拥有parameter map(输入)和result map(输出)。如果是简单情况,Mapped Statement可以使用Java类来作为parameter和result。Mapped Statement也可以使用缓存模型,在内存中缓存常用的数据。Mapped Statement的结构如下所示:        select * from PRODUCT where PRD_ID = [?|#propertyName#] order by                  [$simpleDynamic$] 在上面的表达式中,括号[]里的部分时可选的属性,并且在某些情况下只有特定的组合才是合法的。因此下面这个简单的例子也是正确的:             insert into PRODUCT (PRD_ID,    PRD_DESCRIPTION) values (1, “Shih Tzu”) 上面的例子不太可能出现,但如果只是简单地想用SQL Map架构来执行任意地的SQL语句,这种写法就派上用场了。但常见的用法还是通过Parameter Map和Result Map,来实现Java Bean映射的特性,这是SQL Map真正有价值的地方。 Statements类型 元素是个通用声明,可以用于任何类型的SQL语句。通常,使用具体的statement类型是个好主意。具体statement类型提供了更直观的XML DTD,并拥有某些 Statement 类型 属性 子元素 方法 id parameterClass resultClass parameterMap resultMap cacheModel xmlResultName 所有的动态元素 insert update delete 所有的查询方法 id parameterClass parameterMap 所有的动态元素 insert update delete id parameterClass parameterMap 所有的动态元素 Insert Update delete id parameterClass resultClass parameterMap resultMap cacheModel 所有的动态元素 所有的查询方法 上面的查询结果将产生一个XML document,结构如下: < person >      < id > 1      < firstName > Clinton      < lastName > Begin      < birthDate > 1900-01-01      < weightInKilograms > 89      < heightInMeters > 1.77 基本类型输入参数 很简单就是使用JAVA基础类型来做为参数了。 < statement  id =”insertProduct”  parameter =”java.lang.Integer”>  select * from PRODUCT where PRD_ID  = #value#  Map类型输入参数 < statement  id =”insertProduct”  parameterClass =”java.util.Map”>   select * from PRODUCT where PRD_CAT_ID  = #catId#  and PRD_CODE  = #code#  可以注意到mapped statement的形式完全没有区别!上面的例子中,如果把Map对象作为输入参数去调用mapped statement,Map对象必须包含键值“catId”和“code”。键值引用的对象必须是合适的类型,以上面的例子来说,必须是Integer和String。Result Map(参见以下章节)也支持使用Map类型作为结果参数。要获得更多信息,请参见“Result Map”和“使用SQL Map API编程”部分。 Map类型也可以使用别名。例如,可以用“map”来代替“java.util.Map”。这些别名参见下面的“支持Parameter Map和Result Map的数据类型”表格。 三、动态 MAP Statement          作用是动态构建SQL语句,根据不同的一元或二元运算条件构建复杂的SQL语句,这功能非常好,这样就可以把写的BO层的SQL语句构造移值到SQL MAP 文件里。这里例举一些例子: < select  id ="dynamicGetAccountList"  cacheModel ="account-cache"  resultMap ="account-result"   >   select * from ACCOUNT      < isGreaterThan  prepend ="and"  property ="id"  compareValue ="0" >      where ACC_ID = #id#    order by ACC_LAST_NAME  上面语句中可以根据参数id的不同值能构造出两条SQL查询语句,下面是一个比较复杂的例子:            select * from ACCOUNT                                           (ACC_FIRST_NAME = #firstName#                                          ACC_LAST_NAME = #lastName#                                      )                                               ACC_EMAIL like #emailAddress#                                                   ACC_ID = #id#                    order by ACC_LAST_NAME 上面的例子中,元素划分出SQL语句的动态部分。动态部分可以包含任意多的条件标签元素,条件标签决定是否在语句中包含其中的SQL代码。所有的条件标签元素将根据传给动态查询Statement的参数对象的情况来工作。元素和条件元素都有“prepend”属性,它是动态SQL代码的一部分,在必要情况下,可以被父元素的“prepend”属性覆盖。上面的例子中,prepend属性“where”将覆盖第一个为“真”的条件元素。这对于确保生成正确的SQL语句是有必要的。例如,在第一个为“真”的条件元素中,“AND”是不需要的,事实上,加上它肯定会出错。以下小节讨论不同的条件元素,包括二元条件元素,一元条件元素和其他动态元素。 二元条件元素        二元条件元素将一个属性值和一个静态值或另一个属性值比较,如果条件为“真”,元素体的内容将被包括在查询SQL语句中。 􀁺  二元条件元素的属性:  prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)property - 被比较的属性(必选) compareProperty - 另一个用于和前者比较的属性(必选或选择compareValue)  compareValue - 用于比较的值(必选或选择compareProperty) 二元条件元系的属性 比较属性值和静态值或另一个属性值是否相等。 比较属性值和静态值或另一个属性值是否不相等。 比较属性值是否大于静态值或另一个属性值。 比较属性值是否大于等于静态值或另一个属性值。 比较属性值是否小于静态值或另一个属性值。 比较属性值是否小于等于静态值或另一个属性值。 例子: ADOLESCENT = ‘TRUE’ 一元条件元素 一元条件元素检查属性的状态是否符合特定的条件。 一元条件元素的属性: prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选) property - 被比较的属性(必选) 检查是否存在该属性(存在parameter bean的属性)。 检查是否不存在该属性(不存在parameter bean的属性)。 检查属性是否为null。 检查属性是否不为null。 检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)。 检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)。 例子: FIRST_NAME=#firstName# 还有两个其它的条件元素,就不说了,用到的时候可以再查。 简单的动态SQL元素 虽然动态Mapped Statement API功能强大,但有时仅需要一小部分的动态SQL即可。为此,SQL statement和statement都可以包含简单的动态SQL元素,以帮助实现动态的order by子句,动态的查询字段或SQL语句的其他动态部分。简单动态SQL元素的概念有点象inline parameter的映射,但使用了稍微不同的语法。考虑下面的例子:          select * from PRODUCT order by $preferredOrder$ 简单动态元素可以包含在中,当要修改SQL语句本身时它能派上用场。例如:   SELECT * FROM PRODUCT              PRD_DESCRIPTION $operator$ #description#    

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 3 人已下载

下载文档