三、理解分层开发思路

2018-07-13  本文已影响0人  lifeline张

一、导言

上一节课学习了封装数据的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
上一篇下一篇

猜你喜欢

热点阅读