首页 > Java, 挨踢(IT) > MyBATIS问题解答(一)-内联映射和外部映射的区分

MyBATIS问题解答(一)-内联映射和外部映射的区分

2012年10月8日 发表评论 阅读评论 1,588 人阅读    

  在“MyBATIS(即iBATIS)的问题集” 中,我针对MyBATIS提出来一些问题。有两个方面的的用途:一,加深自己对MyBATIS的理解;二,勾起网友的兴趣,希望能有更多对MyBATIS感兴趣的朋友来讨论,分享自己积累的MyBATIS的知识,推动MyBATIS的应用

  针对这些问题中的一部分,我先给出我的解答。如果有哪些不对的地方,希望网友指正。另外,如果有对MyBATIS感兴趣的朋友,但是又想找个入门级的例子,“MyBATIS(即iBATIS)入门实例讲解”希望能代领您入门。

  问题三:iBATIS中有映射参数有两种形式:内联映射(inline mapping)和外部映射(external mapping)。这两个有什么区别?各自的优缺点是什么?使用时,改如何选择?

  解答:说实话,这个问题不太好说。我也不太会解释。还是用实例说话吧。我们还接着“MyBATIS(即iBATIS)入门实例讲解”中的应用场景来写例子,这里的业务是:查询ID为N的用户。我们使用内联映射和外部映射分别写出来,然后再对比之间的区别。在“入门”例子中,“查询”是内联映射来写的。我们来写一个外部映射的例子。对比一下:(这里为了对比效果更明显,我只写出来查询,对于其他三个“增删改”的例子,可以自己动手完成)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.diguage.ssm.domain.UserMapper">

	<resultMap id="UserResultMap" type="User">
		<id property="id" column="id" javaType="int" jdbcType="NUMERIC" />
		<result property="name" column="name" />
		<result property="password" column="password" />
		<result property="sex" column="sex" />
		<result property="birthday" column="birthday" javaType="Date"
			jdbcType="DATE" />
		<result property="email" column="author_email" />
	</resultMap>

	<select id="query" parameterType="int" resultMap="UserResultMap">
		SELECT * FROM
		user WHERE id = #{id}
  	</select>
</mapper>

  请注意,高亮部分。大家可以可以“入门”中的映射对比一下,看看有哪些异同?

  细心的朋友也许已经发现了,使用外部映射,可以制定Java对象模型中,每一个属性对应的数据库中表的列名、列的数据类型以及模型对象的属性的数据类型,甚至typeHandler也可以指定。

  这里先说明一下,参数映射细分的话,还分为“参数映射”和“结果映射”。学过“排列组合”的朋友应该明白,这两种再组合,就分为“外部参数映射”、“外部结果映射”、“内联参数映射”和“内联结果映射”。这里的例说明四种情况都适合。

  言归正传,其实使用内联映射也可以指定这些。“内联参数映射”语法如下:

#{property,javaType=int,jdbcType=NUMERIC} 

  上面的是MyBATIS的语法;iBATIS的语法是:

#property,javaType=int,jdbcType=NUMERIC#

  另外,据iBATIS的创始人Clinton Begin说,如果没有明确说明iBATIS究竟使用哪种数据库类型,iBATIS会默认使用java.sql.Types.OTHER作为默认一个类型说明,通过setNull(int parameterIndex, int sqlType)方法的第二个参数传递给数据库。但是一些数据库驱动程序不允许这么做(例如Oracle)。至于MyBATIS是否也存在这样的问题,还要进一步验证再说。所以,我个人认为最好把这些参数类型说明比较好,避免出现一些潜在的问题。

  这里,还需要说明一点。如果在有很多查询功能,同时查询功能的结果集是一样的,那么在修改结果集时,外部结果映射的一大优点就显示出来了。只需要修改一个地方,就可以把结果集全部修改。因为这只是个例子程序。所以,并没有很多的查询,所以这个优点显示的不是很明显。

  以上就是这个问题的回答。我觉得不尽如人意,回答的不是很好。希望感兴趣的朋友能再多多补充。

  问题九:向数据库新增数据时,保存后,对象的ID是否会自动的回填到原来的对象中?

  这个问题在“MyBATIS(即iBATIS)入门实例讲解”中已经通过实例回答了这个问题,可以参考那篇文章。不再赘述。



作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/65.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

分类: Java, 挨踢(IT) 标签: , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.