JdbcTemplate工具类DbCriteria--插入

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializeWriter;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.sql.PreparedStatement;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * Author: sir.li
 * email:  [email protected]
 * Date:   2020/8/6
 */
@Component
public class DbCriteria implements ApplicationContextAware {
    private static final String UNDERLINE = "_";
    private static final String COMMA = ",";
    private static JdbcTemplate jdbcTemplate;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        jdbcTemplate = applicationContext.getBean(JdbcTemplate.class);
    }

    /**
     * @param preSql eg:select u.id,c.create_time from user as u join chat as c on chat.sender_id = u.id;
     */
    public static <T> List<T> getMixList(String preSql, Class<T> clazz) {
        return jdbcTemplate.queryForList(preSql, clazz);
    }

    /**
     * @param factors eg:user where phone = '13838384381'
     */
    public static <T> List<T> getList(String factors, Class<T> clazz) {
        StringBuilder preSql = new StringBuilder("select ");
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            preSql.append(camelToUnderline(field.getName())).append(" ");
        }
        preSql.append("from ").append(factors);
        return jdbcTemplate.queryForList(preSql.toString(), clazz);
    }

    public static <T> T queryById(Integer onlyKey,String tableName,Class<T> clazz) {
        StringBuilder preSql = new StringBuilder("select ");
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            preSql.append(camelToUnderline(field.getName())).append(" ");
        }
        preSql.append("from ").append(tableName).append(" where id=").append(onlyKey);
        return jdbcTemplate.queryForObject(preSql.toString(), clazz);
    }

    public static long updateById(Object obj) {
        JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(obj, getDataSerializeConfig()));
        StringBuilder preSql = new StringBuilder("update " + getTableName(obj) + " set ");
        json.forEach((key, value) -> {
            if (!key.equals("id")) {
                preSql.append(camelToUnderline(key)).append("=")
                        .append(preValue(value)).append(COMMA);
            }
        });
        preSql.deleteCharAt(preSql.length() - 1);
        preSql.append(" where id =").append(preValue(json.get("id"))).append(";");
        return jdbcTemplate.update(preSql.toString());
    }

    public static long insert(Object obj) {
        return insert(obj, getTableName(obj));
    }

    private static String getTableName(Object obj) {
        Type type = obj.getClass().getGenericSuperclass();
        String typeName = type.getTypeName();
        String preName = typeName.substring(typeName.lastIndexOf(".") + 1);
        String first = preName.substring(0, 1);
        return camelToUnderline(preName.replaceFirst(first, first.toLowerCase()));
    }

    public static long insert(Object obj, String tableName) {
        JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(obj, getDataSerializeConfig()));
        StringBuilder preSql = new StringBuilder("insert into " + tableName);
        StringBuilder keys = new StringBuilder(" (");
        StringBuilder values = new StringBuilder("(");
        json.forEach((key, value) -> {
            keys.append(camelToUnderline(key)).append(COMMA);
            values.append(preValue(value)).append(COMMA);
        });
        keys.deleteCharAt(keys.length() - 1);
        values.deleteCharAt(values.length() - 1);
        keys.append(") values ");
        values.append(");");
        preSql.append(keys.toString()).append(values.toString());
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(con -> con.prepareStatement(preSql.toString(), PreparedStatement.RETURN_GENERATED_KEYS), keyHolder);
        return Objects.requireNonNull(keyHolder.getKey()).intValue();
    }


    private static Object preValue(Object value) {
        if (value instanceof String) {
            return "'" + value + "'";
        } else if (value instanceof Number) {
            return value;
        } else {
            return "'" + JSONObject.toJSONString(value) + "'";
        }
    }

    private static String camelToUnderline(String filedName) {
        int len = filedName.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = filedName.charAt(i);
            if (Character.isUpperCase(c)) {
                sb.append(UNDERLINE);
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * 日期序列化处理config
     *
     * @return config
     */
    private static SerializeConfig getDataSerializeConfig() {
        SerializeConfig config = new SerializeConfig();
        ObjectSerializer dateSerializer = (jsonSerializer, o, o1, type, i) -> {
            SerializeWriter out = jsonSerializer.getWriter();
            if (o != null) {
                Date date = (Date) o;
                Instant instant = date.toInstant();
                ZoneId zoneId = ZoneId.systemDefault();
                LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
                out.write("\"" + localDateTime.toString() + "\"");
            } else {
                jsonSerializer.getWriter().writeNull();
            }
        };
        config.put(Date.class, dateSerializer);
        return config;
    }
}

使用说明

  1. 需要引入spring-jdbc
  2. 需要引入Alibaba-fastjson

你可能感兴趣的:(JdbcTemplate工具类DbCriteria--插入)