设为首页 收藏本站
查看: 842|回复: 0

[经验分享] SQL Map XML 映射文件

[复制链接]

尚未签到

发表于 2016-11-11 05:51:17 | 显示全部楼层 |阅读模式
一个
SQL Map XML
映射文件可以包含任意多个
Mapped Statement, Parameter Map

Result Map.
按照它们之间的逻辑关系
,
为您的应用合理地组织
Mapped Statement, Parameter Map

Result Map.



typeAlias


节点



 
    <typeAlias>

节点让您为一个通常较长的、全限定类名指定一个较短的别名
.




   


<typeAlias alias=”shortname” 
type=”com.long.class.path.Class”/>



 


例如:

<typeAlias alias="user" type="com.ibatis.db.User"/>


 


  


Mapped Statements


SQL Map
的核心概念是
Mapped Statement.

Mapped Statement
可以使用任意的
SQL
语句
,
并拥有
Parameter Map(
输入
)

Result Map(
输出
).
如果是简单情况
, Mapped Statement
可以使用
JAVA
类来作为
Parameter

Result. Mapped Statement
也可以使用缓存模型
,
在内存中缓存常用的数据
. Mapped Statement
的结构如下所示
:

<statement id =”statementName”

    
[parameterClass=”some.class.Name”]


    
[resultclass=”some.class.Name”]


    
[parameterMap=”nameOfParameterMap”]


    
[resultMap=”nameOfResultMap”]


    
[cacheModel=”nameOfCache”] 
>


 
Select * from t_user where id =[?|#propertyName#]


 
order by [$simpleDynamic$]


</statement>

在上面的表达式中
,
括号
[]
里的部分是可选的属性
,
并具在某些情况下只有特定的组合才是合法的
.

 
 

1)Statements节点



<statement>
节点是个通用声明,可以用于任何类型的
SQL
语句。通常,使用具体的
statement
类型是个好主意。具体
statement
类型提供了更直观的
XML DTD
,并拥有某些<statement>节点没有的特性.下表总结了statement类型及其属性和特性:

 

 


Statement

类型






属性






子元素






方法






<statement>

 



id parameterClass resultClass parameterMap resultMap cacheModel xmlResultName

 



所有的动态元素


 



insert update delete
所有的查询方法


 



<insert>

 



id parameterClass parameterMap

 



所有的动态元素
<selectKey>


 



insert

update

 
delete


 



<update>

 



id

parameterClass parameterMap

 



所有的动态元素


 



Insert

Update

delete

 



<delete>

 



id parameterClass resultClass parameterMap resultMap cacheModel

 



所有的动态元素


 



所有的查询方法


 



<select>

 



id parameterClass resultClass parameterMap resultMap cacheModel

 



所有的动态元素


 



所有的查询方法


 



<procedure>

 



id parameterClass resultClass parameterMap resultMap xmlResultName

 



所有的动态元素


 



insert update delete
所有的查询方法


 



 
 
2)Sql

语句



SQL
显然是
Mapped Statement
中最重要的部分
,
可以使用对于数据库和
JDBC DRIVER
合法的任意
SQL
语句
.
只要在
JDBC DRIVER
支持
,
可能使用任意的函数
,
甚至是多条语句
.
因为
SQL
语句是嵌在
XML
文档中的
,
因此有些特殊的字符不能直接使用
,
例如大于号和小于号
(<>).
幸运的是
,
解决的办法很简单
,
只需将包含特殊字符的
SQL
语句放在
XML

CDATA
区里面就可以了
.
例如
:

 




<statement id = "getUserArrayById" parameterClass="int"
resultClass="user">
<![CDATA[
SELECT * FROM T_USER WHERE id > #value#
group by id
]]>
</statement>

  在
DAO


实现如下:


public List<User> findUserArrayById (Integer userId) throws Exception {
init();
List<User> list = sqlMap.queryForList("getUserArrayById", userId);
return list;
}
3)

自动生成主键



