首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

基于引语的mybatis和spring整合

2012-06-26 
基于注解的mybatis和spring整合ibatis改名为mybatis已经将近一年了,mybatis3也发布了,但是相关的开发文档

基于注解的mybatis和spring整合
ibatis改名为mybatis已经将近一年了,mybatis3也发布了,但是相关的开发文档却很少,查阅了官方的使用指南,也是说的模糊不清,一笔带过,尤其是注解部分,只是列举了注解种类,却没有对应的例子,因此可能会给某些兄弟使用mybatis注解带来困惑,我想就我微薄的知识想对mybatis注解的使用以及和spring整合谈谈自己的看法,也希望大家猛烈的指正我的错误。

首先当然得下载mybatis-3.0.5.jar和mybatis-spring-1.0.1.jar两个JAR包,并放在WEB-INF的lib目录下(如果你使用maven,则jar会根据你的pom配置的依赖自动下载,并存放在你指定的maven本地库中,默认是~/.m2/repository),前一个是mybatis核心包,后一个是和spring整合的包。

使用mybatis,必须有个全局配置文件configuration.xml,来配置mybatis的缓存,延迟加载等等一系列属性,该配置文件示例如下:


该文件放在资源文件的任意classpath目录下,假设这里就直接放在资源根目录,等会spring需要引用该文件。

查看ibatis-3-config.dtd发现除了settings和typeAliases还有其他众多元素,比如properties,objectFactory,environments等等,这些元素基本上都包含着一些环境配置,数据源定义,数据库事务等等,在单独使用mybatis的时候非常重要,比如通过以构造参数的形式去实例化一个sqlsessionFactory,就像这样:

配置中的${}都是占位符,在你指定数据库驱动打war时会自动替换,替换的值在你的父pom中配置,至于c3p0连接池的各种属性详细信息和用法,你自行参考c3p0的官方文档,这里要说明的是checkoutTimeout元素,记得千万要设大一点,单位是毫秒,假如设置太小,有可能会导致没等数据库响应就直接超时了,小弟在这里吃了不少苦头,还是基本功太差。

数据源配置妥当之后,我们就要开始非常重要的sessionFactory配置了,无论是hibernate还是mybatis,都需要一个sessionFactory来生成session,sessionFactory配置如下:

testSqlSessionFactory有两处注入,一个就是前面提到的mybatis全局设置文件configuration.xml,另一个就是上面定义的数据源了(注:hibernate的sessionFactory只需注入hibernate.cfg.xml,数据源定义已经包含在该文件中),好了,sessionFactory已经产生了,由于我们用的mybatis3的注解,因此spring的sqlSessionTemplate也不用配置了,sqlSessionTemplate也不用注入到我们的BaseDAO中了,相应的,我们需要配置一个映射器接口来对应sqlSessionTemplate,该映射器接口定义了你自己的接口方法,具体实现不用关心,代码如下:

对应于sqlSessionTemplate,testMapper同样需要testSqlSessionFactory注入,另外一个注入就是你自己定义的Mapper接口,该接口定义了操作数据库的方法和SQL语句以及很多的注解,稍后我会讲到。到此,mybatis和spring整合的文件配置就算OK了(注:如果你需要开通spring对普通类的代理功能,那么你需要在spring配置文件中加入<aop:aspectj-autoproxy />),至于其他的如事务配置,AOP切面注解等内容不在本文范围内,不作累述。

至此,一个完整的myabtis整合spring的配置文件看起来应该如下所示:



到此为止,我们只讲了mybatis和spring的整合,还没有真正触及mybatis的核心:使用mybatis注解代替映射文件编程(不过官方文档也说了,如果真正想发挥mybatis功能,还是需要用到映射文件,看来myabtis自己都对mybatis注解没信心,呵呵),通过上述内容,我们知道配置搞定,但是testMapper还没有被实现,而注解的使用,全部集中在这个testMapper上,是mybatis注解的核心所在,先来看一下这个testMapper接口是个什么样的:

注意文件中的namespace路径必须是使用@resultMap的类路径,此处是TestMapper,文件中 id="getByTestText"必须和@resultMap中的value = "getByTestText"保持一致。

@InsertProvider(type = TestSqlProvider.class, method = "insertSql") :用法和含义@SelectProvider一样,只不过是用来插入数据库而用的。

@Options(flushCache = true, timeout = 20000) :对于需要更新数据库的操作,需要重新刷新缓存flushCache = true使缓存同步。

@UpdateProvider(type = TestSqlProvider.class, method = "updateSql") :用法和含义@SelectProvider一样,只不过是用来更新数据库而用的。

@Param("testBean") :是一个自定义的对象,指定了sql语句中的表现形式,如果要在sql中引用对象里面的属性,只要使用testBean.id,testBean.textText即可,mybatis会通过反射找到这些属性值。

@DeleteProvider(type = TestSqlProvider.class, method = "deleteSql") :用法和含义@SelectProvider一样,只不过是用来删除数据而用的。

现在mybatis注解基本已经讲完了,接下来我们就要开始写SQL语句了,因为我们不再使用映射文件编写SQL,那么就不得不在java类里面写,就像上面提到的,我们不得不在TestSqlProvider这个类里面写SQL,虽然已经把所有sql语句集中到了一个类里面去管理,但听起来似乎仍然有点恶心,幸好mybatis提供SelectBuilder和SqlBuilder这2个小工具来帮助我们生成SQL语句,SelectBuilder专门用来生成select语句,而SqlBuilder则是一般性的工具,可以生成任何SQL语句,我这里选择了SqlBuilder来生成,TestSqlProvider代码如下:
....../** * @param testMapper *            the testMapper to set */@Autowiredpublic void setTestMapper(@Qualifier("testMapper") TestMapper testMapper) {this.testMapper = testMapper;}......


好了,写得累死了,休息一下,吃个饭什么的,别忘了给我猛烈的指出错误啊。 1 楼 Tank03 2011-10-31   写的不错,就是太“详细了”。

热点排行