简述 若手动编写数据库层是繁琐, 重复且容易出错。这里尝试实现通用的Dao、Service、Controllerc 减少重复的代码。使用generator来生成Mapper.xml、DO、Query。使编写数据库层自动化。
下面以app表为例
Dao 层 编写Dao层泛型接口, 对于每一个Mapper.xml 建一个Dao继承该接口, 其中无需编写代码
AppDao.java 1 2 3 4 @Mapper public interface AppDao extends Dao <AppDO> {}
Dao.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public interface Dao <D> { D selectById (Long id) ; List<D> select (D bean) ; int selectCount (D bean) ; List<D> select (Query<D> query) ; int selectCount (Query<D> query) ; int insert (D bean) ; int update (D bean) ; int delete (Long id) ; }
Service 层 service层编写 Service接口以及BaseService, service中在dao的基础上实现扩展方法, 详见service接口
AppService.java 1 2 3 4 @Service public class AppService extends BaseService <AppDO> {}
BaseService.java 此处注入dao 需要使用@Autowired
, 若使用@Resource
则会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 public abstract class BaseService <D> implements Service <D> { @Autowired private Dao<D> mapper; @Override public D selectById (Long id) { return mapper.selectById(id); } @Override public List<D> select (D bean) { return mapper.select(bean); } @Override public int selectCount (D bean) { return mapper.selectCount(bean); } @Override public List<D> selectByQuery (Query<D> query) { return mapper.select(query); } @Override public int selectCountByQuery (Query<D> query) { return mapper.selectCount(query); } @Override public List<D> selectAll () { return select(null ); } @Override public D selectOne (D bean) { if (selectCount(bean)!=1 ){ return null ; } List<D> list = select(bean); return list.get(0 ); } @Override public D selectOneByQuery (Query<D> query) { if (selectCountByQuery(query)!=1 ){ return null ; } List<D> list = selectByQuery(query); return list.get(0 ); } @Override public Page<D> selectPageByQuery (Query<D> query) { Page<D> page = new Page <>(); page.setList(selectByQuery(query)); page.setTotal(selectCountByQuery(query)); return page; } @Override public int insert (D bean) { return mapper.insert(bean); } @Override public int update (D bean) { return mapper.update(bean); } @Override public int delete (Long id) { return mapper.delete(id); } }
Service.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public interface Service <D> { D selectById (Long id) ; List<D> select (D bean) ; int selectCount (D bean) ; List<D> selectByQuery (Query<D> query) ; int selectCountByQuery (Query<D> query) ; List<D> selectAll () ; D selectOne (D bean) ; D selectOneByQuery (Query<D> query) ; Page<D> selectPageByQuery (Query<D> query) ; int insert (D bean) ; int update (D bean) ; int delete (Long id) ; }
Controller 层 有了 编写Controller接口和BaseController, 普通增删改查控制器只需继承BaseController
AppController.java 1 2 3 4 5 @RestController @RequestMapping("app") public class AdminAppController extends BaseController <AppDO,AppQuery> {}
BaseController.java 这里注入service同样要用@Autowired
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public abstract class BaseController <D, Q extends Query <D>> implements Controller <D,Q> { @Autowired private Service<D> service; @Override @RequestMapping("list") public ResponseData list (@RequestBody Q query) { return ResponseData.successResponse(service.selectPageByQuery(query)); } @Override @RequestMapping("save") public ResponseData save (@RequestBody D bean) { service.insert(bean); return ResponseData.successResponse(); } @Override @RequestMapping("update") public ResponseData update (@RequestBody D bean) { service.update(bean); return ResponseData.successResponse(); } }
Controller.java 1 2 3 4 5 6 7 8 public interface Controller <D, Q extends Query <D>> { ResponseData list (Q query) ; ResponseData save (D bean) ; ResponseData update (D bean) ; }