ibatis 学习外篇之 resultMap parameterMap

一: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);

这样可以把参数插入到数据库中了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值