紧接着上次无线点餐项目的文档,我们进行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;
}
}