自己用cglib实现的Annotation查询,就叫Annotation DAO吧
某天看jdbc4的相关文章时看到可以在一个接口的方法上写sql语句,无需实现方法就能使用,但是没找到具体的包,无法使用,于是自己写了个简单的来玩玩。
定义了两种annotation,Query和Update,用来简化jdbc里的executeQuery和executeUpdate。举例使用如下:
(下面举例只是让大家了解大概,没耐心又感兴趣的就直接下载代码吧,内容是一样的)
?
先创建数据库表:
CREATE TABLE `comments` (?????????????????????????????
??????????? `id` int(11) NOT NULL AUTO_INCREMENT,???????????????
??????????? `subjectId` int(11) DEFAULT NULL,???????????????????
??????????? `title` varchar(128) DEFAULT NULL,??????????????????
??????????? `content` text,?????????????????????????????????????
??????????? PRIMARY KEY (`id`)??????????????????????????????????
????????? ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8?
CREATE TABLE `subjects` (?????????????????????????????
??????????? `id` int(11) NOT NULL AUTO_INCREMENT,???????????????
??????????? `title` varchar(128) DEFAULT NULL,??????????????????
??????????? `content` text,?????????????????????????????????????
??????????? PRIMARY KEY (`id`)??????????????????????????????????
????????? ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
?
为了防止大家看不懂我的爱国英语,解释一下——建两个表,一个是主题,一个是评论。
?
接着写一个接口,定义一些方法,如下:
?
然后得到一个DAO对象:
?
这样就行了。
要注意几点:
1、DAO只能用接口,不能用抽象类。
2、返回类型(或参数)和字段类型要对应
3、如果字段名和bean对象的属性名不相同,要用select columnName as beanProperty,或者自定义个ormpper实现。
5、Query的返回类型可以是对象,基本数据库类型,以及对应的数组和容器类(容器类不能使用接口类或抽象类如List,要用ArrayList和LinkedList等,还要定义entityClass)
6、Update无返回或者返回int(执行queryUpdate()的返回值)
7、参数要注意顺序
?
?
?
1 楼 bottom 2008-12-14 如果能把sql写在外部文件里,在annotation里指定query name就更好了。这样可以适应不同的数据库,而且方便DBA优化。 2 楼 aninfeel 2008-12-14 就是讨厌xml才搞出这么个东西来的,所以才没有文件,反正那些DAO是很单纯的。 3 楼 xuyao 2008-12-15 相当于就用SubjectDAO做了个信息传递,元数据。。。然后调用cglib包里的intercept方法进行annotation的解析调用相应的Controller。。。挺新颖,但是不实用,感觉绕了一大圈。。。呵呵,写这么复杂不知道效率如何 4 楼 taupo 2008-12-16 这个能用于生产?
严重怀疑其灵活性和效率 5 楼 aninfeel 2008-12-16 关于效率吗?我一点信心都没有,但是仔细想想,hibernate等东东不也是这样做的吗,如果说这个程序有不足,那就是在初始化的时候没有抢够一定内存占着,用来在运行期不再初始化一些不必要的东西。我也是用来做做后台而已,那些张口闭口就百万流量的千万不要用啊。 6 楼 sigon 2008-12-27 是个很有意思的功能,实用性不敢说 7 楼 cthu 2009-03-12 很不错的东东。
学习了