JDBC 工具類。不用連接池。純原生

該工具類去除了寫普通JDBC是一長串的ResultSet.getString,一長串這麼多爛代碼而產生。

以前上學時候就寫這個寫煩了。就想封裝。結果當時水平有限。沒搞好。我就放棄了。

現在技術可以了。特地封裝了一個。給各位。純手寫。輕噴各位大佬

package yoao.tu.utils;

import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author [email protected]
 * @create 2019-06-02 22:15
 */
public class JdbcUtils implements Serializable {
    
    /* logger */
    private static final Logger logger = LoggerFactory.getLogger(JdbcUtils.class);

    /**
     * 驅動類路徑
     */
    private static String driver = "com.mysql.cj.jdbc.Driver";

    /**
     *  鏈接字符串
     */
    private static String url = "jdbc:mysql://localhost:3306/dee";

    /**
     * 用戶名
     */
    private static String user = "root";

    /**
     * 密碼
     */
    private static String pass = "123123123";

    /**
     * 數據庫鏈接對象   全局統一
     */
    private static volatile Connection conn = null;

    /**
     * 初始化Connection 對象
     * @author [email protected]
     * @time 22:26
     * @params
     */
    static {
        if (conn == null) {
            try {
                Class.forName(driver);
                conn = DriverManager.getConnection(url, user, pass);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 查詢列表
     * @author [email protected]
     * @time 23:04
     * @params [sql, className, params]
     */
    public static <T> List<T> selectList(String sql, Class<T> className, Object... params) {
        // 非空判斷
        if (StringUtils.isBlank(sql) || className == null) {
            return null;
        }

        printBasicLogger(sql, params);
        PreparedStatement prepared = prepared(sql, params);
        List<T> result = null;
        try {
            ResultSet resultSet = prepared.executeQuery();
            result = new ArrayList<>();
            while (resultSet.next()) {
                // 判斷是不是基本數據類型
                if (!isValType(className)) {
                    T t = className.newInstance();
                    // 獲取所有屬性
                    Field[] fields = className.getDeclaredFields();
                    for (Field field : fields) {
                        field.setAccessible(true);
                        field.set(t, resultSet.getObject(humpToUnderline(field.getName())));
                    }
                    result.add(t);
                }else {
                    T t = (T) resultSet.getObject(0);
                    result.add(t);
                }
            }
        } catch(SQLException e){
            e.printStackTrace();
        } catch(IllegalAccessException e){
            e.printStackTrace();
        } catch(InstantiationException e){
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 查詢單個對象
     * @author [email protected]
     * @time 09:43
     * @params
     */
    public static <T> T selectOne(String sql, Class<T> className, Object... params) {
        List<T> temp = selectList(sql, className, params);
        return temp == null ? null : temp.get(0);
    }

    /**
     * 添加方法
     * @author [email protected]
     * @time 11:27
     * @params
     */
    public static <T> int insert(T t) {
        if (t == null) {
            return 0;
        }

        Class className = t.getClass();

        // 拼接 sql 語句
        StringBuffer sb = new StringBuffer("insert into ");
        // 獲取類名轉換表名
        sb.append(humpToUnderline(className.getSimpleName()));

        // 獲取類所有屬性
        Field[] fields = className.getDeclaredFields();

        try {
            sb.append("(");
            List<Object> values = new ArrayList<>();
            for (Field field : fields) {
                field.setAccessible(true);
                Object temp = field.get(t);
                if (temp != null) {
                    if (values.size() == 0) {
                        values.add(temp);
                        sb.append(humpToUnderline(field.getName()));
                    } else {
                        values.add(temp);
                        sb.append(", " + humpToUnderline(field.getName()));
                    }
                }
            }
            sb.append(") values (");
            for (int i = 0; i < values.size(); i++) {
                if (i == 0) {
                    sb.append("?");
                    continue;
                }
                sb.append(", ?");
            }
            sb.append(")");

            printBasicLogger(sb.toString(), values);
            PreparedStatement prepared = prepared(sb.toString(), values.toArray());
            return prepared.executeUpdate();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return 0;
    }

    /**
     * 修改方法
     * @author [email protected]
     * @time 19:47
     * @params
     */
    public static <T> int update(T t, Map<String, Object> map) {
        if (t == null || map == null) {
            return 0;
        }

        Class className = t.getClass();

        // 拼接sql語句
        StringBuffer sb = new StringBuffer("update " + humpToUnderline(className.getSimpleName()) + " set ");
        Field[] fields = className.getDeclaredFields();

        try {
            // 參數集合
            List<Object> values = new ArrayList<>();
            for (Field field : fields) {
                field.setAccessible(true);
                Object temp = field.get(t);

                if (temp == null)
                    continue;

                // 拼接sql
                if (values.size() == 0) {
                    sb.append(field.getName() + " = ? ");
                    // 參數集合賦值
                    values.add(temp);
                } else {
                    sb.append(", " + field.getName() + " = ? ");
                    // 參數集合賦值
                    values.add(temp);
                }
            }
            sb.append(" where ");
            List<Object> whereValues = new ArrayList<>();
            for (String key : map.keySet()) {
                if (whereValues.size() == 0) {
                    sb.append(humpToUnderline(key) + " = ?");
                    whereValues.add(map.get(key));
                    continue;
                }
                sb.append(" and " + humpToUnderline(key) + " = ?");
                whereValues.add(map.get(key));
            }

            values.addAll(whereValues);
            printBasicLogger(sb.toString(), values);
            PreparedStatement prepared = prepared(sb.toString(), values.toArray());
            return prepared.executeUpdate();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return 0;
    }


    /**
     * 刪除方法
     * @author [email protected]
     * @time 20:33
     * @params
     */
    public static <T> int delete(String tableName, Map<String, Object> map) {
        if (StringUtils.isBlank(tableName) || map == null || map.keySet().size() == 0) {
            return 0;
        }

        StringBuffer sb = new StringBuffer("delete from " + tableName + " where ");
        List<Object> values = new ArrayList<>();
        for (String key : map.keySet()) {
            if (values.size() == 0) {
                sb.append(humpToUnderline(key) + " = ? ");
                values.add(map.get(key));
                continue;
            }
            sb.append(" and " + humpToUnderline(key) + " = ? ");
            values.add(map.get(key));
        }

        printBasicLogger(sb.toString(), values);
        PreparedStatement prepared = prepared(sb.toString(), values.toArray());
        try {
            return prepared.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 刪除 主動提供sql
     * @author [email protected]
     * @time 21:03
     * @params
     */
    public static int delete(String sql, Object... params) {
        PreparedStatement prepared = prepared(sql, params);
        try {
            return prepared.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return 0;
    }

    private static void printBasicLogger(String sql, Object obj) {
        logger.info("執行sql: {}", sql);
        logger.info("sql動態參數: {}", JSONObject.toJSONString(obj));
    }

    /**
     * 執行參數
     * @author [email protected]
     * @time 23:08
     * @params
     */
    private static PreparedStatement prepared(String sql, Object... params) {
        // 最後返回值
        PreparedStatement pstmt = null;
        try {
            pstmt = conn.prepareStatement(sql);
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return pstmt;
    }

    /**
     * 駝峯轉換下劃線
     * @author [email protected]
     * @time 23:01
     * @params
     */
    private static String humpToUnderline(String humpString) {
        if(StringUtils.isBlank(humpString)) return "";
        String regexStr = "[A-Z]";
        Matcher matcher = Pattern.compile(regexStr).matcher(humpString);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String g = matcher.group();
            matcher.appendReplacement(sb, "_" + g.toLowerCase());
        }
        matcher.appendTail(sb);
        if (sb.charAt(0) == '_') {
            sb.delete(0, 1);
        }
        return sb.toString();
    }



    /**
     * 判斷是不是基本數據類型包裝類
     * @author [email protected]
     * @time 22:47
     * @params
     */
    private static boolean isValType(Class className) {
        if (className == null) {
            return false;
        } else if(className.equals(String.class)) {
            return true;
        } else if(className.equals(Integer.class)) {
            return true;
        } else if(className.equals(Long.class)) {
            return true;
        } else if(className.equals(Short.class)) {
            return true;
        } else if(className.equals(Double.class)) {
            return true;
        } else if(className.equals(Float.class)) {
            return true;
        } else if(className.equals(Character.class)) {
            return true;
        } else if(className.equals(Byte.class)) {
            return true;
        }

        return false;
    }

    public static void main(String[] args) {
        // 查找集合
        List<Test> tests = selectList("select * from test", Test.class);

        // 查詢單個
        Test test = selectOne("select * from test where name = zs", Test.class);

        // 添加
        int insertResult = insert(test);

        // 修改
        Map<String, Object> updateParams = new HashMap<>();
        updateParams.put("name", "zs");
        int updateResult = update(test, updateParams);

        // 根據條件刪除
        Map<String, Object> deleteParams = new HashMap<>();
        deleteParams.put("name", "zs");
        int deleteResult1 = delete("test", deleteParams);


        // 根據sql刪除
        int deleteResult = delete("delete from test where name = ?", "zs");
    }

}

@Data
class Test{
    private String name;
    private String age;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章