看了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世界里,虽然Hibernate和JPA等框架已经非常成熟,但Ruby on Rails(ROR)中的ActiveRecord模式也受到了不少Java开发者的青睐,并有了一些移植到Java平台的实现。 ActiveRecord是一种对象关系映射(ORM)模式...
破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar
在本文中,我们将探讨一些RoR性能优化的关键方面,主要基于JavaEye网站在使用RoR过程中积累的实际经验。 首先,RoR性能优化涉及到多个层面,包括应用程序的部署、服务器配置以及代码优化。在部署方面,操作系统的...
在深入研究RoR源代码时,建议先从官方文档和开源项目开始,例如GitHub上的Rails项目,这能帮助你理解框架的设计思路和实现细节。同时,参与开源社区,阅读他人的代码和贡献自己的代码,是提升技能和了解最新实践的好...
在CIFAR-10上达到89%的准确率,以及在CIFAR-100上达到72%的准确率,展示了ResNet和Ror模型在处理复杂图像分类任务上的强大能力。相比于其他传统的浅层网络或早期的深度网络,这样的准确率显著提高了模型的性能,表明...
在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...
NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696
"ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...
3. RESTful设计:Rails鼓励使用REST(Representational State Transfer)设计原则,使得URL更加语义化,资源操作更直观。 4. 自动路由:Rails的路由系统可以根据定义的资源自动创建控制器和动作。 5. scaffolding:...
RoR强调“约定优于配置”,提供了一套完整的工具链,使得开发者可以更专注于业务逻辑,而不是底层实现。 在提供的压缩包文件中,我们可以看到"Ruby语言中文教程",这暗示了资源可能包含了关于Ruby语言的基础知识和...
总结来说,Java在Web开发中的生产力提升不仅来自于语言本身,还在于其丰富的框架和工具,尤其是模型驱动开发方法,能够减少代码量,提高开发速度。虽然Ruby on Rails以快速开发和简洁语法著称,但对于追求更强大、更...
在本例中,原始实现的问题在于缺乏足够的封装性和灵活性,这可以通过引入新的设计模式来解决,比如策略模式。通过识别错误处理的共同职责和不同策略,可以重构出一个更加健壮和易于维护的错误处理机制。 总结来说,...
本文将基于给定的文件信息,详细阐述如何在Rails应用中实现文件的上传与下载功能,包括数据库设计、视图构建、控制器逻辑以及模型处理等关键步骤。 #### 数据库设计与BLOB字段 在开始之前,首先需要设计一个能够...
基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。
其次,通过阅读FreeMIS的源代码,了解其结构和设计思路,可以提高对MIS系统开发的理解。同时,熟悉数据库设计和管理也是必不可少的,因为RoR的ActiveRecord与数据库紧密关联。 总结,FreeMIS是一个运用了Ruby on ...
《机遇ROR的图书管理系统》是一份以Ruby on Rails(简称ROR)技术为核心,旨在构建高效、便捷的图书管理解决方案的学习资料。Ruby on Rails,是基于Ruby编程语言的开源Web应用框架,它遵循MVC(Model-View-...
- **哲学思想与MVC模式**:阐述了RoR的设计哲学,强调代码简洁性与可读性,通过模型-视图-控制器(Model-View-Controller, MVC)模式实现应用程序结构的清晰划分。 - **创建第一个应用**:演示如何利用Rails提供的...
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上搭建Ruby on Rails(ROR)环境详解 #### 一、引言 随着Web开发技术的不断发展,Ruby on Rails(简称Rails或ROR)作为一种高效、简洁且优雅的Web开发框架,受到了广大开发者的青睐。然而,在Windows...