月度归档:2014年10月

关于mybatis中mapper引用另外一个mapper的resultMap或select的问题

先来看一下两个mapper:

UserMapper.xml——主要完成对用户表(user)的表操作

<mapper namespace=”com.A.xsstuser.impl.dao.UserDao”>
<resultMap id=”BaseResultMap” type=”com.kainaodong.xsstuser.impl.model.User”>
<id column=”user_id” jdbcType=”INTEGER” property=”userId” />
<result column=”nickname” jdbcType=”VARCHAR” property=”nickname” />
<result column=”school_id” jdbcType=”INTEGER” property=”schoolId” />
<result column=”password” jdbcType=”VARCHAR” property=”password” />
……
</resultMap>
……
</mapper>

 UserDetailMapper.xml——主要完成对用户详情表(UserDetail)的表操作

<mapper namespace=”com.A.xsstuser.impl.dao.UserDetailDao”>
<resultMap id=”UserDetailMap” type=”com.kainaodong.xsstuser.impl.model.UserDetail” >
<id column=”user_id” property=”userId” jdbcType=”INTEGER” />
<result column=”realname” property=”realname” jdbcType=”VARCHAR” />
<result column=”gender” property=”gender” jdbcType=”TINYINT” />
<result column=”birthday” property=”birthday” jdbcType=”DATE” />
……
</resultMap>
<sql id=”UserDetail_Base_Column_List” >
user_id, realname, gender, birthday
</sql>
<select id=”selectUserDetailById” resultMap=”UserDetailMap” parameterType=”java.lang.Integer” >
select
<include refid=”UserDetail_Base_Column_List” />
from user_detail
where user_id = #{userId,jdbcType=INTEGER}
</select>
</mapper>

现在有一个需求是需要将User表和UserDetail进行关联查询。我的设计是将这个操作放在UserMapper.xml里面。复杂的关联查询在网上都有很多说明了,这里就不复述了。

既然UserDetailMapper.xml中已经有了映射UserDetail表的列,因此按照编程习惯,肯定要复用一下的,所以根据网上的资料,一开始我在UserMapper.xml里面添加了如下resultMap:

<resultMap id=”UserJoinUserDetail” type=”User”>
<id column=”user_id” jdbcType=”INTEGER” property=”userId” />
<result column=”nickname” jdbcType=”VARCHAR” property=”nickname” />
<result column=”school_id” jdbcType=”INTEGER” property=”schoolId” />
<result column=”password” jdbcType=”VARCHAR” property=”password” />
……
<!– 关联userdetail表 –>
<association property=”userDetail” column=”user_detail” resultMap=”UserDetailMap” />
</resultMap>

保存,然后测试,嗯~妥妥的报错了。看了一下提示,大概就是UserDetailMap不存在的意思。那就奇怪了,明明在UserDetailMapper.xml中定义了的,为什么呢?然后就查看两个mapper,看到<mapper namespace ……>,难道由于namespace不同原因,所以果断将UserDetailMapper.xml的namespace换成和UserMapper的相同的。再测试,这次成功了,真的是namespace的原因。

那这样说,是不是应该同一个模块的mapper的namespace都设成一样呢?我测试了一下,如果改成其他名称如:User,启动的时候会报错(由于mapper是用mybatis的相关功能自动生成的,所以当时只引入了xml,而没将mapper 接口类引入,不然改了UserDetailMapper的namespace时,应该启动就报错)。原因是这个namespace有一个意义是指定相关POJO接口的路径,详情可查看以下链接。

Mybatis的namespace问题说明

那该怎么办,上网找,好像都没有很明确关于如何引用其他mapper文件中的resultMap的文章。那只能再回去看错误日志:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.A.kainaodong.xsstuser.impl.dao.UserDao.UserDetailMap

The error may exist in com/A/xsstuser/impl/dao/UserMapper.xml

细心看,其实可以发现,错误中com.A.kainaodong.xsstuser.impl.dao.UserDao.UserDetailMap的UserDetailMap前面还有一串东西,刚好也就是UserMapper的namespace,在UserMapper下当然是找不到UserDetailMap的了,那如果在UserDetailMap前加上UserDetailMapper的namespace的话可能可以,即:

<association property=”userDetail” column=”user_detail” resultMap=”com.A.xsstuser.impl.dao.UserDetailDao.UserDetailMap” />

然后保存,测试,通过。确实可以这样写。

如果不引用resultmap的话,可以应用其他文件的select,如下

<association property=”userDetail” column=”user_id” select=”com.kainaodong.xsstuser.impl.dao.UserDetailDao.selectUserDetailById” /> // 当然也要加上namespace咯。

出现这种问题,也可能由于我对mybatis的运行机制还不太了解。所以写一下这篇文章,整理一下思路。

 

git查看远程版本库和本地库的差异

git 中怎样查看未传送(git push)到远程代码库的(git commit)提交?

1,查看到未传送到远程代码库的提交次数
git status

显示结果类似于这样:

On branch master

Your branch is ahead of ‘origin/master’ by 2 commits.

2,查看到未传送到远程代码库的提交描述/说明
git cherry -v

显示结果类似于这样:
+ b6568326134dc7d55073b289b07c4b3d64eff2e7 add default charset for table items_has_images
+ 4cba858e87752363bd1ee8309c0048beef076c60 move Savant3 class into www/includes/class/

3,查看到未传送到远程代码库的提交详情
git log master ^origin/master

这是一个git log命令的过滤,^origin/master可改成其它分支。

(注:master是当前本地库的分支,origin/master指origin指定的远程库的master分支。当然,master可以改为任意其他分支。)

显示结果类似于这样:
commit 4cba858e87752363bd1ee8309c0048beef076c60
Author: Zam <zam@iaixue.com>
Date: Fri Aug 9 16:14:30 2013 +0800

move Savant3 class into www/includes/class/

commit b6568326134dc7d55073b289b07c4b3d64eff2e7
Author: Zam <zam@iaixue.com>
Date: Fri Aug 9 16:02:09 2013 +0800

add default charset for table items_has_images

总结:
git status 只能查看未传送提交的次数
git cherry -v只能查看未传送提交的描述/说明
git log master ^origin/master则可以查看未传送提交的详细信息

以上内容转载互联网上的。http://bbs.iaixue.com/forum.php?mod=viewthread&tid=1577

由第3点,其实可以想到,将远程和本地分支位置调换一下,即变成git log origin/master ^master,就可以查看远程库比本地库多的内容了。

不过得先执行git fetch origin master命令,将远程库的commit内容同步到本地库。fetch和pull的区别是:fetch只同步远程库的commit信息(log信息),但不会将文件同步到本地,pull则会将文件也同步到本地库。

使用git log的时候,也可以使用 -p 参数查看提交中的更详细信息。