不能回家,感觉无聊透顶,乱写点东西,打发时间
今天无意中在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,测试通过!
相关推荐
**代码重构** 代码重构是软件开发过程中的一个重要环节,它是指在不改变代码外在行为的前提下,对代码结构、设计和实现进行改进,以提高代码的可读性、可维护性和内部结构。重构的主要目标是使软件更容易理解和修改...
《代码重构》一书由Martin Fowler编写,是软件开发领域中关于代码质量提升的经典之作。书中详细阐述了重构代码的必要性、重构的时机以及如何安全地重构代码。重构指的是在不改变软件外部行为的前提下,改进其内部...
改善既有的代码重构(ppt),改善既有的代码重构,改善既有的代码重构PPT
综上所述,《从Java到Kotlin:重构指南》是一本非常适合Java开发者学习Kotlin并进行代码重构的专业书籍。它不仅提供了丰富的理论知识,还有大量的实践案例供读者参考,是从事软件开发工作的专业人士不可多得的宝贵...
《.java代码重构》 代码重构是软件开发过程中的一个重要环节,它涉及到对现有代码的改进,以提高代码的可读性、可维护性,同时并不改变其外在行为。在Java编程中,代码重构是一种常见的实践,尤其在大型项目中,...
### 软件工程中的代码重构技术 #### 第1章:简介 **1.1 什么是代码重构** 代码重构是一种软件工程活动,旨在不改变软件的外部行为的情况下,改进其内部结构和设计。这一过程有助于增强代码的质量和可维护性。 **...
Java 代码重构经验分享 Java 代码重构是指在不改变外部行为的情况下,修改代码的内部结构,以提高代码的可维护性、可读性和可扩展性。本文总结了 Java 代码重构的经验和技术规范,包括重构要求、重构的工作、代码的...
### Java代码重构经验总结 在软件开发过程中,代码重构是一项重要的技能,它旨在不改变代码外部行为的前提下,改进其内部结构,从而提升代码质量和可维护性。本文将深入探讨Java代码重构的关键点,涵盖重构原则、...
在文件名“测试驱动开发及代码重构”中,可能包含了关于TDD实践的案例分析、具体步骤、最佳实践以及如何在实际项目中实施TDD和代码重构的指导。这样的资源对于学习和理解TDD方法论及其在软件开发中的应用非常有价值...
**代码重构:C#与ASP.NET的实践指南** 在软件开发过程中,代码重构是一个至关重要的环节,它旨在改进代码的内部结构,不改变其外部行为。《代码重构 (C# & ASP.NET)》英文原版提供了针对这两种技术的重构策略和技巧...
**代码重构:提升软件设计与代码质量的关键技术** 在软件开发过程中,代码重构是一个至关重要的环节,它关乎到代码的可读性、可维护性和整体性能。代码重构并不意味着添加新功能或修复错误,而是对现有代码结构进行...
《C#代码重构31法》是对C#编程实践中提高代码质量、可读性和可维护性的31种重构技术的总结。这些重构方法旨在优化代码结构,减少冗余,提高效率,同时也使得代码更加模块化,易于理解和测试。以下是部分重构方法的...
这个项目名为"swift-高仿微信iOSAppTemplate代码重构",旨在通过重构代码来提升应用的可读性、可维护性和性能。在这个过程中,开发者将深入理解Swift的面向对象编程、MVVM设计模式、网络请求处理、UI布局以及数据...
### Java代码重构:掌握优化现有代码的艺术 #### 引言 在软件开发的过程中,随着项目的不断演进,代码库往往会出现复杂度增加、可读性和可维护性下降的问题。这时,进行代码重构变得至关重要。重构是指在不改变...
Java设计模式和代码重构是软件开发中的核心概念,它们对于编写高效、可维护的代码至关重要。这个PDF合集涵盖了这两个主题,旨在帮助开发者提升代码质量和软件设计能力。 首先,我们来详细了解一下Java设计模式。...
它能够帮助程序员有效地进行代码重构,提高代码质量和可维护性。通过深入理解代码结构,SourceMonitor提供了一种直观的方式来了解项目中的关键信息,包括代码行数、注释比例、类和方法的复杂性等。 **核心功能** 1...
在本篇博客“代码重构-以贪吃蛇为示例(四)-继续封装”中,作者通过实现贪吃蛇游戏来阐述代码重构的重要性和具体实践。贪吃蛇游戏是许多程序员学习编程时的入门项目,它包含了基本的逻辑控制、用户输入处理以及游戏...
代码重构是一种重要的软件开发实践,其核心目标是改善代码的结构,提高代码的可读性和可维护性,而不改变其外在行为。这种思想在现代软件工程中扮演着至关重要的角色,尤其在大型项目和持续演进的软件系统中。 重构...