首页>代码>原生jdbc实现单表通用CRUD实例>/jdbc-ext-demo/src/main/java/com/cxs/dao/impl/BaseDaoImpl.java
package com.cxs.dao.impl;

import com.cxs.annotation.TableId;
import com.cxs.dao.BaseDao;
import com.cxs.exceptions.PrimaryMissException;
import com.cxs.handler.impl.ResultBeanAsBeanHandler;
import com.cxs.handler.impl.ResultBeanAsListHandler;
import com.cxs.template.JdbcTemplate;
import com.cxs.utils.UnderlineToHumpCaseUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringJoiner;

/**
 * @Project: jdbc-ext-demo
 * @Author: cxs2014501@163.com
 * @Description:
 **/
public class BaseDaoImpl<T> implements BaseDao<T> {

    private static Logger logger = LogManager.getLogger(BaseDaoImpl.class);

    private Class<T> clazz;

    public BaseDaoImpl(Class<T> clazz){
        this.clazz = clazz;
    }

    @Override
    public int insert(T t) {
        int result = 0;
        try {
            String tableName = getTableName();
            String insertSql = getInsertSql(t, tableName, Boolean.FALSE);
            logger.info("sql:===> {}", insertSql);
            Object[] values = getTValue(t, Boolean.FALSE);
            logger.info("params:{}", Arrays.asList(values));
            result = JdbcTemplate.executeDMLSql(insertSql, values);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    public List<T> selectAll() {
        String sql = "select * from " + getTableName();
        logger.info("sql:===> {}", sql);
        return JdbcTemplate.executeDQLSql(sql, new ResultBeanAsListHandler<T>(clazz));
    }

    @Override
    public int updateById(T t) {
        int result = 0;
        try {
            String tableName = getTableName();
            String updateSql = getUpdateSql(t, tableName, Boolean.FALSE);
            Object[] values = getUpdateTValue(t, Boolean.FALSE);
            logger.info("sql:===> {}", updateSql);
            logger.info("params:{}", Arrays.asList(values));
            result = JdbcTemplate.executeDMLSql(updateSql, values);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    public int updateSelectiveById(T t) {
        int result = 0;
        try {
            String tableName = getTableName();
            String updateSql = getUpdateSql(t, tableName, Boolean.TRUE);
            logger.info("sql:===> {}", updateSql);
            Object[] values = getUpdateTValue(t, Boolean.TRUE);
            logger.info("params:{}", Arrays.asList(values));
            result = JdbcTemplate.executeDMLSql(updateSql, values);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    public int deleteById(Object id) {
        String tableName = getTableName();
        String sql = "delete from " + tableName + " where " + getIdColumn() + " = ?";
        logger.info("sql:===> {}", sql);
        logger.info("params:{}", Arrays.asList(id));
        return JdbcTemplate.executeDMLSql(sql, id);
    }

    @Override
    public T selectById(Object id) {
        String sql = "select * from " + getTableName() + " where " + getIdColumn() + " = ?";
        logger.info("sql:===> {}", sql);
        logger.info("params:{}", Arrays.asList(id));
        return JdbcTemplate.executeDQLSql(sql, new ResultBeanAsBeanHandler<>(clazz), id);
    }

    private String getTableName() {
        return UnderlineToHumpCaseUtil.humpCaseToUnderline(clazz.getSimpleName());
    }


    private Object[] getUpdateTValue(T t, Boolean flag) throws IllegalAccessException {
        List<Object> list = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
        String primaryKey = null;
        Object primaryValue = null;
        if (null != fields && fields.length > 0) {
            for (Field field : fields) {
                field.setAccessible(true);
                if (field.isAnnotationPresent(TableId.class)) {
                    primaryKey = UnderlineToHumpCaseUtil.humpCaseToUnderline(field.getName());
                    primaryValue = field.get(t);
                }
            }
            if (primaryKey == null || primaryValue == null) {
                throw new PrimaryMissException("table \"" + getTableName() + "\" miss annocation @TableId");
            }
            if (flag) {
                for (Field field : fields) {
                    field.setAccessible(true);
                    Object o = field.get(t);
                    if (null != o && !UnderlineToHumpCaseUtil.humpCaseToUnderline(field.getName()).equals(primaryKey)){
                        list.add(o);
                    }
                }
            } else {
                for (Field field : fields) {
                    field.setAccessible(true);
                    Object o = field.get(t);
                    if (!UnderlineToHumpCaseUtil.humpCaseToUnderline(field.getName()).equals(primaryKey)){
                        list.add(o);
                    }
                }
            }
            list.add(primaryValue);
        }
        return list.toArray(new Object[0]);
    }

    /**
     * 获得修改的SQL
     * @param t
     * @param tableName
     * @param flag
     * @return
     */
    private String getUpdateSql(T t, String tableName, Boolean flag) throws IllegalAccessException {
        StringBuilder sqlBuild = new StringBuilder("update ");
        sqlBuild.append(tableName);
        sqlBuild.append(" set ");
        String primaryKey = null;
        Object primaryValue = null;
        Field[] fields = clazz.getDeclaredFields();
        if (null != fields && fields.length > 0) {
            StringJoiner joiner = new StringJoiner(",");
            for (Field field : fields) {
                field.setAccessible(true);
                if (field.isAnnotationPresent(TableId.class)) {
                    primaryKey = UnderlineToHumpCaseUtil.humpCaseToUnderline(field.getName());
                    primaryValue = field.get(t);
                }
            }
            if (primaryKey == null || primaryValue == null) {
                throw new PrimaryMissException("table \"" + tableName + "\" miss annocation @TableId");
            }
            if (flag) {
                for (Field field : fields) {
                    field.setAccessible(true);
                    String name = field.getName();
                    Object value = field.get(t);
                    if (null != value && !UnderlineToHumpCaseUtil.underlineToHumpCase(name).equals(primaryKey)) {
                        joiner.add(UnderlineToHumpCaseUtil.humpCaseToUnderline(name) + "=?");
                    }
                }
                sqlBuild.append(joiner.toString());
            } else {
                for (Field field : fields) {
                    field.setAccessible(true);
                    String name = field.getName();
                    if (!UnderlineToHumpCaseUtil.underlineToHumpCase(name).equals(primaryKey)) {
                        joiner.add(UnderlineToHumpCaseUtil.humpCaseToUnderline(name) + "=?");
                    }
                }
                sqlBuild.append(joiner.toString());
            }
            sqlBuild.append(" where ");
            sqlBuild.append(primaryKey);
            sqlBuild.append(" = ?");
        }
        return sqlBuild.toString();
    }

    private Object[] getTValue(T t, Boolean flag) throws IllegalAccessException {
        List<Object> list = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
        if (null != fields && fields.length > 0) {
            if (flag) {
                for (Field field : fields) {
                    field.setAccessible(true);
                    Object o = field.get(t);
                    if (null != o){
                        list.add(o);
                    }
                }
            } else {
                for (Field field : fields) {
                    field.setAccessible(true);
                    Object o = field.get(t);
                    list.add(o);
                }
            }
        }
        return list.toArray(new Object[0]);
    }

    private String getInsertSql(T t, String tableName, Boolean flag) throws IllegalAccessException {
        StringBuilder sqlBuild = new StringBuilder("insert into ");
        StringJoiner params = new StringJoiner(",");
        sqlBuild.append(tableName);
        sqlBuild.append("(");
        Field[] fields = clazz.getDeclaredFields();
        if (null != fields && fields.length > 0) {
            StringJoiner joiner = new StringJoiner(",");
            if (flag) {
                for (Field field : fields) {
                    field.setAccessible(true);
                    String name = field.getName();
                    Object value = field.get(t);
                    if (null != value) {
                        joiner.add(UnderlineToHumpCaseUtil.humpCaseToUnderline(name));
                        params.add("?");
                    }
                }
                sqlBuild.append(joiner.toString());
            } else {
                for (Field field : fields) {
                    String name = field.getName();
                    joiner.add(UnderlineToHumpCaseUtil.humpCaseToUnderline(name));
                    params.add("?");
                }
                sqlBuild.append(joiner.toString());
            }
            sqlBuild.append(") ");
            sqlBuild.append("values(");
            sqlBuild.append(params.toString());
            sqlBuild.append(")");
        }
        return sqlBuild.toString();
    }

    private String getIdColumn(){
        Field[] fields = clazz.getDeclaredFields();
        if (null != fields && fields.length > 0) {
            for (Field field : fields) {
                if (field.isAnnotationPresent(TableId.class)) {
                    return UnderlineToHumpCaseUtil.humpCaseToUnderline(field.getName());
                }
            }
        }
        throw new PrimaryMissException("table \"" + getTableName() + "\" miss annocation @TableId");
    }
}
最近下载更多
最代码官方  LV167 2023年2月11日
最近浏览更多
szy20001006  LV2 2023年6月16日
ericxu1116  LV24 2023年6月14日
wuge123  LV8 2023年6月12日
天士大夫  LV2 2023年5月25日
yzshabzbbdvw  LV4 2023年4月15日
做你的景天  LV7 2023年4月12日
 LV7 2023年3月29日
a20090421166  LV2 2023年3月28日
微信网友_6398458437226496  LV5 2023年3月27日
zengxq056  LV2 2023年3月18日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友