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

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

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

对于BoardDaoCuisineDao的处理接口和实现类,除了定义自己的特有方法外,其他基本功能的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接口中抽取公共的调用DaoCRUD方法,其他接口只需要继承即可。

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;

}

}



  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seven的代码实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值