随笔-67  评论-522  文章-0  trackbacks-0
    前两章我为大家详细介绍了如何搭建Maven环境、Spring MVC的流程结构、Spring MVCStruts2的区别以及示例中的一些配置文件的分析。在这一章,我就对示例的层次结构进行说明,以及MyBatis的一些简单介绍。
    本文不会对MyBatis作详细说明,大象还是假定阅读本文的朋友对MyBatis(ibatis)有最基本的了解,只有这样才能较好的理解本文的内容。关于MyBatis请查看它的官方文档及其它参考资料,本文不作详细讨论。
    一、工程结构图
    
    上面这是典型的Maven项目结构形式,使用本地仓库管理jar包的依赖,使用插件打包编译发布非常方便,让我们从传统的开发方式中解放出来,大家都快来使用Maven构建项目吧!
    二、映射文件
    使用MyBatis进行持久化操作,需要设置一个映射文件,一般来说,每张表对应一个实体对象和一个mapper映射文件。而MyBatis里面没有像Hibernate那样复杂的关联关系,所以,它的每个实体类其实就是一个很普通的POJO类。而映射文件中,都是SQL语句,下面就是示例中RoleMapper.xml的代码片段。
    
    那么,MyBatis是如何将数据库字段与POJO对象进行映射的呢?这是在它的内部,会将到得的结果或结构集,与我们定义的POJO对象属性进行映射,规则是,属性首字母小写,使用驼峰式命名方式,而字段则是单词与单词间,用下划线连接。比如:数据库有个USER_NAME字段,那么与它对应的属性就应该是userName。如果字段命名没有使用下划线,那么属性可以直接定义成该单词。比如,NAME字段,它的属性就是name
    三、基于namespace接口与公用dao的区别
    MyBatis3.0开始,对mapper中的namespace属性新增了一个特性:可以指定具体的接口来作为持久化操作类,在接口中定义与映射文件中id属性值相同的方法,MyBatis会自动去绑定和执行对应的SQL语句。这种接口实现方式,需要为每个Mapper创建一个接口,如果系统做大了,维护这些类会比较麻烦,大象个人倾向于基础服务式的Dao实现类,如例子中的MyBatisDao
    四、MyBatisDao
    持久化操作基类,SqlSessionDaoSupportmybatis-spring插件中封装的,用于获得SQL Session连接,执行数据库操作,我定义了几个常用的方法。
    关于mybatis-spring插件我简单介绍一下, Spring 3.x的发布并没有对MyBatis这一优秀的SQL框架提供支持,虽然在它的问题列表中已经有这样的请求,但直到目前3.0.5版的发布,都还没将这个问题处理掉。不过这难不倒开源世界里广大的爱好者与贡献者,mybatis-spring就是在这样的情况下诞生了。它是由MyBatis社区爱好者完成的一个开源项目,用来进行Spring 3.0MyBatis 3.0的配置整合。该插件需要运行在JDK 5.0或更高版本。
    
    五、
Service
    ssm3这个示例中,大家有没有发现,已经没有为每个entity定义一个dao,而是统一的调用MyBatisDao作为存储服务接口。另外与使用Hibernate的主要区别,就是不能直接传一个对象参数,还必须写上key值,它是namespace加上ID值。
    
    六、entity
    MyBatis的实体类就是一个简单的POJO对象,只是用来与表字段进行关联映射,请注意,我这里所说的映射不是像Hibernate那种绑定关系,只一种存放数据的对象而已。
    
    七、测试
    上面的步骤完成后,接下来就需要测试下我们的业务接口是否正常,编写一个测试类,为了达到目的,简便起见,大象是对RoleService进行测试,UserService同理类似。
    在写测试用例前,需要在POM文件中加入一个Srping测试依赖,这是大象在前面两章疏忽漏掉了,请大家谅解。
    
    然后编写测试类,运行测试,通过!
    
    到此,这一章的内容就讲完了,如果有对注解不理解的地方,请看下我之前的SSH2系列之三,至于MyBatis,它的内容太多了,如果不清楚还请先看下使用指南。下一章我将会介绍web,以及使用Spring MVC的注解来实现控制器功能。
    本文为菠萝大象原创,如要转载请注明出处。
http://www.blogjava.net/bolo/archive/2011/08/04/352845.html
posted on 2011-08-04 16:02 菠萝大象 阅读(21047) 评论(26)  编辑  收藏 所属分类: Spring3

评论:
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-04 16:04 | 菠萝大象
对不起大家,本来应该是六月份发布的,拖到现在,再次抱歉,满地打滚求谅解!  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-08 09:33 | taote
鸡动啊!!!!大象顺便说下,下一章啥时候出啊???  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-08 09:35 | 菠萝大象
@taote
争取月底吧,如果不行就下月  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-11 17:19 | 然然
如果要是mybatisDao里面没有的方法,是不是就必须逮写dao了。比如roleDao,

  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-11 17:30 | 菠萝大象
