基于模板模式用java语言实现基本的增删改查(快到起飞)
1. 模板模式介绍
网上有很多的模板模式的介绍,既然是我自己的笔记,自然要写一点关于我自己的理解。
其实关于模板模式,我国古代的时候就有过这样的例子-----北宋庆历间(1041年-1048年)中国的毕昇发明了一个活字印刷术。,从那会那开始,模板就成为了我们生活中不可或缺的一部分。回到正题,既然是模板模式,就是要将代码中重复率较高的的那几段代码给抽象出来,然后要使用这部分抽象出来的代码就可以直接继承或者是实现这部分抽象出来的代码即可。下面以常用的增删改查应用一下这个模板模式的设计模式(可以提高写代码的效率)。
2.MVC架构中抽象出增删改查
这里使用ssm架构来实现。
2.1 抽象Dao层模板
一般来说dao是一个个接口,每一个接口对应着一个mapper类,那么这每一个mapper里面就有可能增删改查,想象一下,要是一整个项目多达70,80多张甚至是100多张的时候,这个时候就显示出了模板模式的优势了,它可以让你少写很多的代码,大大提高写代码的速度。
下面来将dao层里面的基本的增删改查都抽象出来:
public interface TempleteDao<T> {
int deleteByPrimaryKey(Integer id);
int insert(T record);
int insertSelective(T record);
T selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(T record);
int updateByPrimaryKey(T record);
List<T> selectAll();
}
2.2 抽象service层的接口模板
package com.yyc.Templete;
import java.util.List;
public interface TempleteService<T> {
// 添加
void add(T record);
// 修改
void update(T record);
// 查询全部
List<T> list();
// 删除
void delete(Integer id);
// 获取一个
T get(Integer id);
// 想要实现必须要一个钩子,详细解释看下面
TempleteDao<T> getDao();
}
钩子:
这里钩子的其实意思很简单,service层要调用dao层里面的方法,就需要一个dao对象,但是抽象出来的要么是接口,要么就是抽象类,况且这个dao对象千变万化,谁也不知道在使用这些模板的时候调用的是哪个dao对象,所以这里直接定义一个获取dao对象的方法,可以写在service接口里面,或者是service实现类的接口里面都可以。一有这个钩子就可以把所有的方法全部勾住。
2.3 service层实现类
service实现类定义成抽象类,并且实现service接口
package com.yyc.Templete;
import java.util.List;
public abstract class TempleteServiceImpl<T> implements TempleteService<T>{
@Override
public void add(T record) {
getDao().insertSelective(record);
}
@Override
public void update(T record) {
getDao().updateByPrimaryKeySelective(record);
}
@Override
public List<T> list() {
return getDao().selectAll();
}
@Override
public void delete(Integer id) {
getDao().deleteByPrimaryKey(id);
}
@Override
public T get(Integer id) {
return getDao().selectByPrimaryKey(id);
}
2.4 抽象controller的模板
package com.yyc.Templete;
import java.util.List;
public abstract class TempleteController<T> {
public abstract TempleteService<T> getService();
// 查询全部
public List<T> list() {
return getService().list();
}
// 删除
public String delete(Integer id) {
getService().delete(id);
return "redirect:/list";
}
// 获取一个
public T get(Integer id) {
return getService().get(id);
}
// 添加
public void add(){
}
public String saveAdd(T record) {
getService().add(record);
return "redirect:/list";
}
public void update(){}
// 更新
public String saveUpdate(T record) {
getService().update(record);
return "redirect:/list";
}
}
所有的模板直接定义好了,下面就可以愉快的使用了。
3. 使用阶段
3.1 直接继承dao接口模板
// 泛型里面一般是实体类
public interface DictionaryTypeDao extends TempleteDao<DictionaryType> {
// 里面什么都不用写,父接口里面直接都有了!!!
}
3.2 直接继承service接口模板
public interface DictionaryTypeService extends TempleteService<DictionaryType> {
// 里面还是什么都不用写。。。
}
3.3 直接继承service实现类模板并实现原本就需要实现的service接口
特别需要注意的是,这里的“钩子”必须要提供给它
@Service
public class DictionaryTypeServiceImpl extends TempleteServiceImpl<DictionaryType> implements DictionaryTypeService{
@Autowired
DictionaryTypeDao dictionaryTypeDao;
// 提供钩子
@Override
public TempleteDao<DictionaryType> getDao() {
return dictionaryTypeDao;
}
}
3.4 继承controller模板
注意:注解是不能继承的,所以这里重写父类的所有方法(用IDEA不到1秒…生成),标上注解,就可以愉快的使用了。当然特有的方法在继承的时候需要单独的添加进去哦!
@Controller
@RequestMapping("/dict")
public class DictionaryTypeController extends TempleteController<DictionaryType> {
@Autowired
DictionaryTypeService dictionaryTypeService;
@Override
public TempleteService getService() {
return dictionaryTypeService;
}
@RequestMapping("/add")
@Override
public void add() {
super.add();
}
@RequestMapping("/saveAdd")
@Override
public String saveAdd(DictionaryType record) {
super.saveAdd(record);
return "redirect:/dict/list";
}
@RequestMapping("/edit")
public DictionaryType update(int id) {
super.update();
return dictionaryTypeService.get(id);
}
@RequestMapping("/saveUpdate")
@Override
public String saveUpdate(DictionaryType record) {
Util.getRequest().getAttribute("");
super.saveUpdate(record);
return "redirect:/dict/list";
}
@RequestMapping("/list")
@Override
public List<DictionaryType> list() {
return super.list();
}
@RequestMapping("/delete")
@Override
public String delete(Integer id) {
return super.delete(id);
}
@RequestMapping("/get")
@Override
public DictionaryType get(Integer id) {
return super.get(id);
}
}
这仅仅是个人笔记,有错误或者疑问欢迎评论区交流,图片均来源于网络~
本文地址:https://blog.csdn.net/qq_37823003/article/details/109260908