很多数据库支持自动生成主键的数据类型
.
不地这通常
(
并不总是
)
是个私有的特性
.SQL MAP
通过
<insert>
的子节点
<selectKey>
来支持自动生成的键值
.
它同时支持预生成
(

Oracle )
和后生成两种类型
(

MS-SQL server,
My sql
).
下面是几个例子
.

 

要实现自动生成主键有两个部分的内容:

  1. 


建表时,将
id
定义为主键并且加上

auto_increment”
设置为自动增加
.

例如
:

create table ibatis_db.t_user(id int(6)  


PRIMARY KEY
auto_increment
 
not null,


name varchar(15) not null, sex int(1) not null);

 

2


 


User.xml

文件中





<insert id="insertUser" parameterClass="user">
INSERT INTO t_user(id,name,sex) VALUES(#id#,#name#,#sex#)
</insert>
  修改为:

<!-- Oracle SEQUENCE  -->   
<insert id="insertUser-ORACLE" parameterClass="user">   
<selectKey resultClass="int" keyProperty="id" type="pre">   
<![CDATA[
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
]]>  
</selectKey>
<![CDATA[
INSERT INTO t_user(id,name,sex)VALUES(#id#,#name#,#sex#)
]]>
</insert>
4)


存储过程



  
SQL MAP


通过
<procedure>

节点支持存储过程
.

下面的例子说明如何使用具有输出参数的存储过程
.



<parameterMap id="swapParameters" class="map">
<parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
<parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
</parameterMap>
<procedure id="swapEmailAddresses" parameterMap="swapParameters">
{call swap_email_address(?,?)}
</procedure>
  
5)<statement>

的子节点的属性



1.parameterClass


 




<statement id="statementName" parameterClass="user">
INSERT INTO t_user VALUES(#id#,#name#,#sex#)
</statement>
   2.parameterMap





<parameterMap id ="insert-user-param" class="user">
<parameter property="id" />
<parameter property="name" />
<parameter property="sex" />
</parameterMap>
<statement id = "insertUser" parameterMap="insert-user-param">
INSERT   INTO   T_USER   (id,name, sex) VALUES   (?,?,?)
</statement>
   3.resultClass





<statement id="getUser" parameterClass="String" resultClass="user">
SELECT id,
name,
sex         
FROM t_user
WHERE name =#value#
</statement>
  4.resultMap





<resultMap id="get-user-result" class="user">
<result  property="id" column="id"/>
<result property="name"  column="name"/>
<result property="sex"  column="sex"/>
</resultMap>
<statement  id ="getUserList" resultMap="get-user-result">
select * from t_user
</statement>
  
5.cacheModel


 
cacheModel

的属性值等于指定的
cacheModel
元素的
name
属性值
.
属性
cacheModel
定义查询
mapped statement
的缓存
.
每一个查询
mapped statement
可以使用不同或相同的

 





<cacheModel id="user-cache" type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="insertUser"/>
<flushOnExecute statement="updateUser"/>
<flushOnExecute statement="deleteUser"/>
<property name="size" value="1000"/>
</cacheModel>
<statement id ="getUserList"  cacheModel="user-cache">
SELECT * FROM t_user
</statement>
  上面的例子中
,

24
小时刷新一次
,
或当更新的操作发生时刷新
.




  
6.xmlResultName


当直接把查询结果映射成
XML document

,
属性
xmlReesultName
的值等于
XML document
根节点的名称
.
例如
:

 





<select  id="getUserById" parameterClass="int" resultClass="xml" xmlResultName="user">
SELECT id ,
name ,
sex
FROM t_user
WHERE id =#value#
</select>
  调用如下
: 
String str = (String) sqlMap.queryForObject("getUserById", id);


上面的查询结果将产生一个
XML document,
结构如下
:

 





<?xml version="1.0" encoding="UTF-8" standalone="no"?><user><id>1</id><name>user001</name><sex>0</sex></user>
   
 




  
 



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-298531-1-1.html 上篇帖子: [SQLSERVER]SQL中的全文检索 下篇帖子: 解决SQL Server2005内存一直上飙
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表