让我们重回到车辆管理系统和张三的故事中。
在 iBATIS SQL Maps 的世界里也存在 one-to-many、many-to-one 的关系,想必你已经对这些概念驾轻就熟了。好!还是每个 People 对应多条 AutoInfo 信息。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="AutoMag">
<insert id="insertPeople" parameterClass="bo.People"> <![CDATA[ insert into people (name, address) values (#name#, #address#) ]]> <selectKey resultClass="java.lang.Integer" keyProperty="id"> <![CDATA[ select last_insert_id(); ]]> </selectKey> </insert> <insert id="insertAutoInfo" parameterClass="bo.AutoInfo"> <![CDATA[ insert into auto_info (license_plate, owner_no) VALUES (#licensePlate#, #ownerNo.id#) ]]> </insert> </sqlMap> |
sqlMap
Mapped statement
iBATIS SQL Maps 的核心概念就是 Mapped statement!Mapped Statement 可以使用任意的 SQL 语句,利用 POJO、原始变量及其 Wrapper Class 作为输入(parameter class)和输出(result class)。
insert 对应数据库的 insert 操作,该操作返回本次操作插入记录的主键值。
select 对应数据库的 select 操作,该操作返回特定的 POJO 或 对象。
update 对应数据库的 update 操作,该操作返回被更新的记录个数。
delete 对应数据库的 delete 操作,该操作返回被删除的记录个数。
procedure 对应数据库存储过程。
insert id="insertPeople" parameterClass="bo.People"
selectKey resultClass="java.lang.Integer" keyProperty="id"
< !- Oracle ->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product"> <selectKey resultClass="int" keyProperty="id" > SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL </selectKey> insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) </insert> <!- Microsoft SQL Server -> <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product"> insert into PRODUCT (PRD_DESCRIPTION) values (#description#) <selectKey resultClass="int" keyProperty="id" > SELECT @@IDENTITY AS ID </selectKey> </insert> |
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 核心组件,可以说我们的编程工作都是围绕着它展开。
package test;
import java.io.Reader;
import com.ibatis.sqlmap.client.*;
import com.ibatis.common.resources.*; import bo.*;
public class AutoMag {
private Reader reader;
private SqlMapClient sqlMap; private String resource = "SqlMapConfig.xml"; public void insertPeople() throws Exception{ try{ reader = Resources.getResourceAsReader(resource); sqlMap=SqlMapClientBuilder.buildSqlMapClient(reader); sqlMap.startTransaction(); People people=new People(); people.setName("张三"); people.setAddress("中国"); sqlMap.insert("insertPeople",people); AutoInfo autoInfo=new AutoInfo(); autoInfo.setLicensePlate("A00001"); autoInfo.setOwnerNo(people); sqlMap.insert("insertAutoInfo",autoInfo); sqlMap.commitTransaction(); }finally{ sqlMap.endTransaction(); } } } |