不能回家,感觉无聊透顶,乱写点东西,打发时间
今天无意中在springframework中见到这个函数
this.getHibernateTemplate().findByExampl(Object obj)
以前没注意到,看了一下源码,原来就是Criteria中的Example.
以前代码如下
package martin.xpost.model;
import martin.xpost.hibernate.UserDAO;
import martin.xpost.util.ListUtil;
import java.util.ArrayList;
import java.util.List;
/**
* @author martin
*/
public class User {
private String id;
private String userName;
private String password;
private String realName;
private String email;
private List blogEntities = new ArrayList();
private List rolls = new ArrayList();
private UserDAO service;
//getter and setter
public void save() {
this.service.save(this);
}
public void remove() {
this.service.remove(this);
}
public boolean valid() {
return ListUtil.isNotEmpty(this.service.valid(this));
}
}
import martin.xpost.hibernate.UserDAO;
import martin.xpost.util.ListUtil;
import java.util.ArrayList;
import java.util.List;
/**
* @author martin
*/
public class User {
private String id;
private String userName;
private String password;
private String realName;
private String email;
private List blogEntities = new ArrayList();
private List rolls = new ArrayList();
private UserDAO service;
//getter and setter
public void save() {
this.service.save(this);
}
public void remove() {
this.service.remove(this);
}
public boolean valid() {
return ListUtil.isNotEmpty(this.service.valid(this));
}
}
DAO代码如下
package martin.xpost.hibernate.impl;
import martin.xpost.hibernate.UserDAO;
import martin.xpost.model.User;
import martin.xpost.util.ListUtil;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;
/**
* @author martin
*/
public class HibernateUserDAO extends HibernateDaoSupport implements UserDAO {
public void save(User user) {
this.getHibernateTemplate().merge(user);
}
public void remove(User user) {
this.getHibernateTemplate().delete(user);
}
public boolean valid(final User user) {
List list = (List) this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws org.hibernate.HibernateException {
Query query = session.createQuery("from User user where user.userName=:userName and user.password=:password");
query.setString("userName", user.getUserName());
query.setString("password", user.getPassword());
return query.list();
}
});
return ListUtil.isEmpty(list);
}
}
import martin.xpost.hibernate.UserDAO;
import martin.xpost.model.User;
import martin.xpost.util.ListUtil;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;
/**
* @author martin
*/
public class HibernateUserDAO extends HibernateDaoSupport implements UserDAO {
public void save(User user) {
this.getHibernateTemplate().merge(user);
}
public void remove(User user) {
this.getHibernateTemplate().delete(user);
}
public boolean valid(final User user) {
List list = (List) this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws org.hibernate.HibernateException {
Query query = session.createQuery("from User user where user.userName=:userName and user.password=:password");
query.setString("userName", user.getUserName());
query.setString("password", user.getPassword());
return query.list();
}
});
return ListUtil.isEmpty(list);
}
}
重构
一:修改User的valid函数
public boolean valid() {
return ListUtil.isNotEmpty(this.service.find(this));
}
return ListUtil.isNotEmpty(this.service.find(this));
}
DAO中只负责和数据源打交道,我们将逻辑全部转到model里面(就是逻辑太简单了o_o)。
二:修改DAO代码
package martin.xpost.hibernate.impl;
import martin.xpost.hibernate.UserDAO;
import martin.xpost.model.User;
import martin.xpost.util.ListUtil;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;
/**
* @author martin
*/
public class HibernateUserDAO extends HibernateDaoSupport implements UserDAO {
public void save(User user) {
this.getHibernateTemplate().merge(user);
}
public void remove(User user) {
this.getHibernateTemplate().delete(user);
}
public List find(User user) {
return this.getHibernateTemplate().findByExample(user);
}
}
import martin.xpost.hibernate.UserDAO;
import martin.xpost.model.User;
import martin.xpost.util.ListUtil;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;
/**
* @author martin
*/
public class HibernateUserDAO extends HibernateDaoSupport implements UserDAO {
public void save(User user) {
this.getHibernateTemplate().merge(user);
}
public void remove(User user) {
this.getHibernateTemplate().delete(user);
}
public List find(User user) {
return this.getHibernateTemplate().findByExample(user);
}
}
这样就简单多了:)
Test 一下:
package martin.xpost;
import martin.xpost.model.User;
/**
* @author martin
*/
public class UserTest extends TestBase {
public void testAdd() {
User user = (User) this.getBean("user");
user.setUserName("martin");
user.setPassword("1234");
user.setRealName("martin xus");
user.setEmail("martin.xus@gmail.com");
user.save();
assertNotNull(user.getId());
}
public void testValid() {
User user = (User) this.getBean("user");
user.setUserName("martin");
user.setPassword("1234");
assertTrue(user.valid());
}
public void testRemove() {
User user = (User) this.getBean("user");
user.setUserName("martin");
user.setPassword("1234");
user.remove();
assertNull(user.getId());
}
}
import martin.xpost.model.User;
/**
* @author martin
*/
public class UserTest extends TestBase {
public void testAdd() {
User user = (User) this.getBean("user");
user.setUserName("martin");
user.setPassword("1234");
user.setRealName("martin xus");
user.setEmail("martin.xus@gmail.com");
user.save();
assertNotNull(user.getId());
}
public void testValid() {
User user = (User) this.getBean("user");
user.setUserName("martin");
user.setPassword("1234");
assertTrue(user.valid());
}
public void testRemove() {
User user = (User) this.getBean("user");
user.setUserName("martin");
user.setPassword("1234");
user.remove();
assertNull(user.getId());
}
}
第三个没有通过:(看了一下log,原来this.getHibernateTemplate().delete(user)中user必须是持久层对象,也就是说user的id不能为空。
再修改:首先判断user.getId()是否为空,如果不为空,直接remvoe,否则,先find然后在remove.
public void remove(User user) {
if (null != user.getId() && !"".equals(user.getId().trim())) {
this.getHibernateTemplate().delete(user);
} else {
List list = find(user);
if (ListUtil.isNotEmpty(list))
for (Object o : list) {
this.getHibernateTemplate().delete(o);
}
}
}
if (null != user.getId() && !"".equals(user.getId().trim())) {
this.getHibernateTemplate().delete(user);
} else {
List list = find(user);
if (ListUtil.isNotEmpty(list))
for (Object o : list) {
this.getHibernateTemplate().delete(o);
}
}
}
OK,测试通过!
相关推荐
改善既有的代码重构(ppt),改善既有的代码重构,改善既有的代码重构PPT
代码重构 重构与模式
《代码重构》书籍的中文版电子版,软件开发者必读书籍。 重构——改善既有代码的设计(中文版)
java代码重构经验分享
高仿微信,iOSAppTemplate代码重构
代码重构 (C# & ASP.NET) 英文原版 && 源代码
代码重构技术
在《代码重构(C#&ASP.NET版)》中首次提供了在c#和asp.net中进行重构的专业方法,您将学习如何运用重构技术管理和修改代码。此外,还将学习如何从头开始构建原型应用程序,然后利用重构技术将原型转换为正确设计的、...
代码重构的指导书籍以及设计模式的一些简介
重构_改善既有代码的设计这本电子书介绍了代码重构的知识,为什么要重构,以及是如何重构等
java代码重构
讲述了java代码的重构总结 规范代码,有必要好好学习
优秀的程序员,应该懂得代码重构,写出更加优美和逻辑清晰的代码
重构技巧: 书中介绍了一系列将 Java 代码重构为 Kotlin 的技巧和方法,包括语法转换、代码结构调整、使用 Kotlin 的特性等方面。 实用示例: 书中通过丰富的实例和案例来演示如何进行代码重构,包括常见的 Java ...
软件设计是演进过程,而重构是设计演进的基本方法。重构是指不改变软件行为的前提下,修改程序内部结构。重构说简单,做不简单。首先,需要知道代码的好坏,即代码异味,设计原则等。其次,需要以自动测试作为保障。
Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例
Java 代码 重构 实例 指南 ,欢迎下载
总共43页,内含对代码重构的详细介绍,还有很多的例子介绍,花很短时间就能看完