Dao接口和实现类以及Service接口和实现类代码抽取

紧接着上次无线点餐项目的文档,我们进行Dao层抽取。

6.Dao接口以及实现类代码抽取

对于BoardDao和CuisineDao的处理接口和实现类,除了定义自己的特有方法外,其他基本功能的CRUD方法都一样,只是操作的实体对象不一样。为了代码的复用,简化代码,我们可以将公共的CRUD方法提取到BaseDao中,只需要实现接口即可。

同理, 不同的实现类,实现CRUD相同的业务逻辑的时, 除了操作的实体不同,其他都是相同的, 所以我们可以把相同的业务逻辑实现,抽取出来,放到BaseSericeImpl中, 其他的业务逻辑实现, 继承BaseSericeImpl即可

抽取原理图如下:

6.1 BaseDao的代码为:

/**

* 通用BaseDao数据操作接口

*

* @author Leo.Chen

*

* @param <T>

*/

public interface BaseDao<T> {

/**

* 保存一个对象

*

* @param t

*/

public void save(T t);

/**

* 删除一个对象

*

* @param id

*/

public void delete(int id);

/**

* 删除一个对象

*

* @param t

*/

public void update(T t);

/**

* 查询所有

*

* @return

*/

public List<T> queryAll();

}

6.2 BaseDaoImpl代码为:

我们在没有使用框架Hibernate的情况下,使用JDBC技术来操作数据库时候需要自己手写SQL语句,因此为了避免dao代码的复杂性,不适用反射技术,因此我们只是把各个模块公共的代码抽取到BaseDaoImpl中,该类还是抽象的,让其子类具体再实现。

因此通用的BaseServiceImpl实现类代码如下:

/**

* 通用Dao接口实现类

* @author Leo.Chen

* @param <T>

*/

public abstract class BaseDaoImpl<T> implements BaseDao<T> {

protected QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource());

}

6.3 BoardDao接口的代码为:

/**

* 餐桌管理持久化数据操作接口

* @author Leo.Chen

*/

public interface BoardDao extends BaseDao<Board> {

}

6.4 BoardDaoImpl实现类的代码为:

public class BoardDaoImpl extends BaseDaoImpl<Board> implements BaseDao<Board>, BoardDao {

@Override

public void save(Board board) {

// 建立sql语句

String excuteSql = "insert into t_board(bName,isBook,bookTime) values (?,?,?)";

// 封装参数

Object[] param = { board.getbName(), board.getIsBook(), board.getBookTime() };

try {

// 执行sql语句

runner.update(excuteSql, param);

} catch (SQLException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

@Override

public void delete(int id) {

String excuteSql = "delete from t_board where bid=?";

try {

runner.update(excuteSql, id);

} catch (SQLException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

@Override

public void update(Board board) {

String excuteSql = "update t_board b set b.bname=?, b.isBook=?, b.bookTime=? where b.bid=?";

Object[] param = { board.getbName(), board.getIsBook(), board.getBookTime(), board.getBid()};

try {

runner.update(excuteSql, param);

} catch (SQLException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

@Override

public List<Board> queryAll() {

String sql = "select * from t_board";

List<Board> resultList = null;

try {

resultList = runner.query(sql, new BeanListHandler<Board>(Board.class));

} catch (SQLException e) {

e.printStackTrace();

resultList = new ArrayList<Board>();

}

return resultList;

}

}

6.5 CuisineDao接口的代码为:

public interface CuisineDao extends BaseDao<Cuisine> {

/**

* 根据菜系名称模糊查询

* @param cid

* @return

*/

public List<Cuisine> queryByName(String name);

}

6.6 CuisineDaoImpl实现类代码为:

public class CuisineDaoImpl extends BaseDaoImpl<Cuisine> implements CuisineDao {

@Override

public void save(Cuisine cuisine) {

try {

String sql = "insert into t_cuisine (name) values(?)";

runner.update(sql, cuisine.getName());

} catch (SQLException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

@Override

public void delete(int id) {

try {

String sql = "delete from t_cuisine where cid=?";

runner.update(sql, id);

} catch (SQLException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

@Override

public void update(Cuisine cuisine) {

try {

String sql = "update t_cuisine c set c.name=? where c.cid=?";

runner.update(sql, cuisine.getName(), cuisine.getCid());

} catch (SQLException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

@Override

public List<Cuisine> queryAll() {

String sql = "select * from t_cuisine";

List<Cuisine> resultList = null;

try {

resultList = runner.query(sql, new BeanListHandler<Cuisine>(Cuisine.class));

} catch (SQLException e) {

e.printStackTrace();

resultList = new ArrayList<Cuisine>();

}

return resultList;

}

@Override

public List<Cuisine> queryByName(String name) {

List<Cuisine> resultList = null;

try {

String sql = "select * from t_cuisine where name like ‘%"+name+"%‘";

resultList = runner.query(sql, new BeanListHandler<Cuisine>(Cuisine.class));

} catch (SQLException e) {

e.printStackTrace();

resultList = new ArrayList<Cuisine>();

}

return resultList;

}

}

7.餐桌和菜系的Service实现

在Service中同样的采取Dao中的抽取设计,将公共的Service方法抽取到BaseService中。在BaseService接口中抽取公共的调用Dao的CRUD方法,其他接口只需要继承即可。

Service的抽取原理图:

7.1BaseService代码如下:

/**

* 通用Service接口

* @author Leo.Chen

* @param <T>

*/

public interface BaseService<T> {

/**

* 保存对象

*

* @param t

*/

public void save(T t);

/**

* 删除对象

*

* @param id

*/

public void delete(int id);

/**

* 更新对象

*

* @param t

*/

public void update(T t);

/**

* 获取所有

*

* @return

*/

public List<T> queryAll();

}

7.2BaseServiceImpl代码如下:

/**

* 通用Service实现类

*

* @author Leo.Chen

*

* @param <T>

*/

public abstract class BaseServiceImpl<T> implements BaseService<T> {

/**

* 将所有操作数据库的Dao对象在BaseServiceImpl中实例化,自身模块的Service只需要继承该类即可

*/

protected BoardDao boardDao = BeanFactoryUtil.getInstance().createBean(BoardDao.class);

protected CuisineDao cuisineDao = BeanFactoryUtil.getInstance().createBean(CuisineDao.class);

}

7.3餐桌Service实现

BoardService接口代码如下:

public interface BoardService extends BaseService<Board> {

}

BoardServiceImpl接口代码如下:

public class BoardServiceImpl extends BaseServiceImpl<Board> implements

BoardService {

@Override

public void save(Board t) {

boardDao.save(t);

}

@Override

public void delete(int id) {

boardDao.delete(id);

}

@Override

public void update(Board t) {

boardDao.update(t);

}

@Override

public List<Board> queryAll() {

List<Board> boards = boardDao.queryAll();

if (boards.size() != 0) {

return boards;

}

return null;

}

}

7.4菜系Service实现

CuisineService接口代码如下:

public interface CuisineService extends BaseService<Cuisine> {

/**

* 根据名称查询菜系

* @param name

* @return

*/

public List<Cuisine> queryByName(String name);

}

CuisineServiceImpl实现类代码如下:

public class CuisineServiceImpl extends BaseServiceImpl<Cuisine> implements CuisineService{

@Override

public void save(Cuisine t) {

cuisineDao.save(t);

}

@Override

public void delete(int id) {

cuisineDao.delete(id);

}

@Override

public void update(Cuisine t) {

cuisineDao.update(t);

}

@Override

public List<Cuisine> queryAll() {

List<Cuisine> cuisines = cuisineDao.queryAll();

if (cuisines.size() != 0) {

return cuisines;

}

return null;

}

@Override

public List<Cuisine> queryByName(String name) {

List<Cuisine> cuisines = cuisineDao.queryByName(name);

if (cuisines.size() != 0) {

return cuisines;

}

return null;

}

}

时间: 2024-10-10 04:28:17

Dao接口和实现类以及Service接口和实现类代码抽取的相关文章

MVC下的DAO接口类和SERVICE接口类区别?

简单理解: DAO数据库访问对象 实现连接数据库 修改.添加等细节 service服务层 面向功能 把一个整个服务 细化 调用DAO其实service其中都是一些方法 去调用DAO 甚至方法名都和DAO中一样的如某个service是用作用户注册的其中可能包括检测用户名是否存在和插入用户数据两部分分别调用DAO中具体实现 操纵数据库看起来逻辑更清晰而已 进一步说明: Dao层实现是简单的CRUD操作.相当于sql中的单条select,insert,upate,delete语句.而service层就

zTree实现地市县三级级联Service接口实现

ProvinceServiceImpl.java: /** * @Title:ProvinceServiceImpl.java * @Package:com.gwtjs.service.impl * @Description:省份地市县级三级级联Service接口实现 * @author:Youhaidong(游海东) * @date:2014-5-11 上午12:17:44 * @version V1.0 */ package com.gwtjs.service.impl; import ja

Axis实现 web service接口开发 + 客户端调用

看到网上挺多人找webservice axis开发案例,但是网上较多的都是有点乱,初学者不太容易看得懂,所以最近看到自己终于有了点空闲时间,就上传了一份比较简单的webservice axis的完整案例. 只适用于初学者. 一.新建一个web项目 导入lib包. 2.配置 web.xml <!-- axis 配置 -->   <servlet>         <display-name>Apache-Axis Servlet</display-name>

Axis2实现 web service接口开发 + 客户端调用

一. 新建一个web项目, 1.打开axis2.war包,将conf,lib,modules三个文件夹复制到项目的WEB-INF文件夹下,再在WEB-INF目录下新建一个services文件夹,然后在services文件下新建一个文件夹(任意取名): 再新建META-INF文件夹,最后再新增services.xml,接口信息就写在这里面. 具体路径:WEB-INF/services/myservice/META-INF/services.xml 2.配置 web.xml .加载axis2 和 a

zTree实现地市县三级级联Service接口

ProvinceService.java: /** * @Title:ProvinceService.java * @Package:com.gwtjs.service * @Description:省份地市县级三级级联Service接口 * @author:Youhaidong(游海东) * @date:2014-5-11 上午12:16:58 * @version V1.0 */ package com.gwtjs.service; import java.util.List; import

Web Service (四) 手动发布Web Service接口-CXF与Spring集成

当我们发布完Web Service接口之后有两种方式可以调用Web service服务,一种是通过动态客户端方式,另一种是引用服务端的接口,引用服务端接口的方式对于客户端同服务器端耦合比较大,而使用WSDL的方式客户端不知道服务端的存在就可以调用服务器的方法. 下面是项目的结构图: 1.Web Service发布项目 2.编写服务端接口类以及实现类,如下,同上一篇自动发布接口,多了一个注解@WebService package com.test.webservice; import javax.

WebService之CXF注解之二(Service接口)

ITeacherService.java: /** * @Title:ITeacherService.java * @Package:com.you.service * @Description:教师Service接口 * @author:Youhaidong(游海东) * @date:2014-5-5 下午11:06:24 * @version V1.0 */ package com.you.service; import javax.jws.WebMethod; import javax.j

免费的天气Web Service接口

免费的天气Web Service接口 在android应用当中很多时候需要获取天气的信息,这里提供怎么获取天气信息: 1. http://www.ayandy.com/Service.asmx?wsdl 官网:http://www.ayandy.com 2. http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 网站:http://www.webxml.com.cn/zh_cn/index.aspx ,此网站提供各种web

Spring5源码分析之启动类的相关接口和注解

一些基础但是核心的知识总结: Spring Boot项目启动的时候需要加@Configuration. @ComponentScan @Configuration  + @Bean  把第三方jar包注入到容器中. 内部的直接 @Service @Controller等等之类配合 @ComponentSscan 的就OK了 @Scope可以实现单例 对于启动默认是饿汉式调用时候创建(但是项目启动时候比较耗费时间),另外一种是调用时候创建 @ComponentScan有排除的用法,排除那个组件