iBATIS SQL Maps
让我们重回到车辆管理系统和张三的故事中。
在 iBATIS SQL Maps 的世界里也存在 one-to-many、many-to-one 的关系,想必你已经对这些概念驾轻就熟了。好!还是每个 People 对应多条 AutoInfo 信息。
本系列文章第一部分提到过 iBATIS SQL Maps 的映射文件个数可以人为设定,但是,把一组有共性的操作放在一起是首选策略。下面我们看看为张三首次买车所生成的映射文件是怎样的:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap <sqlMap namespace="AutoMag"> <insert id="insertPeople" parameterClass="bo.People"> |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap <sqlMap namespace="AutoMag"> <insert id="insertPeople" parameterClass="bo.People"> |
sqlMap
sqlMap 元素拥有属性 namespace="…",定义了该 XML 文件命名空间。如果你在配置文件SqlMapConfig.xml 中指定了 settings 元素的属性 useStatementNamespaces="true",那么就可以按照命名空间的方式访问 Mapped statement,比如 namespace=" AutoMag",相应 Java 代码:sqlMap.insert("AutoMag.insertPeople",people)。这样做是为了防止不同映射文件中出现同名 Mapped statement 而产生冲突。什么是 Mapped statement ?
Mapped statement
iBATIS SQL Maps 的核心概念就是 Mapped statement!Mapped Statement 可以使用任意的 SQL 语句,利用 POJO、原始变量及其 Wrapper Class 作为输入(parameter class)和输出(result class)。
Mapped Statement 包含以下几种类型:
insert 对应数据库的 insert 操作,该操作返回本次操作插入记录的主键值。
select 对应数据库的 select 操作,该操作返回特定的 POJO 或 对象。
update 对应数据库的 update 操作,该操作返回被更新的记录个数。
delete 对应数据库的 delete 操作,该操作返回被删除的记录个数。
procedure 对应数据库存储过程。
statement 类型最为通用,可以代替以上所有的类型。但由于缺乏操作直观性故不推荐。
insert id="insertPeople" parameterClass="bo.People"
定义了 insert 类型的 Mapped Statement。属性 id="insertPeople" 定义操作名称,parameterClass="bo.People" 定义传入参数为 People 对象实例,框架可确保其属性持久化到数据库相应字段中。由于 SQL 语句会包含“<>”这样的符号,容易和 XML 产生冲突,放进 <![CDATA[……]]> 区域就可避免。insert into people (name, address) values (#name#, #address#),是一条普通的 SQL 语句,“#name#、#address#”利用 Java 反射机制访问 People 对象实例的相应属性。
selectKey resultClass="java.lang.Integer" keyProperty="id"
iBATIS SQL Maps 通过 <insert> 元素的子元素 < selectKey> 来支持主键自动生成。resultClass="java.lang.Integer" 定义返回对象为 int 的 Wrapper Class。keyProperty="id" 定义了主键名称。本例是 MySQL 主键生成方式,参考官方文档,MySQL 的主键生成无需人为来控制,也就是说可不使用<selectKey> 而由数据库自动处理。但我测试发现,在执行 insert 操作以后,程序没有返回本次操作插入记录的主键值。在官方论坛上也有很多用户提出这样的疑惑,作者的答复是:这和 JDBC Driver 有关系。不可能把驱动一一测试吧?一劳永逸的办法是使用 <selectKey> 元素。以下是 Oracle 和 SQL Server 主键生成方法:
< !- Oracle -> <!- Microsoft SQL Server -> |
< !- Oracle -> <!- Microsoft SQL Server -> |
insert into auto_info (license_plate, owner_no) VALUES (#licensePlate#, #ownerNo.id#)
在插入了 people 记录后,要为 auto_info 插入记录。基本原则和之前遇到过的一样,只是”owner_no”这个字段值由 AutoInfo 对象属性”ownerNo”获得,该属性类型为 People。这是由于我沿用了 Hibernate 产生的 POJO,如果你愿意,完全可以把”ownerNo”替换为 Integer 类型。
编程中几个关键对象
com.ibatis.common.resources.Resources 对象负责从 XML 得到 java.io.Reader 抽象类的实例,供工厂方法调用。
com.ibatis.sqlmap.client.SqlMapClientBuilder 构造 SqlMapClient 实例。
com.ibatis.sqlmap.client.SqlMapClient 是 iBATIS SQL Maps 核心组件,可以说我们的编程工作都是围绕着它展开。
形成的 one-to-many 保存如下:
package test; import java.io.Reader; import com.ibatis.sqlmap.client.*; import bo.*; public class AutoMag { private Reader reader; AutoInfo autoInfo=new AutoInfo(); |
package test; import java.io.Reader; import com.ibatis.sqlmap.client.*; import bo.*; public class AutoMag { private Reader reader; AutoInfo autoInfo=new AutoInfo(); |
程序和 Hibernate 写法差不多,我感觉甚至比 Hibernate 更简单。我可以显示的进行 insert 操作,符合传统JDBC 编程习惯。iBATIS SQL Maps 支持自动事务处理,可以不用写明 startTransaction、commitTransaction。但如果 People insert 操作成功,而 AutoInfo insert 操作失败,就破坏了两次 insert 操作的原子性。最后endTransaction 包含异常情况下的回滚事务和关闭连接池连接两种功能。
iBATIS SQL Maps的更多相关文章
- Ibatis学习总结1--ibatis简介和SQL Maps
最佳维护的一个项目使的是ibatis框架,在闲暇之余将手头的开发手册和平时开发的理解做一下总结,言归正传. 简介 使用 SQL Map,能够大大减少访问关系数据库的代码.SQL Map 使用简单的 X ...
- Ibatis sql语句1
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-/ ...
- Ibatis sql语句
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-/ ...
- iBatis + SQL Server 项目开发实战小结
几年前跟随项目经理做的一个ERP小项目,自己业余时间整理的开发手册,供参考. 开发环境配置:编程环境为Microsoft Visual Studio 2010,数据库是SQL Server 2008 ...
- iBATIS sql(XML)中的大于、小于、like等符号写法
其实就是xml的特殊符号,因为它的配置就是xml,所以可以用下面这种写法转义 < < > > <> < ...
- Spring3+ibatis (SQL Server)+pager-taglib.tld查询分页的实现
pager-taglib分页開始~ 查了好多关于分页的技术,终于选定下面方法实现~ 1.首先下载jar包:pager-taglib.jar,pager-taglib.jar放在WEB-INF/lib文 ...
- IBATIS sql 小于(<) 写法 特殊符号写法
SELECT * FROM XXX where column1 <![CDATA [ < 100 ]]> ************************************ ...
- 数据持久层框架iBatis, Hibernate 与 JPA 比较
在本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persistence API(JPA).我们介绍每种解决方案并讨论其所规定的品质,以及在广泛 ...
- ibatis的动态Mapped Statement 标签
动态Mapped Statement 直接使用JDBC 一个非常普遍的问题是动态SQL.使用参数值.参数本身和数据列都是动态的SQL,通常非常困难.典型的解决方法是,使用一系列if-else 条件语句 ...
随机推荐
- DAS存储未死,再次欲获重生
当我们回想存储发展形态时.我们会想到DAS是最原始最主要的存储方式,在个人电脑.server等低端市场和场景上随处可见. 存储的原始形态也来自于DAS,常见的用于连接DAS和主机系统的协议/标准主要 ...
- Unity时钟定时器插件——Vision Timer源码分析之二
Unity时钟定时器插件——Vision Timer源码分析之二 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面的已经介绍了vp_T ...
- hdu 1087 简单dp
思路和2391一样的.. <span style="font-size:24px;">#include<stdio.h> #include<strin ...
- MySQL 中now()时间戳用法
MySQL 中now()时间戳用法 UPDATE news set addtime = unix_timestamp(now()); #结果:1452001082
- setTimeout模拟setInterval调用
在开发环境下,尽量不用间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动. 尽量使用超时调用来模拟间歇调用. 示例代码: <!DOCTYPE html> <html l ...
- Spring 泛型依赖注入
BaseService<T>:有RoleService和UserService两的子类 BaseRepepositry<T>:有UserRepository和RoleRepos ...
- RedHat Enterprise Linux 6 配置Xmanager ,实现图形界面连接
我们经常见到的几种最为常用的windows下远程管理Linux服务器的方法,基本上都是利用SecureCRT,或者是PUTTY等客户端工具通过ssh服务来实现Windows下管理Linux服务器的,这 ...
- 通过CSS3,实现元素覆盖效果
在非常多站点中,我们都能够看到这种效果.当用户鼠标进入某一个元素后,下方就会有遮罩层上浮动画,如图: 今天我们就用hover伪类加上css3实现,没有使用不论什么JS <!DOCTYPE htm ...
- 【NEWS】 ADempiere发布ADempiere 3.8.0路线图【2013年7月28日】
发布源:http://osssme.org/cms/?q=node/17 本以为ADempiere”已死“,但是看到ADempiere的WIKI上大概在从5月28日开始添加WIKI以来,经过多次更新后 ...
- pycharm 控制台字体背景颜色设定让你美到爆
还在为你控制台字体颜色不入眼而发愁吗? 在某些特殊时刻想要改变下字体的颜色却无从下手而发愁吗? 那你就进来看一看,瞧一瞧,之需看2分钟,花2分钟理解,花3分钟练练手就能让你的控制能字体炫酷起来! 一. ...