service抽取
1、创建BaseService(接口)
public interface BaseService<T> {
public void save(T entity);// 保存
public void delete(T entity);// 删除用户
public void update(T entity);// 更新用户
public T findById(Serializable id);// 根据主键查找用户
public List<T> getAll();// 查看所有
}
2、创建BaseServiceImpl (实现类)
注意:
这里我们需要用到userDao,而在这不能直接实例化userDao,
所以需要加一个set方法,在调用service层的时候,把userDao传进来
用BaseDao接收userDao是没问题的。
public class BaseServiceImpl<T> implements BaseService<T> {
private BaseDao<T> baseDao;
public void setBaseDao(BaseDao<T> baseDao) {//留给子类注入用
this.baseDao = baseDao;
}
public void save(T entity) {
baseDao.save(entity);
}
public void delete(T entity) {
baseDao.delete(entity);
}
public void update(T entity) {
baseDao.update(entity);
}
public T findById(Serializable id) {
return baseDao.findById(id);
}
public List<T> getAll() {
return baseDao.getAll();
}
}
3、UserService 继承BaseService
可以把BaseService中有的方法在UserService注释掉(删除)
public interface UserService extends BaseService<User> {
/*public void save(User user);//保存
public void delete(User user);//删除用户
public void update(User user);//更新用户
public User findById(Serializable id);//根据主键查找用户
public List<User> getAll();//查看所有
*/
//以下两个方法是根据业务需要新增的方法,
//可以看到抽取完BaseService后,service层只剩下新增的业务,比较简洁
public List<User> findLike(User user);//模糊查询
public User findByName(String userName);//根据用户名查询 保证用户名唯一
}
6、UserServiceImpl 继承BaseServiceImpl
同样可以把BaseServiceImpl中有的方法在UserServiceImpl中注释掉(删除)
注意:
A、第4点中说到在BaseServiceImpl中需要调用userDao,但没办法直接实例化,需要调用service层时传进去的问题,那么就是在这里传,在service是通过@Resource拿到IOC容器中userDao的,
B、 @Resource可以放在private UserDao userDao;上面,也可以放在public void
setUserDao(UserDao userDao)上面,
C、我们需要传userDao到BaseServiceImpl中,通过supper调用父类即BaseServiceImpl的setUserDao方法,
D、这样就把userDao传进到BaseServiceImpl中,避免空指针异常。
@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {
private UserDao userDao;
@Resource
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
super.setBaseDao(userDao);
}
/*public void save(User user) {
userDao.save(user);
}
public void delete(User user) {
userDao.delete(user);
}
public void update(User user) {
userDao.update(user);
}
public User findById(Serializable id) {
return userDao.findById(id);
}
public List<User> getAll() {
return userDao.getAll();
}*/
public List<User> findLike(User user) {
return userDao.findLike(user);
}
public User findByName(String userName) {
return userDao.findByName(userName);
}
}
作者:kyle0349
来源:优快云
原文:https://blog.youkuaiyun.com/kyle0349/article/details/51915546/
版权声明:本文为博主原创文章,转载请附上博文链接!
dao抽取
1、创建BaseDao接口
这个接口不需要太多,只需要把基本的增删改查代码改成泛型
public interface BaseDao<T> {
public void save(T entity);// 保存
public void delete(T entity);// 删除用户
public void update(T entity);// 更新用户
public T findById(Serializable id);// 根据主键查找用户
public List<T> getAll();// 查看所有
}
2、创建BaseDao实现
实现了BaseDao接口后,最主要的做的事情是要获取到T的类型。
因为在查询数据库的时候Hibernate需要用到这个字段去拼接查询语句
其实在service层调用的时候,就已经知道T的传入类型,问题就在于怎么在BaseDao实现类中获取到这个传入类型,看下面 这行代码,这行代码返回的是包含泛型的父类:
a、ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();
具体打印出来是:cn.tax.nsfw.core.dao.impl.BaseDaoImpl< cn.tax.nsfw.user.entity.User >
b、clazz = (Class< T >)pt.getActualTypeArguments()[0]
这行代码返回的是此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class
具体打印出来的是:cn.tax.nsfw.user.entity.User
c、到这里就已经拿到了在service层传进来的实体类类型。
最后用的时候再通过clazz.getSimpleName()就可以拿到“User”字段去拼接查询语句了
BaseDao实现类代码:
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
Class<T> clazz;
ParameterizedType pt;
public BaseDaoImpl() {
pt = (ParameterizedType)this.getClass().getGenericSuperclass(); //cn.tax.nsfw.core.dao.impl.BaseDaoImpl<cn.tax.nsfw.user.entity.User>
clazz = (Class<T>)pt.getActualTypeArguments()[0]; //cn.tax.nsfw.user.entity.User
}
public void save(T entity) {
getSession().save(entity);
}
public void delete(T entity) {
getSession().delete(entity);
}
public void update(T entity) {
getSession().update(entity);
}
public T findById(Serializable id) {
return (T) getSession().get(clazz, id);
}
public List<T> getAll() {
return getSession().createQuery("FROM " + clazz.getSimpleName()).list();
}
}
3、UserDao接口
A、继承BaseDao< User >
B、把BaseDao< User >中有的方法都可以注释掉(删掉),
C、以后有新增的业务,只需要加新增的业务代码。整个dao就没有多少代码了。
public interface UserDao extends BaseDao<User> {
//public void save(User user);// 保存
//public void delete(User user);// 删除用户
//public void update(User user);// 更新用户
//public User findById(Serializable id);// 根据主键查找用户
//public List<User> getAll();// 查看所有
}
6、Userdao实现类
A、继承BaseDaoImpl< Use r> ,因为BaseDaoImpl< User >继承了hibernateDaoSupport,所以UserDaoImpl 也是可以用hibernateDaoSupport的方法的
B、同样是把BaseDaoImpl< User >中已有的方法注释掉(删掉),只需添加新的业务代码。
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
//如果没有新的业务,dao层代码基本是空的,所有基本的增删改查都交给baseDao来处理,
//这里只需要实现一些新增业务代码就可以了
/*public void save(User user) {
getSession().save(user);
}
public void delete(User user) {
getSession().delete(user);
}
public void update(User user) {
getSession().update(user);
}
public User findById(Serializable id) {
return (User) getSession().get(User.class, id);
}
public List<User> getAll() {
return getSession().createQuery("FROM User").list();
}*/
}
作者:kyle0349
来源:优快云
原文:https://blog.youkuaiyun.com/kyle0349/article/details/51914504
版权声明:本文为博主原创文章,转载请附上博文链接!