一、导言
上一节课学习了封装数据的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
网友评论