美文网首页
三、理解分层开发思路

三、理解分层开发思路

作者: lifeline张 | 来源:发表于2018-07-13 13:56 被阅读0次

    一、导言

    上一节课学习了封装数据的JavaBean,还有一种是封装业务逻辑的,现在代码量比较少,一些写的是Dao,Impl等。等真正开发的时候,需要将功能细化,需要将不同的程序放在不同的包中。一般都把封装数据的类放在pojo或者entity包中,工具类放在util包中(比如之前的读配置文件,以后要学的分页),dao包中放接口(数据操作类的接口,一般一个dao对应一张数据库表,比如之前的NewsDao和NewsDaoImpl就只针对数据库中的news_detail表),daoImpl包中放dao接口的实现类(数据操作类的接口的实现类)。往往在做的时候还会建一个包,这个包叫做service,里面放的都是xxservice这种接口,这种接口就是我们说的业务逻辑。

    二、分层开发思路

    需求:删除某个新闻类别

    • 该分类下是否有新闻,若有,则提示无法删除
    • 若无,删除该分类

    3.1思路

    1、首先我拿到一个新闻类别的id,我要去判断这个新闻类型下面是否有新闻数据,这个要去news_detail表中去查找,而根据我们的原则:一个Dao及其实现类对应一张数据表,我们需要在针对news_detail表的接口NewsDetailDao和实现类NewsDetailDaoImpl中定义查询这个方法,查询的结果应该返回该类型新闻的条数。
    2、然后才是删除新闻类别这个方法DeleteNewsCategory这个方法,这个方法针对的是news_Category这个表,所以它应该写在针对这个表的NewsCategoryDao接口和NewsCategoryDaoImpl实现类中,这个方法只是简单地只做删除这一件事情
    3、这一步到我们的最终这一步了,删除某个新闻类别。其实现思路是我先判断该分类下是否有新闻,如果有,就不能删除;如果没有,就调用第二步中定义的方法去删除。这一步的方法调用了两个数据表操作类,是进行过判断的,而不是直接去做某件事情,所以这一步的方法属于业务逻辑层,应该出现在针对这一层的NewsCategoryService接口类和NewsCategoryServiceImpl实现类中。

    注:
    1、Service与Dao的区别:Dao这一层级的接口和实现类操作的一定是数据库,并且一个方法里面一定是只做一件事;Service操作的是业务逻辑层,不管什么需求来了,都一定是在Service这一层完成的,哪怕某个需求不需要调用多个Dao层级的方法,它也只能在Service这一层调用Dao层级的方法,而不能直接越过这一层去调用Dao层级的方法。
    2、程序的结构,每层做的事情?
    页面调Service,Service调Dao,Dao调数据库。每一层都有接口和实现类;同时数据在他们中间都是以JavaBean封装数据的形式(实体类,位于pojo包)传递。
    WebRoot包里面放前端内容,包括页面、css样式、图片、jar包等;后台程序放在src文件中。

    3.2代码

    1、定义新闻类型的实体类NewsCategory ,作为JavaBean。

    package cn.kgc.pojo;
    
    import java.util.Date;
    
    public class NewsCategory {
        private int id;
        private String name;
        private Date createDate;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Date getCreateDate() {
            return createDate;
        }
        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }   
    }
    
    

    2、在NewsDao接口中定义查询新闻数目的抽象方法,在NewsDaoImpl中实现该抽象方法:


    image.png

    该抽象方法的实现类如下(因为是查询数目,所以最终的查询结果集只有一个数据,直接拿出来就行):

        // 查询某一类型新闻的数目
        public int getNumOfNewsCategory(NewsCategory nc) {
            String sql = "SELECT count(1) FROM news_detail where id=?" ;
            Object[] params = {nc.getId()};
            ResultSet rs = this.executeSQL(sql,params);
            int id = 0;
            try {
                while(rs.next()){
                    id = rs.getInt("count(1)");
                    break;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            this.closeSource();
            return id;
        }
    

    3、定义针对新闻类型的接口NewsCategoryDao 和实现类NewsCategoryDao Impl,在其接口中定义删除的抽象方法,在实现类中定义删除的具体方法。

    接口代码:

    package cn.kgc.dao;
    
    import cn.kgc.pojo.NewsCategory;
    
    public interface NewsCategoryDao {
        // 通过id删除相应的新闻分类
        public boolean deleteNewsCategoryById(NewsCategory newsCategory);
    }
    

    实现类代码(这个地方也可以借助BaseDao来完成删除操作):

    package cn.kgc.dao.implement;
    
    import cn.kgc.dao.BaseDao;
    import cn.kgc.dao.NewsCategoryDao;
    import cn.kgc.pojo.NewsCategory;
    
    public class NewsCategoryDaoImpl implements NewsCategoryDao{
        private BaseDao dao = new BaseDao();
        
        public boolean deleteNewsCategoryById(NewsCategory newsCategory) {
            String sql = "delete from news_category where id=?";
            Object[] params = {newsCategory.getId()};
            int nums = 0;
            boolean isDelete = false;
            if (dao.getConnection()){
                nums = dao.executeUpdate(sql, params);
                if (nums >0) {
                    isDelete = true;
                }
            } else {
                System.out.println("连接数据库失败!");
            }
            dao.closeSource();
            return isDelete;
        }
    
    }
    
    

    4、在Service层的接口和方实现类中定义删除方法deleteNewsCategoryIfNull
    接口代码:

    package cn.kgc.Service;
    
    import cn.kgc.pojo.NewsCategory;
    
    public interface NewsCategoryService {
        public boolean deleteNewsCategoryIfNull(NewsCategory newsCategory);
    
    }
    
    

    实现类代码:

    package cn.kgc.Service.implement;
    
    import cn.kgc.Service.NewsCategoryService;
    import cn.kgc.dao.NewsCategoryDao;
    import cn.kgc.dao.NewsDao;
    import cn.kgc.dao.implement.NewsCategoryDaoImpl;
    import cn.kgc.dao.implement.NewsDaoImpl;
    import cn.kgc.pojo.NewsCategory;
    
    public class NewsCategoryServiceImpl implements NewsCategoryService{
        private NewsCategoryDao ncd = null;
        private NewsDao nd = null;
        
        public NewsCategoryServiceImpl(){
            ncd = new NewsCategoryDaoImpl();
            nd = new NewsDaoImpl();
        }
        
        public boolean deleteNewsCategoryIfNull(NewsCategory newsCategory) {
            boolean flag = false;
            if (nd.getNumOfNewsCategory(newsCategory) == 0){
                if (ncd.deleteNewsCategoryById(newsCategory)){
                    System.out.println("删除成功!");
                    flag = true;
                }
            } else {
                System.out.println("本类型下面有新闻,无法删除!");
            }
            return flag;
        }
        
        public static void main(String[] args) {
            NewsCategoryServiceImpl test = new NewsCategoryServiceImpl();
            NewsCategory newsCategory = new NewsCategory();
            newsCategory.setId(1);
            test.deleteNewsCategoryIfNull(newsCategory);
        }
    
    }
    
    

    运行结果:


    image.png

    相关文章

      网友评论

          本文标题:三、理解分层开发思路

          本文链接:https://www.haomeiwen.com/subject/ygbjpftx.html