Keep Calm and Carry On

Dao&Service&Web三层的设计

一、为什么要重新设计代码

有时候编写代码很容易出现大量的重复代码,比如同样是Dao,就有UserDao、OrderDao等Dao层的代码,而这些代码里面一般来说都会包含一些必备的增删改查功能,就会出现重复性的工作。将重复性的代码写在一个基本的类里,让业务类去基层基本类,可以实现代码的复用。

二、Dao的设计

  1. 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);
}
  1. 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() {
// 获取泛型的真实类型
//1.获得父类【BaseDaoImpl<T>】的参数化类型
ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
//2.获得父类的参数化类型的数组
Type[] types = genericSuperclass.getActualTypeArguments();
//3.获取泛型类第一个参数化的类型
entityClass = (Class<T>) types[0];// 泛型类
System.out.println(entityClass);//
}
@Autowired
private HibernateTemplate template;// 在applicationContext.xml中配置根据类型注入

@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);
}
}
  1. IUserDao
1
2
3
4
5
6
public interface IUserDao extends IBaseDao<User> {

// UserDao特有的方法
public User findUserByEmail(Object id);

}
  1. UserDaoImpl
1
2
3
4
5
6
7
8
9
10
// 注解声明创建一个bean在容器中
// 集成base实现类,实现IUserDao
@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定义为抽象类即可。

  1. 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);
}
  1. BaseServiceImpl
1
2
public abstract class BaseServiceImpl<T> implements IBaseService<T> {
}
  1. IUserService
1
2
3
4
5
public interface IUserService extends IBaseService<User>{

public User findByTelephone(String telephone);

}
  1. 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. 测试
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的设计

  1. 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
/**
* @ClassName BaseAction
* @Author zhuobo
* @Date 2019/7/25 16:10
**/
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> {

// 泛型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();
}
  1. 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;
}
}