一:resultMap
ibatis结果映射是可以自动映射的,不过这样子的话,第一次的开销会比较大,而且也不利于早点发现代码bug。因此使用resultMap来进行结果映射是比较有价值的。
我之前的代码中,是没有使用result映射的,因此代码中使用的都是自动映射。代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Skn">
<!-- Use type aliases to avoid typing the full classname every time. -->
<typeAlias alias="UserAccount" type="com.skn.ibatis.domain.UserAccount" />
<!-- A simpler select example without the result map. Note the aliases to
match the properties of the target result class. -->
<span style="color:#ff0000;"><select id="selectAccountById" resultClass="UserAccount">
select
userID as userID,
userName as userName,
password as password
from
shikenian.user_account where userid= #id#
</select>
</span>
<insert id="insert_userAccount">
insert into shikenian.user_account
values
(3,'insertuser','insertpassword')
</insert>
</sqlMap>
上面标红出处的代码可以看到,使用sql语句查询出来的结果会自动地映射到我们的UserAccount中。
现在对这块代码改写成自动映射的形式,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Skn">
<!-- Use type aliases to avoid typing the full classname every time. -->
<typeAlias alias="UserAccount" type="com.skn.ibatis.domain.UserAccount" />
<!-- A simpler select example without the result map. Note the aliases to
match the properties of the target result class. -->
<span style="color:#ff0000;"><resultMap id="AccountResult" class="UserAccount">
<result property="userID" column="USERID" />
<result property="userName" column="USERNAME" />
<result property="password" column="PASSWORD" />
</resultMap>
<select id="selectAccountById" resultClass="UserAccount" resultMap="AccountResult">
select
USERID,USERNAME,PASSWORD
from
shikenian.user_account where userid= #value#
</select></span>
<insert id="insert_userAccount">
insert into shikenian.user_account
values
(3,'insertuser','insertpassword')
</insert>
</sqlMap>
入上面的红色部分的配置,定义一个映射的元素 resultMap,然后把这个映射的ID放到select 元素中,作为resultMap属性的值。
最后可以得到一样的结果,这种方式,更加安全,也更加高效。
resultMap的好处:
1:查询结果检查
我们可以在resultmap中定义某个列数据的类型,有如下几种,我们可以强制定义好我们需要映射的结果类型,如果和jopo中定义的不同的话,这样就会主动报错了,可以减少程序的bug,增加程序的严密性。
如果想要使你的应用程序更加严密并且尽可能地消除运行时错误,就i青使用显式参数映射和
\ï\式结果l决射,并且对于参数和结果都使用强类型的bean (而不是Map)。这也将使你的应用程
序启动更快(因为这样iBATIS就不需要在应用程序加载II-t立即把所有这些显式映射都载入内存,
而是在需要时,.1-载入),运行更快,并且所使用的内存更少。
二:parameterMap
调用ibatis的插入语句的时候,为了程序的稳定性和严密性,减少运行时异常的发生,需要对输入的参数进行强制类型的制定,当然,ibatis也可以动态地进行参数输入,不过这样子会消耗系统的性能,而且安全性也不高,容易出错。
使用parameterMap可以很好地解决这个问题.。
如上面的xml配置文件中,我把xml文件改写如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Skn">
<!-- Use type aliases to avoid typing the full classname every time. -->
<typeAlias alias="UserAccount" type="com.skn.ibatis.domain.UserAccount" />
<!-- A simpler select example without the result map. Note the aliases to
match the properties of the target result class. -->
<resultMap id="AccountResult" class="UserAccount">
<result property="userID" column="USERID" javaType="int" />
<result property="userName" column="USERNAME" />
<result property="password" column="PASSWORD" />
</resultMap>
<select id="selectAccountById" resultClass="UserAccount"
resultMap="AccountResult">
select
USERID,USERNAME,PASSWORD
from
shikenian.user_account
where userid= #value#
</select>
<span style="color:#ff0000;"><parameterMap class="UserAccount" id="UserAccountParMap">
<parameter property="userID" jdbcType="NUMBER" />
<parameter property="userName" jdbcType="VARCHAR2" />
<parameter property="password" jdbcType="VARCHAR2" />
</parameterMap>
<insert id="insert_userAccount" parameterClass="UserAccount"
parameterMap="UserAccountParMap">
insert into shikenian.user_account
(userID,userName,password)
values
(?,?,?)
</insert></span>
</sqlMap>
代码中,parameter中,property和java代码中传入的类中的属性要相同,并且要显示指定参数的类型。
java代码如下:
UserAccount account = new UserAccount();
account.setUserID(new Integer(4));
account.setUserName("yanqingshang");
account.setPassword("qingshangyan");
sqlMap.insert("Skn.insert_userAccount", account);
这样可以把参数插入到数据库中了。