MyBaits 针对于增删改查功能的二次封装
在使用传统的
Mybaits
实现JDBC
时候,我们会发现增删改查的代码在有些方面不尽相同,我在这里进行进行了一个简单的二次封装
主要实现思路: 使用策略+单例+工厂模式进行代码逻辑封装
1.封装一个针对于处理业务逻辑的接口类
-
完成增加,删除,修改操作时候返回的都是
int
类型的返回值 -
完成查询操作的时候,
Mybaits
是根据Example
去生成sql
语句,然后去运行Example
生成的sql
语句
总结:
我们可以把返回类型设置成
R
类型的数据,把形参的类型设置为T
数据类型我们这里使用的泛化变成
代码如下
package until.factory;
/**
* @param <T> info type
* @param <R> return type
*/
public interface InterfaceExample<T,R> {
/**
* update / insert/ delete/ select
* @param info R info
* @return T info
* @throws Exception throws Exception
*/
R doAnything(T info) throws Exception;
}
2.分别封装针对于两种业务逻辑的处理抽象类
-
增加、删除,修改的业务逻辑相较于花样查询的操作不一样的是
- 后者会涉及到分页的问题,而前者不会
代码如下:
- 针对于花样查询的操作的抽象类
package until.factory;
import com.github.pagehelper.PageHelper;
import until.StaticMessage;
import java.util.HashMap;
import java.util.Map;
/**
* (E)object = select * form (T)info where ((T)?.? = (T)info.?,.....) [or ((T)?.?=(T)info.?,......)] [limit (?,?)/limit(?)];
*
* @param <T> info type
* @param <R> mapper factory type
* @param <V> action type
* @param <E> return object
*/
public abstract class AbstractSelectFactory<T,R,V,E>{
protected Map<V, InterfaceExample<T,R>> map =new HashMap<>();
/**
* @param pageSize page-size
* @param pageNumber page-number
*/
public AbstractSelectFactory(int pageSize, int pageNumber) {
PageHelper.startPage(pageNumber,pageSize);
}
/**
* init mapper
*/
protected abstract void init();
/**
* get mapper info
* @param info T info
* @return get mapper info
* @throws Exception Exception message
*/
protected R goAction(V action,T info) throws Exception {
InterfaceExample<T,R> mapper=map.get(action);
if (mapper!=null) {
return mapper.doAnything(info);
}else{
throw new RuntimeException(StaticMessage.UserExamination.USER_ACTION_NOT_FOUND);
}
}
/**
* E object = select * form ? where (?.?=info.?,.....) [or (?.?=info.?,......)] [limit (?,?)/limit(?)];
* @param action action
* @param info info
* @return return the list for models
*/
protected abstract E doAnything(V action,T info) throws Exception;
}
- 针对于增加,修改,删除的操作的抽象类
package until.factory;
import until.StaticMessage;
import java.util.HashMap;
import java.util.Map;
/**
* @param <T> info type
* @param <R> successfully_count = insert/update/delete
* @param <V> mapper key type
*/
public abstract class AbstractDoFactory<T,R,V>{
protected Map<V, InterfaceExample<T,R>> map =new HashMap<>();
/**
* init mapper
*/
protected abstract void init();
/**
* - insert/update/delete factory something
* @param action action name
* @param info T info
* @return is successfully
* @throws Exception Exception
*/
public R goAction(V action, T info) throws Exception {
InterfaceExample<T,R> mapper=map.get(action);
R getSuccessResult;
if (mapper != null) {
try {
getSuccessResult = mapper.doAnything(info);
} catch (Exception e) {
throw new Exception(e.getMessage());}
} else {
throw new RuntimeException(StaticMessage.UserExamination.USER_ACTION_NOT_FOUND);
}
return getSuccessResult;
}
}
3.封装不同业务逻辑的动作参数
package until;
public class ActionName {
public