以前在做JAVA开发的时候,通常我们的设计是Service,DAO,Domain。
但最近接触到了ror,对其中的一些设计很是喜欢。比如。
user.save()当然是还有其他数据库操作的。
但是反观Java中的设计就十分猥琐。按三层结构下,我们需要定义一个DAO接口及其实现,Service接口及其实现。
更猥琐的是,Service接口中的定义与DAO定义其中有相同的。
比如:save,update,delete,find。如此。
当然我不知道现在各位是如何设计的,因为差不多本人已有1年未接触JAVA了,但我刚才看了几个帖貌似还是这个状况。
我大概琢磨了一下利用JAVA来实现类似ROR所提供的Model CRUD
先列出该方式存在的问题和需要解决:
1.DAO没有接口设计。只是有个定义而已。
2.如果更换数据库或是数据库操作实现可能无法很优雅的解决。
3.需要创建一个类似Hibernate中Criteria的查询对象,避免绑定数据库操作框架,如Hibernate换到iBatis。
4.或是还有更多无法预料的问题。
好了。列一下代码:
1.先定义一个通用DAO接口,我也不知道为什么要定义这个东西,一个小小的习惯而已。当然。这里完全可以把方法定义加进去。以后再换个其他数据库操作实现只需要加一个类implements这个接口即可,而不需要去查找现在的实现里有哪些方法。
public interface GenericDAO<t, id="" extends="" serializable=""> {
//暂时现在的解决方式中没有任何方法定义
}
public class GenericDefaultDAO<t, id="" extends="" serializable="">
implements GenericDAO<t,id> {
public static<t> List<t> findAll(MyCriteria...myCriteria) {
// TODO Auto-generated method stub
return null;
}public static<t,id> T find(ID id) { // TODO Auto-generated method stub return null; } public void save() { // TODO Auto-generated method stub } public static<t> void save(T object) { // TODO Auto-generated method stub } public void delete() { // TODO Auto-generated method stub } public static<id> void delete(ID id) { // TODO Auto-generated method stub } public void update() { // TODO Auto-generated method stub } public static<t> void update(T object) { // TODO Auto-generated method stub }
}
public class UserDAO extends GenericDefaultDAO<user, string=""> {
public static List findBySex(String sex){
MyCriteria criteria = new MyCriteria();
//设置criteria参数
this.find(criteria);
}
}
public class User extends UserDAO{
private String loginName;
private String name;
private String password;
//......很多属性
}
User user = User.find("1");
user.setName("风花雪月饼");
user.save();
谈谈自己的一点看法:
其实分了这么多层无非是出于几点考虑,首先是希望能日后好维护,好扩展。个人认为委托比继承更好,使得业务和DAO之间能够很好解耦。比如,可以往user里面注入UserDao也可以是其他的Dao,增强了灵活性和扩展性。