dao层service层抽取备忘

本文介绍如何通过创建通用的服务层(BaseService)和数据访问层(BaseDao)接口及其实现类(BaseServiceImpl, BaseDaoImpl),实现代码的复用与简化。通过泛型和依赖注入,将常用的操作如增删改查等封装起来,使得特定业务的服务层(UserService)和数据访问层(UserDao)更加专注于业务逻辑的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值