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);
    }
}
Java泛型类实现数据库增删改查操作

原文地址: https://www.cveoy.top/t/topic/jn08 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录