`
hujin1979
  • 浏览: 80148 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在java里实现象ror的设计思想

阅读更多

看了Ruby on Rails后,突发其想,如何在java里实现象Ruby on Rails的设计思想,于是就开始研究,其初步设计思想如下:
Hibernate框架代码如下:

public interface DAO {
  public void save(Object o);
  public void loadById(Class entityClass, Serializable id);
  public void update(Object o);
  public void delete(Object o);
  public List loadAll(Class entityClass);
  Object queryForObject(String sql);
  List queryForList(String sql);
  void queryForPagination(String sql, Pagination pagination);
  void queryForPagination(Pagination pagination);
  void execute(String hql, boolean lock);
}

 

public class HibernateDAO extends HibernateDaoSupport implements DAO { 
public void save(Object entity) { 
  this.getHibernateTemplate().save(entity); 
} 
public void delete(Object entity) { 
  this.getHibernateTemplate().delete(entity); 
} 
public void update(Object entity) { 
  this.getHibernateTemplate().update(entity); 
} 
public Object loadById(Class entityClass, Serializable id) { 
  try { 
   return this.getHibernateTemplate().load(entityClass, id); 
  } catch (Exception e) { 
   e.printStackTrace(); 
   return null; 
  } 
} 
public List loadAll(Class entityClass) { 
  return this.getHibernateTemplate().loadAll(entityClass); 
} 
public Object queryForObject(final String sql) { 
  return this.getHibernateTemplate().execute(new HibernateCallback() { 
   public Object doInHibernate(Session session) throws HibernateException, 
     SQLException { 
    return session.createQuery(sql).uniqueResult(); 
   } 
  }); 
} 
public List queryForList(final String sql) { 
  List records = this.getHibernateTemplate().find(sql); 
  return records; 
} 
public void queryForPagination(String sql, Pagination pagination) { 
  // TODO Auto-generated method stub 
  
} 
public void queryForPagination(Pagination pagination) { 
  // TODO Auto-generated method stub 
  
} 
public void execute(final String hql, final boolean lock) { 
  this.getHibernateTemplate().execute(new HibernateCallback(){ 
   public Object doInHibernate(Session session) throws HibernateException, SQLException { 
    session.createQuery(hql).executeUpdate(); 
    return null; 
   } 
   
  }, lock); 
} 
}

 

public abstract class Entity<T, ID extends Serializable> implements Serializable { 
protected static DAO dao = (DAO)ServiceLocator.getDao("DAO"); 

//private Class entityClass; 

protected ID id; 

public ID getId() {return id;} 

public void setId(ID id) {this.id = id;} 

// protected Entity() { 
//  this.entityClass = (Class<T>) ((ParameterizedType) getClass() 
//        .getGenericSuperclass()).getActualTypeArguments()[0]; 
// } 

public void save() { 
  dao.save(this); 
} 

public void update() { 
  dao.update(this); 
} 

public void delete() { 
  dao.delete(this); 
} 

@SuppressWarnings("unchecked") 
public T load() {  
  return (T)dao.loadById(this.getClass(), this.getId()); 
} 

@SuppressWarnings("unchecked") 
public T load(ID id) { 
  return (T)dao.loadById(this.getClass(), id); 
} 

@SuppressWarnings("unchecked") 
public List<T> loadAll() { 
  return (List<T>)dao.loadAll(this.getClass()); 
} 

public static Object queryForObject(String hql) { 
  return dao.queryForObject(hql); 
} 

public static List queryForList(String hql) { 
  return dao.queryForList(hql); 
} 

public static void queryForPagination(Pagination pagination) { 
  dao.queryForPagination(pagination); 
} 

public static void queryForPagination(String hql, Pagination pagination) { 
  dao.queryForPagination(hql, pagination); 
} 

/**执行一条SQL语句*/ 
public static void execute(String hql, boolean lock) { 
  dao.execute(hql, lock); 
} 
} 

 

领域模型如下: 

@SuppressWarnings("serial") 
public class User extends Entity<User, String> { 
private int inviter = 0; 

private String email = ""; 
private String nickname = ""; 
private String password = ""; 
public int getInviter() { 
  return inviter; 
} 
public void setInviter(int inviter) { 
  this.inviter = inviter; 
} 
public String getEmail() { 
  return email; 
} 
public void setEmail(String email) { 
  this.email = email; 
} 
public String getNickname() { 
  return nickname; 
} 
public void setNickname(String nickname) { 
  this.nickname = nickname; 
} 
public String getPassword() { 
  return password; 
} 
public void setPassword(String password) { 
  this.password = password; 
} 
}

 

客户端调用如下: 

public class Client { 
  public static void main(String...args) { 
    User user = new User(); 
    user.setId(10); 
    user.setName("arden"); 
    user.save();    
  } 
}

 

其次如果你需要对某些复杂的业务逻辑操作进行事物控制的话,您可以建立一个业务逻辑类,根据以上代码,我们可以根据业务的需求将User类建立一个有事物托管的类出来,很多时候因为在web开发中都是简单的CRUD操作,而这些简单的CRUD操作基本上不需要事物控制,所以通常情况下只要有User这个充血的领域模型就可以实现我们常规的大多应用,如果有复杂业务逻辑时我们再根据需求建立一个:

public interface UserManager { 
  public void register(User user); 
} 

 

public class UserManagerImpl implements UserManager { 
  public void register(User user) { 
    Object o = User.queryForObject("FROM User.name WHERER id = " + user.getName(); 
    if (ObjectUtil.isNull(o)) { 
      // 如果用户不存 
      user.save(); 
     // 发送激活邮件 
     EmailUtil.send(........); 
     //在这个时候发邮件可能出现异常,所以当发邮件出现异常时我们要回滚数据操作,因此这里需要在spring里对register方法进行事物控制! 
    } 
  } 

 
注意这里一定得为UserManagerImpl建立一个接口,因为在spring里对要某个类进行事物控制的话,这个类一定得是基于接口的,否则会有一定的麻烦,具体什么原因,下次有时间再进行讲解

 

分享到:
评论

相关推荐

    Java敏捷持久层-ROR-ActiveRecord持久层框架的Java实现

    在Java世界里,虽然Hibernate和JPA等框架已经非常成熟,但Ruby on Rails(ROR)中的ActiveRecord模式也受到了不少Java开发者的青睐,并有了一些移植到Java平台的实现。 ActiveRecord是一种对象关系映射(ORM)模式...

    javarebel 用JAVA和ROR一样方便测试

    破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar

    RoR性能优化经验谈

    在本文中,我们将探讨一些RoR性能优化的关键方面,主要基于JavaEye网站在使用RoR过程中积累的实际经验。 首先,RoR性能优化涉及到多个层面,包括应用程序的部署、服务器配置以及代码优化。在部署方面,操作系统的...

    RoR选题方向—源代码

    在深入研究RoR源代码时,建议先从官方文档和开源项目开始,例如GitHub上的Rails项目,这能帮助你理解框架的设计思路和实现细节。同时,参与开源社区,阅读他人的代码和贡献自己的代码,是提升技能和了解最新实践的好...

    神经网络ror resenet模型

    在CIFAR-10上达到89%的准确率,以及在CIFAR-100上达到72%的准确率,展示了ResNet和Ror模型在处理复杂图像分类任务上的强大能力。相比于其他传统的浅层网络或早期的深度网络,这样的准确率显著提高了模型的性能,表明...

    ROR安装必备所有架包

    在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...

    ror

    NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696

    ror实例

    "ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...

    初探ROR

    3. RESTful设计:Rails鼓励使用REST(Representational State Transfer)设计原则,使得URL更加语义化,资源操作更直观。 4. 自动路由:Rails的路由系统可以根据定义的资源自动创建控制器和动作。 5. scaffolding:...

    ror中文资料

    RoR强调“约定优于配置”,提供了一套完整的工具链,使得开发者可以更专注于业务逻辑,而不是底层实现。 在提供的压缩包文件中,我们可以看到"Ruby语言中文教程",这暗示了资源可能包含了关于Ruby语言的基础知识和...

    Java与Ruby在Web开发上谁更高效

    总结来说,Java在Web开发中的生产力提升不仅来自于语言本身,还在于其丰富的框架和工具,尤其是模型驱动开发方法,能够减少代码量,提高开发速度。虽然Ruby on Rails以快速开发和简洁语法著称,但对于追求更强大、更...

    使用设计模式改善程序结构

    在本例中,原始实现的问题在于缺乏足够的封装性和灵活性,这可以通过引入新的设计模式来解决,比如策略模式。通过识别错误处理的共同职责和不同策略,可以重构出一个更加健壮和易于维护的错误处理机制。 总结来说,...

    ROR 文件的上传与下载

    本文将基于给定的文件信息,详细阐述如何在Rails应用中实现文件的上传与下载功能,包括数据库设计、视图构建、控制器逻辑以及模型处理等关键步骤。 #### 数据库设计与BLOB字段 在开始之前,首先需要设计一个能够...

    RoRBlog 基于RoR的博客系统

    基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    freemis 基于ror框架的mis

    其次,通过阅读FreeMIS的源代码,了解其结构和设计思路,可以提高对MIS系统开发的理解。同时,熟悉数据库设计和管理也是必不可少的,因为RoR的ActiveRecord与数据库紧密关联。 总结,FreeMIS是一个运用了Ruby on ...

    机遇ROR 的图书管理系统

    《机遇ROR的图书管理系统》是一份以Ruby on Rails(简称ROR)技术为核心,旨在构建高效、便捷的图书管理解决方案的学习资料。Ruby on Rails,是基于Ruby编程语言的开源Web应用框架,它遵循MVC(Model-View-...

    RoR 培训课程PPT

    - **哲学思想与MVC模式**:阐述了RoR的设计哲学,强调代码简洁性与可读性,通过模型-视图-控制器(Model-View-Controller, MVC)模式实现应用程序结构的清晰划分。 - **创建第一个应用**:演示如何利用Rails提供的...

    ROR绿色最新环境(2013/3/10)

    ROR环境 Ruby version 1.9.3 (java) RubyGems version 1.8.24 Rack version 1.4 Rails version 3.2.12 JavaScript Runtime therubyrhino (Rhino) Active Record version 3.2.12 Action Pack version 3.2.12 ...

    Windows 上搭建 ROR环境

    ### Windows上搭建Ruby on Rails(ROR)环境详解 #### 一、引言 随着Web开发技术的不断发展,Ruby on Rails(简称Rails或ROR)作为一种高效、简洁且优雅的Web开发框架,受到了广大开发者的青睐。然而,在Windows...

Global site tag (gtag.js) - Google Analytics