让你的 Ibatis2 也支持Annotation
在支持xml配置方式的基础上增加了对annotation的支持,用户可以根据自己的喜好来选择或者两种方式并存。详情请大家看:http://www.rest4g.org/viewthread.php?tid=12&extra=page%3D1
代码示例如下:
Account.java
AccountServiceTest.javapackage org.jrest4guice.persistence.ibatis;import java.sql.SQLException;import java.util.List;import junit.framework.Assert;import org.jrest4guice.guice.GuiceContext;import org.jrest4guice.guice.PersistenceGuiceContext;import org.junit.BeforeClass;import org.junit.Test;public class AccountServiceTest {private static AccountService service;@BeforeClasspublic static void setUp() throws Exception {// 初始化JRest4GuicePersistenceGuiceContext.getInstance().useIbatis("org.jrest4guice.persistence.ibatis").init();// 获取服务service = GuiceContext.getInstance().getBean(AccountService.class);}@Testpublic void doTest() {List<Account> accounts;try {Account account = new Account();account.setFirstName("张");account.setLastName("学友");account.setEmailAddress("jackey@rest4g.org");// 添加service.createAccount(account);account = new Account();account.setFirstName("刘");account.setLastName("学友");account.setEmailAddress("test@rest4g.org");// 添加service.createAccount(account);//查询(按lastName)Account queryCondition = new Account();queryCondition.setLastName("学友");accounts = service.queryAccounts(queryCondition);Assert.assertEquals(2, accounts.size());//查询(按firstName和lastName)queryCondition.setFirstName("张");accounts = service.queryAccounts(queryCondition);Assert.assertEquals(1, accounts.size());// 修改account = accounts.get(0);account.setFirstName("何");service.updateAccount(account);account = service.getAccountById(account.getId());Assert.assertNotNull(account);Assert.assertEquals("何", account.getFirstName());//查询所有accounts = service.findAll();Assert.assertEquals(2, accounts.size());// 删除for (Account ac : accounts){service.deleteAccount(ac.getId());}//断言删除的结果accounts = service.findAll();Assert.assertEquals(0, accounts.size());} catch (SQLException e) {Assert.fail(e.getLocalizedMessage());}}}36 楼 redhacker 2008-10-11 对于annotation的使用我同意lz的观点,看场合适度使用,不过目前看来annotation的普遍应用是一种趋势,我们应慢慢学会接受这种做法,习惯就好~~~ 37 楼 王者之剑 2008-10-11 annotation这样用不服也不行 38 楼 vdgame 2008-10-11 我也是支持lz的,我是从c++、c#转到java开发的,当面对大量的xml配置时都快疯掉了。个人还是很喜欢annotation这种方式的,尤其是小项目,annotation太方便了。 39 楼 cyberblue 2008-10-11 问题不在于annotation本身,问题在于是否在部署时或第一次启动ORM引擎的时候能把字段到方法的Map一次性载入,避免重复读取。
大多数JPA软件已经做到了,但这个不知道做没做到。
40 楼 cnoss 2008-10-11 我的实现思路很简单,就是在启动时读取所有的dao对象的annotation信息,然后将其对应于Ibatis的sqlmapping,动态加载并生成ibatis的SqlMapClient,在没有修改Ibatis的前提下实现了annotation到xml的转换,所以是一次性装载的,不会重复读取。另外,我还封装了对事务的统一控制。 41 楼 spacefly 2008-10-12 还行,不过觉得即使ibatis完全支持了注解,还是配置文件的方式比较的清晰!!!
还是2个结合着用的好,适当的结合,各取所长,看具体应用的情况而定 42 楼 cnoss 2008-10-12 spaceflysky@163.com 写道还是2个结合着用的好,适当的结合,各取所长,看具体应用的情况而定
是的,我很同意你的观点,各取所长,完美结合。 43 楼 cuiyi.crazy 2008-10-13 cnoss 写道我的实现思路很简单,就是在启动时读取所有的dao对象的annotation信息,然后将其对应于Ibatis的sqlmapping,动态加载并生成ibatis的SqlMapClient,在没有修改Ibatis的前提下实现了annotation到xml的转换,所以是一次性装载的,不会重复读取。另外,我还封装了对事务的统一控制。
自定义类加载器classloader? 44 楼 cnoss 2008-10-13 没有,只是动态产生ibatis所需要的xml配置文件,并保存到临时文件中,然后载入这个临时文件,从而实现annotation到xml配置的转换,并在启动时完成对Ibatis的初始化工作。 45 楼 Readonly 2008-10-13 cnoss 写道
上面这个Contact对象被用jpa、hibernate validator、hibernate search的标注描述过,难道我们会因为这样的“不优雅”而放弃使用吗?
不知道谁的奶酪被动了?不过这都只是个习惯的问题,世态总是在发展,不管它是直线型的还是螺旋型,如果你我改变不了,那最好的方式就是适应(当然,我们也可以放弃),适应的过程是痛苦的(如果你很在意自己一个人的感受),但最终的结果就是给了你我另一种习惯。呵呵,是吗,我的朋友?
越来越觉得Java的annotation是一个不实用的东西,特别是将这种原先分离得很干净的代码,混杂在一个文件里面,完全是在开倒车,还是坚持偶以前的观点:
http://www.iteye.com/post/505027
Readonly 写道
偶一直认为把annotation当作配置来用是一点好处也没有的,偶在实际项目中见过Model一个field上挂了O/R Mapping, Full Text Index, Validation, Security...整整超过10行的annotation,偶只不过是想看看这个Model有什么field而已,这样把整个一大包乱七八糟的annotation都塞在一个文件里面,不是一个大倒退么?
Readonly 写道
偶的意见就是要分开多个配置文件,减少Line Of Code per File,减少维护成本,降低出错概率,分离关注点。
46 楼 iKing 2008-10-13 非常同意楼上的看法,感觉xml给了我们一个干净整洁的Java代码,而annotation又将这部分代码以另一种形式搬回到Java代码中,尤其是看到annotation这样的用法,实在让人望而却步啊。 47 楼 king_108 2008-10-14 太强悍了,把XML的东西移植到JAVA类中,ORZ 48 楼 nextw3 2008-10-14 感觉没什么必要,对于很多几乎不变的东西采用annotation比较好,而sql这种在开发中经常改动的东西也弄到annotation里,还不如不用他,直接代码里写SQL好。annotation是好东西,但是他不可能代替配置文件,他只是去除掉配置文件中必要的但开发中很少改变的东西。 49 楼 GandofYan 2008-10-15 一直很喜欢iBatis
不过确实感觉annotation对于项目开发不太像是一个助力
50 楼 zhenjia 2008-10-16 看了一下, annotation用得比我还疯狂 呵呵 。但是我感觉你好象是把xml应该配置的东西以annotation形式写在JAVA里了。那么,请问一下?这有什么用,证明XML里的东西ANOTATION也能实现吗?IBATIS最成功的地方是实现SQL统一管理 一目了然,但是你这样写在JAVA里 眼都花了。
比如你定义了一个@Insert(id='xx',sql='sql') 然后在这这方法上调xxService.insert('xx') 那还不如把sql直接写在xxService.insert('sql')呢 那个ID完全是多余的东西。
以上属我的拙见 见笑了
我也用这样的思想封装过DAO
http://www.iteye.com/topic/232885 我现在项目里也一直在用。但是感觉ANNOTATION用多了未必是好事情,说明一下我用annotation进行DAO封装完全是让我的service不包含任何一个hibernate包下的任何一个类 不让使用的用户知道有HIBERNATE,只要会用ANNOTATION就好。它只是用来定义如何做查询 或者C U D的 51 楼 cnoss 2008-10-17 zhenjia 写道比如你定义了一个@Insert(id='xx',sql='sql') 然后在这这方法上调xxService.insert('xx') 那还不如把sql直接写在xxService.insert('sql')呢 那个ID完全是多余的东西。
这个ID是解决ibatis sqlmapping中的sql引用的,在ibatis的用法中,可以指定另一个sql为当前查询的子查询,它们是通过这个id来引用的。
抽时间学习一下你的http://www.iteye.com/topic/232885 52 楼 backbase 2008-10-17 楼主非常强悍,永远支持你! 53 楼 piggy 2008-10-17 不知道iBatis3什么时候出来. 54 楼 xzj127 2009-02-02 太恶心了。 55 楼 抛出异常的爱 2009-02-02 Readonly 写道
偶的意见就是要分开多个配置文件,减少Line Of Code per File,减少维护成本,降低出错概率,分离关注点。
要用annotation,把它当作限制器.过滤不合格的数据源录入.使IDE事先捕获数据错误,减少测试代码,会有用的多.