首页 > 数据库 > Oracle > 【转载】SqlMap配置
SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70%的工作量。
1、命名空间:
2、实体的别名:
如果有用到的全名的地方,可以用别名代替,受命名空间约束。
3、插入操作
4、获取主键
6、SQL入参parameterClass
插入语句入参:parameterClass="类别名" 来设定。
查询语句入参:可以设定类别名,也可以设定为map,也可以设定为iBatis支持的原生类型(比如string、int、long等),当只有一个原生类型入参时,使用#value#来引用,这个value是不是关键字,可变。比如:
7、返回值参数类型
当结果集列名和类属性名完全对应的时候,则应该使用resultClass来指定查询结果类型。当然有些列明不对应,可以在sql中使用as重命名达到一致的效果。
当查询结果列名和类属性名对应不上的时候,应该选择resultMap指定查询结果集类型。否则,则查询出来填充的对象属性为空(数字的为0,对象的为null)。
但是实际上resultMap是对一个Java
Bean的映射,需要先定义xml的映射后,才可以引用,例如:
8、查询结果集分组
9、SQL中参数的引用
10、模糊查询中参数的引用
11、SQL片段
12、动态SQL
13、结果集映射继承
结果集映射的继承的目的是为了映射定义的复用,比如下面定义了两个映射,AccountResult继承了base:
这样,就很容易扩展了一个映射策略。
14、查询注入
查询注入是在一个查询中嵌入另外一个查询,这样做的目的是为了实现实体对象之间的关联关联关系(一对一、一对多、多对多)分单项双向。有关这些内容,是比较复杂的,笔者对此做了深入研究,并分别写了三篇来讲述。
查询注入的实现就是在实体属性为另外一个实体或者实体集合的时候,引入一个相关的查询来实现,例如,客户和订单的映射关系:
public class Customer {
在这个映射中,为了查询客户的时候,能查询到相关的订单,可以在映射orderlist
属性的时候,将其指向另外一个查询orders.findByCustomerId
,这个查询是以Customer的id 为参数来查询的。
select="orders.findByCustomerId " 这个查询定义如下:
原理就是这么简单,然后根据实际情况,可以自由实现实体间的关联关系。
14、iBatis的分页查询
iBatis的分页有两种方式,一点都不神秘,不要被网上的流言所迷惑。
第一种方式:结果集筛选分页。先执行部分页的SQL查询语句,然后得到一个ResultSet,然后根据分页范围选择有效的记录填充到对象中,最终以集合的形式返回。对于10w条一下的记录的表,不存在性能问题,如果存在,你可以选择第二中方式。
第二种方式:SQL分页,通过组装分页类型的SQL来实现分页。这个关键在于分页参数的传递和分页SQL的构建。分页SQL构件每种数据库都不一样,不说了。分页参数的传递却可以通用。我主张用map分装入参,连同分页参数一块传递进来,就搞定了。如果原来没有考虑到分页,而用的是对象做参数,则可以通过apache
的
beanutils组件来实现一个object到map之间的转换工具,问题迎刃而解。
当然,这还不是分页查询应用的最高境界。思考,分页需要计算一个总记录数,记录数执行的sql返回值是count(?),条件是除了分页以外的条件,因此应该将查询SQL静态分开,以MySQL为例,可以将查询分为查什么,和什么条件两部分,在条件部分对分页参数进行动态判断,如果分页参数就不分页,如果有则分页。这样最后只需要两个组装的sql就可以计算总数和分页查询了。大大简化了问题的难度。
Oracle的解决思路也一样,不一样的地方就是拼装分页SQL改变了。
15、执行存储过程的配置
SQL Map
通过
的存储过程。
调用上面的存储过程将同时互换两个字段(数据库表)和参数对象(Map)中的两个
email地址。如果参数的 mode 属性设为 INOUT 或
OUT,则参数对象的值被修改。否则保持不变。
注意!要确保始终只使用 JDBC
标准的存储过程语法。参考 JDBC 的
CallableStatement
文档以获得更详细的信息。
16、就是iBatis中各种id的命名了,这个看起来小菜一碟,但是搞砸了会很痛苦。建议如果有DAO层的话,DAO接口的名字和SQL语句
id的名字保持一致。同时,在DAO中将save和update封装为一个方法(从Hibernate中学来的),这是非常好的。也可以直接在SQL层将插入和更新柔和在一块,太复杂,有点影响效率,这见机行事了。
17
、iBatis的查询也可以配置缓存策略,缓存的配置很复杂,分很多中情况,可以参看附件中的iBATIS-SqlMaps-2_cn.pdf
的39页内容,有详细介绍。
18、偷懒的最高境界,让程序去干哪里80%的体力活。自己仅仅把把关。任何重复的活动都有规律可循的,一旦发现了其中的规律,你就可以想办法把自己从中解脱出来。
-------------------------------------------------
下面是iBatis开发指南中内容:
附录:容易出错的地方
本附录是译者添加的,列出了初学者容易出错的地方,作为完成快速入门课程后的学习
笔记,可以让初学者少走些弯路。仅供参考。
1) 在 parameterMap 和 resultMap 中,字段数据类型是
java.sql.Types 类定义的常量名
称。常用的数据类型包括
BLOB,CHAR,CLOB,DATE,LONGVARBINARY,
INTEGER,NULL,NUMERIC,TIME,TIMESTAMP 和 VARCHAR
等。
2) 对于数据表中 NULLABLE 的字段,必须在 parameterMap
和 resultMap 中指定字段
的数据类型。
3) 对于数据类型是 DATE,CLOB 或 BLOB 的字段,最好在
parameterMap 和 resultMap中指定数据类型。
4) 对于二进制类型的数据,可以将 LONGVARBINARY
映射成 byte[]。
5) 对于文本类型较大的数据,可以将 CLOB 映射成
String。
6) Java Bean
必须拥有缺省的构造器(即无参数的构造器)。
7) Java Bean 最好实现 Serializable
接口,以备应用的进一步扩展。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/749537/viewspace-1115786/ ,如需转载,请注明出处,否则将追究法律责任。