一、为什么要重新设计代码
有时候编写代码很容易出现大量的重复代码,比如同样是Dao,就有UserDao、OrderDao等Dao层的代码,而这些代码里面一般来说都会包含一些必备的增删改查功能,就会出现重复性的工作。将重复性的代码写在一个基本的类里,让业务类去基层基本类,可以实现代码的复用。
二、Dao的设计
- BaseDao
1 2 3 4 5 6 7 8 9 10 11
| public interface IBaseDao<T> {
public void save(T t);
public void delete(T t);
public List<T> findAll();
public void update(T t); }
|
- BaseDaoImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public class BaseDaoImpl<T> implements IBaseDao<T> {
private Class<T> entityClass;
public BaseDaoImpl() { ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass(); Type[] types = genericSuperclass.getActualTypeArguments(); entityClass = (Class<T>) types[0]; System.out.println(entityClass); } @Autowired private HibernateTemplate template; @Override public void save(T t) { template.save(t); }
@Override public void delete(T t) { template.delete(t); }
@Override public List<T> findAll() { String hql = "from " + this.entityClass.getSimpleName();
System.out.println(hql); return template.find(hql); }
@Override public void update(T t) { template.update(t); } }
|
- IUserDao
1 2 3 4 5 6
| public interface IUserDao extends IBaseDao<User> {
public User findUserByEmail(Object id);
}
|
- UserDaoImpl
1 2 3 4 5 6 7 8 9 10
|
@Repository public class UserDaoImpl extends BaseDaoImpl<User> implements IUserDao { @Override public User findUserByEmail(Object id) {
return null; } }
|
Dao层代码结构
三、Service的设计
与Dao层类似,还是一样的将基本的增删改查写在BaseService和BaseServiceImpl中用户用于继承,但是不同的是由于还不知道BaseServiceImpl中需要的属性是UserDao还是OrderDao,因此将BaseServiceImpl定义为抽象类即可。
- IBaseService
1 2 3 4 5 6 7 8 9 10
| public interface IBaseService<T> {
public void save(T t);
public void delete(T t);
public List<T> findAll();
public void update(T t); }
|
- BaseServiceImpl
1 2
| public abstract class BaseServiceImpl<T> implements IBaseService<T> { }
|
- IUserService
1 2 3 4 5
| public interface IUserService extends IBaseService<User>{
public User findByTelephone(String telephone);
}
|
- UserServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| @Service @Transactional public class UserServiceImpl extends BaseServiceImpl<User> implements IUserService {
@Autowired private IUserDao userDao;
@Override public void save(User user) { userDao.save(user); }
@Override public void delete(User user) { userDao.delete(user); }
@Override public List<User> findAll() { return userDao.findAll(); }
@Override public void update(User user) { }
@Override public User findByTelephone(String telephone) { return null; } }
|
- 测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class Day02 {
@Autowired private IUserService userService;
@Test public void test02() { List<User> all = userService.findAll(); for (User user : all) { System.out.println(user.getId()); } } }
|
四、Action的设计
- BaseAction
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
private T t;
public BaseAction() { ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); Type[] arguments = parameterizedType.getActualTypeArguments(); Class<T> argument = (Class<T>) arguments[0];
try { t = argument.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }
@Override public T getModel() { return this.t; }
public abstract String save();
public abstract String delete();
public abstract String update();
public abstract String find(); }
|
- UserAction
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class UserAction extends BaseAction<User> { @Override public String save() { System.out.println("parameter:" + getModel());
return NONE; }
@Override public String delete() { return null; }
@Override public String update() { return null; }
@Override public String find() { return null; } }
|