看了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里对要某个类进行事物控制的话,这个类一定得是基于接口的,否则会有一定的麻烦,具体什么原因,下次有时间再进行讲解
分享到:
相关推荐
ROR-ActiveRecord持久层框架的Java实现
破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar
ror实例ror实例ror实例
RoR性能优化经验谈,牛人对ror的优化,值得大家阅读
NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696
ror中文资料ror中文资料
ROR 架构介绍及了解
仅知道设计模式是什么, 以及它是如何实现的是很不够的,因为那样就不能使你对于设计模式有真正的理解,也就不能够在自己的设 计中正确、恰当的使用设计模式。本文试图从另一个角度(设计模式的意图、动机)来看待...
之前本人在windows 上搭建ROR环境,屡屡受挫,上网查资料、加入ruby on rails的qq群,关注ruby社区等,没有得到一套完整的正确的方法,很多朋友说不要在windows 弄ROR,很费力。的确很费力,后来在朋友的帮助下,...
基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。
神经网络ror resenet模型 cifar10准确率89% cifar100准确率72%
RoR选题方向—源代码
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 ...
家蚕Ror2基因的克隆与表达分析,刘伟,陈菲,Ror家族属于受体酪氨酸激酶中的孤儿受体,在进化上非常保守。本研究克隆了家蚕Ror2基因BmRor2的ORF序列,BmRor2基因的ORF为1924 bp,编码638
Java程序员GuillaumeBort在JVM上创造了一个全新的框架Play framework。Play拥有ROR或Django那样的灵巧,又不失Java的稳定,更有JVM这一强大的运行平台。魔鬼身材,天使脸蛋。让我们来玩玩Play吧。
mysqlDriver4ror.rarmysqlDriver4ror.rarmysqlDriver4ror.rarmysqlDriver4ror.rar
excel lib ror ruby
我自己再开发时的笔记
研究机构注册(ROR)API ROR API允许检索,搜索和过滤在ROR中建立索引的组织。 结果以JSON返回。 单个组织记录由以下JSON结构表示: { "id":"https://ror.org/013cjyk83", "name":"PSL Research University", "email...
Source.Insight.v3.50.0027-ROR.rar