代码逻辑层得封装 是比较烦人得 所有得业务操作 都离不开增删改查 这就需要 通用方法得封装
业务逻辑大同小异 借此只是封装了通用得代码 但是需要mabatis文件生成得dao层 entity层 mapper.xml和这个service是一致得
大家可以看我得 mybatis自动生成文件 生成代码片段 。
再次给大家说一个 逻辑层得性能优化tips 所有得操作数据库得逻辑代码 不要添加在含有事务得类内
可以另写专门处理得业务逻辑代码 组装事务类所需要得参数 最后直接把参数传入 事务控制得类中 性能可以提高不少
废话少说把 直接上代码 可直接复制 使用:
业务service得基础类接口
/**
* BaseService接口
*/
public interface BaseService<Record, Example> {
/**
* 根据条件查询记录数量
* @param example
* @return
*/
int countByExample(Example example);
/**
* 根据条件删除记录
* @param example
* @return
*/
int deleteByExample(Example example);
/**
* 根据主键删除记录
* @param id
* @return
*/
int deleteByPrimaryKey(Integer id);
/**
* 插入记录
* @param record
* @return
*/
int insert(Record record);
/**
* 插入记录有效字段
* @param record
* @return
*/
int insertSelective(Record record);
/**
* 根据条件查询记录,附带BLOB字段
* @param example
* @return
*/
List<Record> selectByExampleWithBLOBs(Example example);
/**
* 根据条件查询记录
* @param example
* @return
*/
List<Record> selectByExample(Example example);
/**
* 根据条件查询记录并按页码分页,附带BLOB字段
* @param example 条件
* @param pageNum 页数
* @param pageSize 每页记录数
* @return
*/
List<Record> selectByExampleWithBLOBsForStartPage(Example example, Integer pageNum, Integer pageSize);
/**
* 根据条件查询记录并按页码分页
* @param example 条件
* @param pageNum 页数
* @param pageSize 每页记录数
* @return
*/
List<Record> selectByExampleForStartPage(Example example, Integer pageNum, Integer pageSize);
/**
* 根据条件查询记录并按最后记录数分页,附带BLOB字段
* @param example 条件
* @param offset 跳过数量
* @param limit 查询数量
* @return
*/
List<Record> selectByExampleWithBLOBsForOffsetPage(Example example, Integer offset, Integer limit);
/**
* 根据条件查询记录并按最后记录数分页
* @param example 条件
* @param offset 跳过数量
* @param limit 查询数量
* @return
*/
List<Record> selectByExampleForOffsetPage(Example example, Integer offset, Integer limit);
/**
* 根据条件查询第一条记录
* @param example
* @return
*/
Record selectFirstByExample(Example example);
/**
* 根据条件查询第一条记录,附带BLOB字段
* @param example
* @return
*/
Record selectFirstByExampleWithBLOBs(Example example);
/**
* 根据主键查询记录
* @param id
* @return
*/
Record selectByPrimaryKey(Integer id);
/**
* 根据条件更新有效字段
* @param record
* @param example
* @return
*/
int updateByExampleSelective(@Param("record") Record record, @Param("example") Example example);
/**
* 根据条件更新记录有效字段,附带BLOB字段
* @param record
* @param example
* @return
*/
int updateByExampleWithBLOBs(@Param("record") Record record, @Param("example") Example example);
/**
* 根据条件更新记录
* @param record
* @param example
* @return
*/
int updateByExample(@Param("record") Record record, @Param("example") Example example);
/**
* 根据主键更新记录有效字段
* @param record
* @return
*/
int updateByPrimaryKeySelective(Record record);
/**
* 根据主键更新记录,附带BLOB字段
* @param record
* @return
*/
int updateByPrimaryKeyWithBLOBs(Record record);
/**
* 根据主键更新记录
* @param record
* @return
*/
int updateByPrimaryKey(Record record);
/**
* 根据主键批量删除记录
* @param ids
* @return
*/
int deleteByPrimaryKeys(String ids);
/**
* 初始化mapper
*/
void initMapper();
service基础类得实现
public abstract class BaseServiceImpl<Mapper, Record, Example> implements BaseService<Record, Example> {
public Mapper mapper;
@Override
public int countByExample(Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method countByExample = mapper.getClass().getDeclaredMethod("countByExample", example.getClass());
Object result = countByExample.invoke(mapper, example);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int deleteByExample(Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method deleteByExample = mapper.getClass().getDeclaredMethod("deleteByExample", example.getClass());
Object result = deleteByExample.invoke(mapper, example);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int deleteByPrimaryKey(Integer id) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method deleteByPrimaryKey = mapper.getClass().getDeclaredMethod("deleteByPrimaryKey", id.getClass());
Object result = deleteByPrimaryKey.invoke(mapper, id);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int insert(Record record) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method insert = mapper.getClass().getDeclaredMethod("insert", record.getClass());
Object result = insert.invoke(mapper, record);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int insertSelective(Record record) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method insertSelective = mapper.getClass().getDeclaredMethod("insertSelective", record.getClass());
Object result = insertSelective.invoke(mapper, record);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public List<Record> selectByExampleWithBLOBs(Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByExampleWithBLOBs = mapper.getClass().getDeclaredMethod("selectByExampleWithBLOBs", example.getClass());
Object result = selectByExampleWithBLOBs.invoke(mapper, example);
return (List<Record>) result;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public List<Record> selectByExample(Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByExample = mapper.getClass().getDeclaredMethod("selectByExample", example.getClass());
Object result = selectByExample.invoke(mapper, example);
return (List<Record>) result;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public List<Record> selectByExampleWithBLOBsForStartPage(Example example, Integer pageNum, Integer pageSize) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByExampleWithBLOBs = mapper.getClass().getDeclaredMethod("selectByExampleWithBLOBs", example.getClass());
PageHelper.startPage(pageNum, pageSize, false);
Object result = selectByExampleWithBLOBs.invoke(mapper, example);
return (List<Record>) result;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public List<Record> selectByExampleForStartPage(Example example, Integer pageNum, Integer pageSize) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByExample = mapper.getClass().getDeclaredMethod("selectByExample", example.getClass());
PageHelper.startPage(pageNum, pageSize, false);
Object result = selectByExample.invoke(mapper, example);
return (List<Record>) result;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public List<Record> selectByExampleWithBLOBsForOffsetPage(Example example, Integer offset, Integer limit) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByExampleWithBLOBs = mapper.getClass().getDeclaredMethod("selectByExampleWithBLOBs", example.getClass());
PageHelper.offsetPage(offset, limit, false);
Object result = selectByExampleWithBLOBs.invoke(mapper, example);
return (List<Record>) result;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public List<Record> selectByExampleForOffsetPage(Example example, Integer offset, Integer limit) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByExample = mapper.getClass().getDeclaredMethod("selectByExample", example.getClass());
PageHelper.offsetPage(offset, limit, false);
Object result = selectByExample.invoke(mapper, example);
return (List<Record>) result;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public Record selectFirstByExample(Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByExample = mapper.getClass().getDeclaredMethod("selectByExample", example.getClass());
List<Record> result = (List<Record>) selectByExample.invoke(mapper, example);
if (null != result && result.size() > 0) {
return result.get(0);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public Record selectFirstByExampleWithBLOBs(Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByExampleWithBLOBs = mapper.getClass().getDeclaredMethod("selectByExampleWithBLOBs", example.getClass());
List<Record> result = (List<Record>) selectByExampleWithBLOBs.invoke(mapper, example);
if (null != result && result.size() > 0) {
return result.get(0);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public Record selectByPrimaryKey(Integer id) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
Method selectByPrimaryKey = mapper.getClass().getDeclaredMethod("selectByPrimaryKey", id.getClass());
Object result = selectByPrimaryKey.invoke(mapper, id);
return (Record) result;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return null;
}
@Override
public int updateByExampleSelective(Record record, Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method updateByExampleSelective = mapper.getClass().getDeclaredMethod("updateByExampleSelective", record.getClass(), example.getClass());
Object result = updateByExampleSelective.invoke(mapper, record, example);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int updateByExampleWithBLOBs(Record record, Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method updateByExampleWithBLOBs = mapper.getClass().getDeclaredMethod("updateByExampleWithBLOBs", record.getClass(), example.getClass());
Object result = updateByExampleWithBLOBs.invoke(mapper, record, example);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int updateByExample(Record record, Example example) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method updateByExample = mapper.getClass().getDeclaredMethod("updateByExample", record.getClass(), example.getClass());
Object result = updateByExample.invoke(mapper, record, example);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int updateByPrimaryKeySelective(Record record) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method updateByPrimaryKeySelective = mapper.getClass().getDeclaredMethod("updateByPrimaryKeySelective", record.getClass());
Object result = updateByPrimaryKeySelective.invoke(mapper, record);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int updateByPrimaryKeyWithBLOBs(Record record) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method updateByPrimaryKeyWithBLOBs = mapper.getClass().getDeclaredMethod("updateByPrimaryKeyWithBLOBs", record.getClass());
Object result = updateByPrimaryKeyWithBLOBs.invoke(mapper, record);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int updateByPrimaryKey(Record record) {
try {
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
Method updateByPrimaryKey = mapper.getClass().getDeclaredMethod("updateByPrimaryKey", record.getClass());
Object result = updateByPrimaryKey.invoke(mapper, record);
return Integer.parseInt(String.valueOf(result));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public int deleteByPrimaryKeys(String ids) {
try {
if (StringUtils.isBlank(ids)) {
return 0;
}
// DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
String[] idArray = ids.split("-");
int count = 0;
for (String idStr : idArray) {
if (StringUtils.isBlank(idStr)) {
continue;
}
Integer id = Integer.parseInt(idStr);
Method deleteByPrimaryKey = mapper.getClass().getDeclaredMethod("deleteByPrimaryKey", id.getClass());
Object result = deleteByPrimaryKey.invoke(mapper, id);
count += Integer.parseInt(String.valueOf(result));
}
return count;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// DynamicDataSource.clearDataSource();
return 0;
}
@Override
public void initMapper() {
this.mapper = SpringContextUtil.getBean(getMapperClass());
}
/**
* 获取类泛型class
* @return
*/
public Class<Mapper> getMapperClass() {
return (Class<Mapper>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
}
实现类上得初始化注解 /** * 初始化继承BaseService的service */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface BaseService { }