該工具類去除了寫普通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;
}