iBatis配置体会
SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。
1、命名空间:
<sqlMap namespace="Account">,在此空间外要引用此空间的元素,则需要加上命名空间名。
2、实体的别名:
<typeAlias alias="Account" type="com.lavasoft.ibatissut.simple.domain.entity.Account"/>
如果有用到的全名的地方,可以用别名代替,受命名空间约束。
3、插入操作
对于自增主键的表,插入可以不配置插入的主键列。否则是必须的。
4、获取主键
插入语句之前配置:主要是针对Sequence主键而言,插入前必须指定一个主键值给要插入的记录。Oracle、DB2亦如此,方法是在插入语句标签<insert....>之前配置上:
Xml代码
<insert id="insertAccount" parameterkeyProperty="sctId"> SELECT SEQ_TEST.NEXTVAL FROM DUAL </selectKey> insert into .... ........ </insert> <insert id="insertAccount" parameterkeyProperty="sctId"> SELECT SEQ_TEST.NEXTVAL FROM DUAL </selectKey> insert into .... ........ </insert>插入语句之后配置:主要是针对自增主键的表而言,这类表在插入时不需要主键,而是在插入过程自动获取一个自增的主键。比如MySQL
<insert id="insertAccount" parameterkeyProperty="sctId"> SELECT LAST_INSERT_ID() </selectKey> insert into .... ........ </insert> <insert id="insertAccount" parameterkeyProperty="sctId"> SELECT LAST_INSERT_ID() </selectKey> insert into .... ........ </insert>
<dynamic prepend="where"> <isNotEmpty prepend="and" property="$$$$$"> $name like '%'|| #$name# ||'%' </isNotEmpty> <isGreaterThan prepend="and" property="$$$$$" compareValue="$$$number"> $code like '%'|| #$code# ||'%' </isGreaterThan> </dynamic> <dynamic prepend="where"> <isNotEmpty prepend="and" property="$$$$$"> $name like '%'|| #$name# ||'%' </isNotEmpty> <isGreaterThan prepend="and" property="$$$$$" compareValue="$$$number"> $code like '%'|| #$code# ||'%' </isGreaterThan> </dynamic>当然,prepend表示链接关键字,可以为任何字符串,当为sql关键字时,iBatis自动判断是否应该添加该关键字。该语法也很简单,关键是要会用心思考组织动态SQL。
<resultMap id="base" column="ACC_ID"/> <result property="firstName" column="ACC_FIRST_NAME"/> <result property="lastName" column="ACC_LAST_NAME"/> </resultMap> <resultMap id="AccountResult" extends="Account.base"> <result property="emailAddress" column="ACC_EMAIL"/> </resultMap> <resultMap id="base" column="ACC_ID"/> <result property="firstName" column="ACC_FIRST_NAME"/> <result property="lastName" column="ACC_LAST_NAME"/> </resultMap> <resultMap id="AccountResult" extends="Account.base"> <result property="emailAddress" column="ACC_EMAIL"/> </resultMap>
public class Customer { private Long id; private String name; private String address; private String postcode; private String sex; private List<Orders> orderlist = new ArrayList<Orders>(); public class Customer { private Long id; private String name; private String address; private String postcode; private String sex; private List<Orders> orderlist = new ArrayList<Orders>(); <resultMap id="result" column="id"/> <result property="name" column="name"/> <result property="address" column="address"/> <result property="postcode" column="postcode"/> <result property="sex" column="sex"/> <result property="orderlist" column="id" select="orders.findByCustomerId "/> </resultMap> <resultMap id="result" column="id"/> <result property="name" column="name"/> <result property="address" column="address"/> <result property="postcode" column="postcode"/> <result property="sex" column="sex"/> <result property="orderlist" column="id" select="orders.findByCustomerId "/> </resultMap>
select="orders.findByCustomerId " 这个查询定义如下: <select id="findByCustomerId" resultMap="result_base" parameter这个查询定义如下: <select id="findByCustomerId" resultMap="result_base" parametername="code"> <parameterMap id="swapParameters" 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> 调用上面的存储过程将同时互换两个字段(数据库表)和参数对象(Map)中的两个 email地址。如果参数的 mode 属性设为 INOUT 或 OUT,则参数对象的值被修改。否则保持不变。