首页>代码>原生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");
    }
}
最近下载更多
最代码官方  LV168 2023年2月11日
最近浏览更多
pxqtsht  LV16 2月21日
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日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友