@然然
逮写是嘛意思?mybatisDao是基础调用方法,与业务无关的。我现在定义的里面唯一没有的就是分页查询基本方法,这个在后面会加的,更新操作与插入一样,在SqlSessionDaoSupport这个类里面,实质这两个在调用上,插入调用的还是更新的方法  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-12 10:28 | 然然
主要是我看到了文章里有这么一句话:
五、Service
在ssm3这个示例中,大家有没有发现,已经没有为每个entity定义一个dao,而是统一的调用MyBatisDao作为存储服务接口。

对于特殊的查询操作,比如涉及到多表联合查询或者是其他的,还是要写对应的dao的吧。
  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-12 10:34 | 菠萝大象
@然然
不用滴,你所有的涉及到sql的操作都是定义在配置文件中,然后根据namespace.id,由mybatis去执行对应的操作。你注意看RoleService中的方法,我只是一个调用而已,具体的sql都在rolemapper.xml中  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-12 11:04 | 然然
嗯,明白了。
也就是说,不管是何种复杂的sql操作,只要写在xml里面,
然后只要在mybatisDao里面定义了通用的调用方法,
在service里面调用mybatisDao即可,只不过namespace.id不同就可以了。
  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-12 11:10 | 菠萝大象
@然然
恭喜你回答对了!  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-12 11:32 | 然然
好期待你的分页查询基本方法。
上一个项目我们公司用的是ibatis,
因为比较匆忙,基本就没有封装。
每一个分页都是在sql方法里加上
where rownum <= #to#) where rn >= #from#
然后调用的时候传入to 和 from。
不知道有没有更好的方法。
  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-12 11:37 | 菠萝大象
@然然
这样写,大象感觉非常蛋疼,灰常灰常滴不好。ibatis里面是可以扩展一个类来进行封装的,而mybatis里面,则是需要自定义扩展插件,才可以实现,如果使用它自带的RowBounds,这货不是真正的分页,是内存式分页!  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-12 13:26 | 然然
这样写确实非常麻烦。都觉得ibatis咋这麻烦了,呵呵。还是自己水平不到家。
所以期待大象的下一章早点出来。哇咔咔。  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-16 14:56 | 然然
这blogjava为啥就木有一个给博主留言的地儿泥。。。。。  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-16 15:05 | 菠萝大象
@然然
一般就是在评论里写,我刚刚加了留言薄,你可以在那里留言给我  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-18 11:25 | 然然
@菠萝大象
看来在留言里不如在评论里。留言大象都不回复啊。
是我太唐突了,不好意思了。  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-19 08:59 | 菠萝大象
@然然
如果是评论,blogjava会跟我发一封邮件,留言的话就没有了,我是看到你的评论才看到你给我的留言,不好意思  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-26 10:08 | taote
大象,spring 加 mybatis的事务控制介绍一下,貌似用那个整合的包解决不了。。。,我在service中报异常,结果事务并不回滚。。。。  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-08-26 13:22 | 菠萝大象
@taote
哪个整合的包?我还没发源码呢?在第五篇中上传源码,耐心等等吧  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-09-11 08:09 | KimHo
spring结合mybatis的事务,的确是失效的,即使后台log显示已经有事务机制了。
这个我测试过好多次,mybaits3.0.6,spring3.1M2  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-09-11 11:52 | taote
@KimHo
呵呵。。上次我做测试的表设置成了myisam了,所以没有事物,换成innodb就ok了。你看下你是不是这个情况?  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2011-09-12 11:11 | KimHo
@taote
哦?还跟数据库有关?
这个还真没注意到
我用的是mysql数据库  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2012-02-24 18:25 | taote
看来大象最近很忙,已经好久没下文了!  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2012-07-30 16:12 | mozzian
你好 MyBatisDao 这个在配置XML那没有"sqlSessionFactory"或"sqlSessionTemplate''也可以吗. 怎么运行的...?  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2012-07-30 16:15 | 菠萝大象
@mozzian
请你到第五篇的最下面,把源码下下来看一看,里面是有配置的。  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2014-02-17 14:44 | 呆瓜
这么做会造成persistence和service的耦合,大的项目不推荐这么来做。  回复  更多评论
  
# re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) 2014-02-17 16:23 | 菠萝大象
@呆瓜
这样做是非常简单的,根据我的经验,业务相关的东西是经常变的,对业务层设定接口然后再写实现类是完全没必要的,直接用实现类就可以了。另外,我将存储定义成一个服务接口,也简化了不少工作,因为用的是MyBatis而不是Hibernate,所以有些东西是不需要的。还有因为这是学习示例,我没有进行抽象,像CRUD都是可以写进超类里面的,如果业务不复杂真正要的代码其实很少。系统架构是根据实际开发情况演进的,最适合的才是最好的,不是一定要公式化。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: