Java泛型类实现数据库增删改查操作
package com.ideabobo.serviceImp;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import com.ideabobo.pojo.Params;
import com.ideabobo.service.DatabaseService;
/**
* 数据库操作实现类,使用泛型提供通用的数据库交互方法
*/
public class DatabaseServiceImp<T> {
@Autowired
private DatabaseService databaseService;
/**
* 执行增删改SQL操作
*
* @param sql 需要执行的SQL语句
* @return 受影响的行数
*/
public long executeAction(String sql) {
return databaseService.executeAction(sql);
}
/**
* 查询单条数据
*
* @param sql 需要执行的SQL语句
* @return 查询结果,以Map形式存储
*/
public Map<String, Object> findFirst(String sql) {
return databaseService.findFirst(sql);
}
/**
* 查询多条数据
*
* @param sql 需要执行的SQL语句
* @return 查询结果列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> find(String sql) {
return databaseService.find(sql);
}
/**
* 查询数据条数
*
* @param sql 需要执行的SQL语句
* @return 数据条数
*/
public long findCount(String sql) {
return databaseService.findCount(sql);
}
/**
* 查询单个值
*
* @param sql 需要执行的SQL语句
* @return 查询结果的单个值
*/
public Object findOneValue(String sql) {
return databaseService.findOneValue(sql);
}
/**
* 拼接SQL,实现预处理语句
*
* @param sql 预处理的SQL语句
* @param searchParams 查询参数
* @return 拼接后的SQL语句
*/
protected String sqlAppend(String sql, Map<String, Object> searchParams) {
for (String key : searchParams.keySet()) {
sql = sql.replaceAll(':' + key, ''' + searchParams.get(key).toString().replaceAll("'", '') + ''');
}
return sql;
}
/**
* 验证字符串,防止SQL注入
*
* @param value 需要验证的字符串
* @return 验证后的字符串
*/
protected String validateValue(String value) {
return ''' + value.replaceAll("'", '') + ''';
}
/**
* 去掉所有单引号
*
* @param value 需要处理的字符串
* @return 处理后的字符串
*/
protected String deleteSpoit(String value) {
return value.replaceAll("'", '');
}
/**
* 拼接Where条件SQL语句
*
* @param searchParams 查询参数
* @return 拼接后的Where条件SQL语句
*/
protected StringBuffer appendWhereSql(Map<String, Object> searchParams) {
StringBuffer sqlBuffer = new StringBuffer('');
if (searchParams != null && searchParams.size() > 0) {
sqlBuffer.append(" where ");
for (String key : searchParams.keySet()) {
sqlBuffer.append(key).append(" = ").append(''').append(searchParams.get(key).toString().replaceAll("'", '')).append("' or ");
}
int length = sqlBuffer.length();
return sqlBuffer.delete(length - 3, length);
} else {
return sqlBuffer;
}
}
/**
* 获取实体类对应的表名
*
* @param entityName 实体类Class对象
* @return 表名
*/
private String getTableName(Class<? extends Object> entityName) {
return entityName.getSimpleName().toUpperCase();
}
/**
* 添加实体
*
* @param entityName 实体类Class对象
* @param addData 添加的数据
* @return 主键ID
*/
public long addClass(Class<T> entityName, Map<String, Object> addData) {
Params params = new Params();
params.setTables(getTableName(entityName));
params.setInsertMap(addData);
databaseService.addEntity(params);
return params.getId();
}
/**
* 批量添加数据
*
* @param entityName 实体类Class对象
* @param listMap 批量数据集合
* @return 受影响的行数
*/
public int batchAdd(Class<T> entityName, List<Map<String, Object>> listMap) {
Params params = new Params();
params.setTables(getTableName(entityName));
params.setInsertMap(listMap.get(0));
params.setBacthInsertMap(listMap);
return databaseService.batchAdd(params);
}
/**
* 根据条件修改实体
*
* @param entityName 实体类Class对象
* @param updateData 修改数据
* @param whereSql 条件语句
* @return 是否修改成功
*/
public boolean updateByWhere(Class<T> entityName, Map<String, Object> updateData, String whereSql) {
boolean bool = false;
try {
StringBuffer sb = new StringBuffer("update ");
sb.append(getTableName(entityName)).append(" set ");
Iterator<String> it = updateData.keySet().iterator();
StringBuffer updateBuffer = new StringBuffer();
while (it.hasNext()) {
String key = it.next();
if (updateData.get(key) == null) {
updateBuffer.append(key).append('=').append("null").append(',');
} else {
updateBuffer.append(key).append('=').append(':' + key).append(',');
}
}
sb.append(updateBuffer.substring(0, updateBuffer.length() - 1)).append(whereSql);
bool = databaseService.executeAction(sqlAppend(sb.toString(), updateData)) > 0;
} catch (Exception e) {
e.printStackTrace();
}
return bool;
}
/**
* 根据ID删除数据
*
* @param entityName 实体类Class对象
* @param id 数据ID
* @return 受影响的行数
*/
public long deleteById(Class<T> entityName, Object id) {
String sql = "delete from " + getTableName(entityName) + " where id = " + id;
return databaseService.executeAction(sql);
}
/**
* 获取实体类字段列表
*
* @param clazz 实体类Class对象
* @return 字段列表字符串,以逗号分隔
*/
public static String getClassColumns(Class<?> clazz) {
String columns = '';
// 定义实体信息对象
BeanInfo beanInfo;
try {
// 获取实体详细信息
beanInfo = Introspector.getBeanInfo(clazz);
// 获取实体属性描述集合
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; i++) {
// 获取属性描述
PropertyDescriptor descriptor = propertyDescriptors[i];
// 获取属性名
String propertyName = descriptor.getName();
if (!propertyName.equals("class")) {
columns += propertyName + ",";
}
}
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return columns.substring(0, columns.length() - 1);
}
/**
* 根据实体类获取数据列表(无条件)
*
* @param clazz 实体类Class对象
* @return 数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(Class<?> clazz) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append("SELECT ").append(getClassColumns(clazz)).append(" FROM ").append(getTableName(clazz));
return databaseService.find(sql.toString());
}
/**
* 根据实体类获取单条数据(无条件)
*
* @param clazz 实体类Class对象
* @return 单条数据,以Map形式存储
*/
public Map<String, Object> getByBean(Class<?> clazz) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append("SELECT ").append(getClassColumns(clazz)).append(" FROM ").append(getTableName(clazz));
return databaseService.findFirst(sql.toString());
}
/**
* 根据实体类获取单条数据
*
* @param clazz 实体类Class对象
* @param whereSql 查询条件
* @return 单条数据,以Map形式存储
*/
public Map<String, Object> getBean(Class<?> clazz, String whereSql) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append("SELECT ").append(getClassColumns(clazz)).append(" FROM ").append(getTableName(clazz));
//条件
sql.append(' ').append(whereSql);
return databaseService.findFirst(sql.toString());
}
/**
* 根据实体类获取数据列表
*
* @param clazz 实体类Class对象
* @param whereSql 查询条件
* @return 数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(Class<?> clazz, String whereSql) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append("SELECT ").append(getClassColumns(clazz)).append(" FROM ").append(getTableName(clazz));
//条件
sql.append(' ').append(whereSql);
return databaseService.find(sql.toString());
}
/**
* 根据实体类获取分页数据列表
*
* @param clazz 实体类Class对象
* @param whereSql 查询条件
* @param page 开始页码
* @param rows 每页数据条数
* @return 分页数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(Class<?> clazz, String whereSql, int page, int rows) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append("SELECT ").append(getClassColumns(clazz)).append(" FROM ").append(getTableName(clazz));
//条件
sql.append(' ').append(whereSql);
//分页
sql.append(" limit ").append((page - 1) * rows).append(',').append(rows);
return databaseService.find(sql.toString());
}
/**
* 根据实体类获取分页排序数据列表
*
* @param clazz 实体类Class对象
* @param whereSql 查询条件
* @param page 开始页码
* @param rows 每页数据条数
* @param sortColumn 排序字段
* @param sort 排序方式
* @return 分页排序数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(Class<?> clazz, String whereSql, int page, int rows, String sortColumn, String sort) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append("SELECT ").append(getClassColumns(clazz)).append(" FROM ").append(getTableName(clazz));
//条件
sql.append(' ').append(whereSql);
//排序
sql.append(" ORDER BY ").append(sortColumn).append(' ').append(sort);
//分页
sql.append(" LIMIT ").append((page - 1) * rows).append(',').append(rows);
return databaseService.find(sql.toString());
}
/**
* 根据实体类获取分页数据列表
*
* @param clazz 实体类Class对象
* @param page 开始页码
* @param rows 每页数据条数
* @return 分页数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(Class<?> clazz, int page, int rows) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append("SELECT ").append(getClassColumns(clazz)).append(" FROM ").append(getTableName(clazz));
//分页
sql.append(" limit ").append((page - 1) * rows).append(',').append(rows);
return databaseService.find(sql.toString());
}
/**
* 根据实体类获取分页排序数据列表
*
* @param clazz 实体类Class对象
* @param page 开始页码
* @param rows 每页数据条数
* @param sortColumn 排序字段
* @param sort 排序方式
* @return 分页排序数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(Class<?> clazz, int page, int rows, String sortColumn, String sort) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append("SELECT ").append(getClassColumns(clazz)).append(" FROM ").append(getTableName(clazz));
//排序
sql.append(" ORDER BY ").append(sortColumn).append(' ').append(sort);
//分页
sql.append(" LIMIT ").append((page - 1) * rows).append(',').append(rows);
return databaseService.find(sql.toString());
}
/**
* 根据自定义SQL语句获取分页数据列表
*
* @param sqlStr 自定义SQL语句
* @param whereSql 查询条件
* @param page 开始页码
* @param rows 每页数据条数
* @return 分页数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(String sqlStr, String whereSql, int page, int rows) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append(sqlStr);
//条件
sql.append(' ').append(whereSql);
//分页
sql.append(" limit ").append((page - 1) * rows).append(',').append(rows);
return databaseService.find(sql.toString());
}
/**
* 根据自定义SQL语句获取分页排序数据列表
*
* @param sqlStr 自定义SQL语句
* @param whereSql 查询条件
* @param page 开始页码
* @param rows 每页数据条数
* @param sortColumn 排序字段
* @param sort 排序方式
* @return 分页排序数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(String sqlStr, String whereSql, int page, int rows, String sortColumn, String sort) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append(sqlStr);
//条件
sql.append(' ').append(whereSql);
//排序
sql.append(" ORDER BY ").append(sortColumn).append(' ').append(sort);
//分页
sql.append(" LIMIT ").append((page - 1) * rows).append(',').append(rows);
return databaseService.find(sql.toString());
}
/**
* 根据自定义SQL语句获取分页数据列表
*
* @param sqlStr 自定义SQL语句
* @param page 开始页码
* @param rows 每页数据条数
* @return 分页数据列表,每个元素以Map形式存储
*/
public List<Map<String, Object>> getListByBean(String sqlStr, int page, int rows) {
StringBuffer sql = new StringBuffer();
//查询部分
sql.append(sqlStr);
//分页
sql.append(" limit ").append((page - 1) * rows).append(',').append(rows);
return databaseService.find(sql.toString());
}
/**
* 批量删除数据
*
* @param clazz 实体类Class对象
* @param deleteList 需要删除的数据ID集合
* @param deleteColumnName 批量删除条件字段名
* @return 受影响的行数
*/
public int batchDelete(Class<?> clazz, List<?> deleteList, String deleteColumnName) {
Params params = new Params();
params.setDeleteCoulumnName(deleteColumnName);
params.setDeleteList(deleteList);
params.setTables(getTableName(clazz));
return databaseService.batchDelete(params);
}
}
原文地址: https://www.cveoy.top/t/topic/jn08 著作权归作者所有。请勿转载和采集!