`

读ruby on rails有感

阅读更多
看了ror后,突发其想,如何在java里实现象ror的设计思想,于是就开始研究,其初步设计思想如下:
框架代码如下:
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里对要某个类进行事物控制的话,这个类一定得是基于接口的,否则会有一定的麻烦,具体什么原因,下次有时间再进行讲解!
}
分享到:
评论

相关推荐

    Ruby on Rails入门经典

    Ruby on Rails,简称Rails,是一种基于Ruby编程语言的开源Web应用程序...”程序开始,逐渐深入到复杂的业务逻辑,你会感受到Ruby on Rails带来的效率和乐趣。不断实践,理论结合实际,你将在Web开发的世界中大展拳脚。

    wblog:Ruby on Rails缺少的独立博客系统

    博客 Ruby on Rails上缺少的开源博客系统。 WBlog是开放源代码博客,首先为移动设备而构建,已在MIT上获得许可,可免费使用! 新增功能:WBlog现在正在使用Ruby on Rails 5.2。特征: 现代的干净阅读感受Markdown...

    PHP的开发框架的现状和展望

    Ruby on Rails催生变革  在RoR流行之前,PHP领域也有不少开发框架,例如Mojavi、WACT、PHPMvc和Seagull等。这些框架虽然也采用了MVC模式、数据库抽象层等技术。但由于当时PHP本身不像现在这样流行,所以这些框架都...

    syakyo_rails_app:学习开发rails,仿书

    Rails,全称为Ruby on Rails,是一款基于Ruby语言的开源Web开发框架,以其MVC(Model-View-Controller)架构模式、DRY(Don't Repeat Yourself)原则以及Convention Over Configuration的理念,在Web开发领域备受...

    photo_journal:一个允许用户创建自己的照片日记时间流逝的网络应用程序

    photo_journal应用基于Ruby on Rails框架构建,Rails是Ruby的一个全栈框架,它遵循MVC(Model-View-Controller)架构模式,让开发者能快速构建功能完善的Web应用。Rails提供了许多内置功能,如RESTful路由、自动化的...

    oedo08:大江户Ruby会议 08

    1. **Ruby编程语言**:基础语法、面向对象编程、元编程、Ruby on Rails框架等。 2. **JavaScript语言**:DOM操作、事件处理、异步编程、AJAX、ES6及以上版本的新特性等。 3. **Web开发最佳实践**:MVC模式、RESTful ...

    nasil_soylesem

    标题“nasil_soylesem”看起来像是一个项目或者软件的名字,描述中提到的是一种让人们能够匿名表达情感或...如果你对Ruby编程感兴趣,这是一个很好的实践案例,可以从中学到如何使用Ruby on Rails构建实际的Web应用。

    casieandseangotohawaii:#LetHawaiiHappen

    "gem install bundler和bundle install"是Ruby on Rails开发中的步骤,用于安装必要的依赖库和框架。"bundler"是一个管理Ruby应用依赖关系的工具,而"bundle install"则会根据Gemfile文件安装所有指定的gem包。"部署...

    popcorn:升级提名应用程序,对用户进行跟踪和排名,以确保每个人都能平等地感受到痛苦

    Popcorn Engine是一个基于Ruby on Rails构建的升级管理Web应用程序,它使支持角色的人员可以自动执行决定谁必须出于特殊原因而由领导将人员升级到团队的过程。 该应用程序跟踪谁做了什么,并为所有参与者分配“等级...

    Grocery

    后端可能基于Node.js、Django、Ruby on Rails或Spring Boot等技术栈,负责处理数据存储、业务逻辑和API接口。 数据库设计对于Grocery系统来说也至关重要,可能涉及到商品分类、库存量、价格、供应商信息、顾客订单...

    富文本编辑器summernote

    7. **易于集成**:Summernote可以轻松地与后端框架(如Ruby on Rails、Django、Laravel等)和前端库(如jQuery、AngularJS、Vue.js等)集成,使得在Web应用中实现富文本编辑功能变得轻而易举。 8. **API接口**:...

    MVC分层架构样板.供你参考

    5. **MVC的实现**:在实际开发中,有许多框架支持MVC模式,例如ASP.NET MVC、Spring MVC、Ruby on Rails等。这些框架提供了便捷的工具和API,帮助开发者快速构建符合MVC原则的应用。 6. **在资源中的应用**:在这个...

    Ajax in action(中文版1~8章全部)

    这一章主要讲述了Ajax应用如何与各种服务器端技术集成,如PHP、Java、Ruby on Rails等。同时,讨论了安全问题,如跨站脚本攻击(XSS)和跨站请求伪造(CSRF),以及如何采取措施防止这些问题。 **第8章:Ajax的未来...

    wannabememe:一个由模因启发的小型应用程序,不允许用户说“不”

    虽然标签中只提到了CSS,但一个完整的应用程序通常会结合HTML和JavaScript,甚至可能涉及服务器端编程如Node.js、Python Flask或Ruby on Rails等。后端负责处理用户请求,存储和检索数据,确保应用的逻辑性和稳定性...

    onDev:onDev应用程序

    7. **后端开发**:如果onDev涉及到服务器端逻辑,那么会用到像Node.js、Python(Django或Flask)、Ruby on Rails或Java(Spring Boot)等后端技术,处理数据存储、业务逻辑和API接口。 8. **数据库管理**:数据库...

Global site tag (gtag.js) - Google Analytics