Mybatis的两种写法。。。

在网上搜索Mybatis的教程,看到了2个:
1.http://wanqiufeng.blog.51cto.com/409430/515132

这里会先定义一个UserMapper的Interface
然后使用的时候
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUser("jun");

2.http://blog.csdn.net/weoln/article/details/5782750

这里就没有Interface
直接使用

Goods goods = (Goods)session.selectOne("com.oryx.mybatis.GoodsMapper.selectGoods",1);

看了论坛里关于是不是可以不写DAO的讨论,但只是稍微有点概念,但是具体Mybatis的原理还是没搞清楚。

第一种,如果mybatis本身的Mapper层就是一个接口的话,那么它的实现应该是xml文件了,这里的UserMapper userMapper =sqlSession.getMapper(UserMapper.class);算是什么? 这个userMapper是谁的实现呢? Mapper的还是用户自定义那个UserMapper的? 感觉像是UserMapper这个接口的,但是具体的sql访问(DaoImp)是谁来完成的呢? 感觉又是xml文件来完成的,所以就有点晕了。。。
用户自定义的接口和框架提供的借口到底是一种什么关系,框架又是怎么自动帮助用户自定义的接口实现其中的方法的?

第二种,

能解释下这里面的原理么? selectOne都做了哪些步骤?

第一种,UserMapper userMapper =sqlSession.getMapper(UserMapper.class);得到了一个UserMapper的代理。核心是JDK的动态代理。你只要定义UserMapper这个接口的方法getUser就可以了,mybatis生成代理,也是实现UserMapper接口的,然后解析xml,调用SQL,返回结果给你。你自己则根本感觉不到代理的存在,感觉就是在调用UserMapper。

第二种,selectOne就是选择一条记录,解析xml里sql,把参数绑定上去,执行sql,最后把sql返回的结果填充到Goods对象里。内部实现都是jdbc啦,只不过不用你写这些琐碎的细节了,全有mubatis搞定。

底层代码里,第一种其实最后还是会调用第二种的selectOne的。

如果把现有的hibernate中的配置移植到spring中,是完全正常的

mapper 接口方式,是mybatis3 中 基于接口形式。通过 xml 中与接口的 ID 映射关系,进行SQL 调用。
而 你说的 selectOne 是 mybatis 本身 以前基于JDBC 数据库模板操作的 一种方式。就像hibernate session.save 之类的。不知道你是否明白