DaoUtil 类
package com.du.util;
import javax.servlet.http.HttpServletRequest;
import java.sql.*;
import java.util.*;
/**
* DAO 工具
* <p>
* 设置好数据库 table 和 id 字段名,无需再写那么多 SQL 代码了
* </p>
*/
public class DaoUtil {
private static Map<String, DaoUtil> map = new HashMap<>();
private DBUtil db;
/**
* 当前操作的表
*/
private String table;
/**
* 这个表的自增的 ID 的字段名
*/
private String idField;
/**
* DAO 层工具
*/
private DaoUtil(String databaseName, String username, String password) {
db = new DBUtil(databaseName, username, password);
}
/**
* 实例化
*
* @param databaseName 数据库名
* @param username 数据库登陆用户名
* @param password 密码
* @return 返回实例化后的 DAOUtil 对象
*/
public static DaoUtil instance(String databaseName, String username, String password) {
if (map.containsKey(databaseName)) {
return map.get(databaseName);
}
DaoUtil dao = new DaoUtil(databaseName, username, password);
map.put(databaseName, dao);
return dao;
}
/**
* 获取 Request 中携带的数据
*
* @param request Request请求
* @param paramKey 要获取的 Key
* @return 返回 Map 格式的数据
*/
public static Map<String, Object> getRequestParameter(HttpServletRequest request, String... paramKey) {
Map<String, Object> map = new HashMap<>();
for (String key : paramKey) {
map.put(key, request.getParameter(key));
}
return map;
}
/**
* 切换数据库
*
* @param database 数据库名称
* @return 返回对应数据库的 DaoUtil
*/
public DaoUtil switchDatabase(String database) {
return map.get(database);
}
/**
* 初始化
*
* @param table 表名
* @param idField 字段名
* @return 返回初始化后的 DaoUtil
*/
public DaoUtil init(String table, String idField) {
this.table = table;
this.idField = idField;
return this;
}
/**
* 设置 Table
*
* @param table 表名
* @return 返回设置后的 DaoUtil
*/
public DaoUtil setTable(String table) {
this.table = table;
return this;
}
public DaoUtil setIdField(String idField) {
this.idField = idField;
return this;
}
/**
* 删除(删)
*
* @param where 条件。格式:"字段1=? AND 字段2=?"
* @param obj 条件参数值。格式:值1, 值2
* @return 返回删除数量
*/
public int delete(String where, Object... obj) {
String sql = "DELETE FROM " + table;
sql += " where " + where;
System.out.println("sql = " + sql);
// 删除
return db.update(sql, obj);
}
/**
* 删除
*
* @param id 删除的 id
* @return 返回删除数量
*/
public int delete(String id) {
return delete(idField + "=?", id);
}
/**
* 查询(查单个)
*
* @param id 查询指定条件的
* @return 返回查询数据
*/
public Map query(String id) {
String sql = "SELECT * FROM " + table;
sql += " WHERE " + idField + "=?";
System.out.println("sql=" + sql);
// 查找
List<Map> list = db.query(sql, id);
if (list.size() > 0) {
return list.get(0);
} else {
return null;
}
}
public Map query(String where, Object... obj) {
List<Map> list = queryForList(where, obj);
if (list.size() > 0) {
return list.get(0);
} else {
return null;
}
}
public Map query(Map where) {
Object[][] fieldAndValue = getFieldAndValue(where);
Object[] values = fieldAndValue[1];
String whereStr = mapToWhere(where);
return query(whereStr, values);
}
/**
* 列表(查多个)
*
* @return 返回表中所有内容
*/
public List<Map> queryForList() {
String sql = "SELECT * FROM " + table;
System.out.println("sql=" + sql);
return db.query(sql);
}
/**
* 查询条件
*
* @param where 条件。格式:"字段1=? AND 字段2=?"
* @param obj 条件参数值。格式:值1, 值2
* @return 返回查询数据
*/
public List<Map> queryForList(String where, Object... obj) {
String sql = "SELECT * FROM " + table;
sql += " WHERE " + where;
// 查询
return db.query(sql, obj);
}
/**
* 查询
*
* @param where Map 条件
* @return 返回查询结果
*/
public List<Map> queryForList(Map where) {
Object[][] fieldAndValue = getFieldAndValue(where);
Object[] values = fieldAndValue[1];
String whereStr = mapToWhere(where);
return queryForList(whereStr, values);
}
/**
* 添加(增)
*
* @param fields 字段
* @param values 值
* @return 返回增加成功的数量
*/
public int add(Object[] fields, Object[] values) {
// 字段值
String flist = fields[0].toString();
for (int i = 1; i < fields.length; i++) {
flist += "," + fields[i];
}
// 设置 SQL 语句
String sql = "INSERT INTO " + table + "( " + flist + ")" + " VALUE";
// 值的占位符
sql += "(?";
for (int i = 1; i < fields.length; i++) {
sql += ",?";
}
sql += ")";
System.out.println("sql=" + sql);
// 执行功能
return db.update(sql, values);
}
public int add(Map map) {
Object[][] fieldAndValue = getFieldAndValue(map);
return add(fieldAndValue[0], fieldAndValue[1]);
}
/**
* 更新(改)
*
* @param fields 要更新的字段
* @param values 要更新的值
* @param where 更新条件。格式:"字段1=? AND 字段2=?"
* @param obj 条件中的值。格式:值1, 值2
* @return 返回更新数量
*/
public int update(Object[] fields, Object[] values, String where, Object... obj) {
// 设置参数占位符
String sql = "UPDATE " + table + " SET ";
sql += fields[0] + "=?";
for (int i = 1; i < fields.length; i++) {
sql += ", " + fields[i] + "=?";
}
// 条件
sql += " WHERE " + where;
System.out.println("sql=" + sql);
// 参数值
Object[] param = new Object[values.length + obj.length];
for (int i = 0; i < values.length; i++) {
param[i] = values[i];
}
int lastIndexPos = values.length;
for (int i = 0; i < obj.length; i++) {
param[lastIndexPos + i] = obj[i];
}
// 执行更新
return db.update(sql, param);
}
public int update(Object[] fields, Object[] values, String id) {
// 执行更新
return update(fields, values, idField + "=?", id);
}
public int update(Map map, String where, Object... obj) {
Object[][] fieldAndValue = getFieldAndValue(map);
return update(fieldAndValue[0], fieldAndValue[1], where, obj);
}
public int update(Map map, String id) {
Object[][] fieldAndValue = getFieldAndValue(map);
return update(fieldAndValue[0], fieldAndValue[1], id);
}
/**
* 可变长度参数列表转为 字段数组和值数组 对象
*
* @param obj 参数列表
* @return 返回一个数组2个元素的数组,索引0是字段的数组,索引1是对应字段值的数组
*/
public static Object[][] getFieldAndValue(Object[] obj) {
int count = obj.length / 2;
Object[] fields = new Object[count];
Object[] values = new Object[count];
// 字段名
for (int i = 0; i < count; i++) {
fields[i] = obj[i];
}
// 对应的值
for (int i = 0; i < count; i++) {
values[i] = obj[count + i];
}
return new Object[][]{fields, values};
}
/**
* map 转为 字段数组和值数组 对象
*
* @param map map 数据
* @return 返回一个数组2个元素的数组,索引0是字段的数组,索引1是对应字段值的数组
*/
public static Object[][] getFieldAndValue(Map map) {
int count = map.size();
Object[] fields = new Object[count];
Object[] values = new Object[count];
// 字段名
Set sets = map.keySet();
int index = 0;
for (Object key : sets) {
fields[index] = key;
index++;
}
// 值
Collection v = map.values();
index = 0;
for (Object value : v) {
values[index] = value;
index++;
}
Object[][] objects = {
fields, values
};
return objects;
}
/**
* Map 数据转为 Where 条件字符串
*
* @param map Map 数据
* @return 返回一个数组2个元素的数组,索引0是字段的数组,索引1是对应字段值的数组
*/
private String mapToWhere(Map map) {
StringBuilder sb = new StringBuilder();
int i = 0;
for (Object key : map.keySet()) {
if (i > 0) {
sb.append(" AND ");
}
sb.append(key);
sb.append("=?");
i++;
}
return sb.toString();
}
}
//==========================================================================
//============================ 分隔 ================================
//==========================================================================
/**
* 数据库工具类
*
* @author z
*/
class DBUtil {
private String dbname;
private String user;
private String password;
private Connection conn = null;
private ResultSet rst = null;
private PreparedStatement pst = null;
static {
try {
// Class.forName("com.mysql.jdbc.Driver"); // 5.7
Class.forName("com.mysql.cj.jdbc.Driver"); // 8.0
System.out.println("驱动加载成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public DBUtil(String databaseName, String user, String password) {
this.dbname = databaseName;
this.user = user;
this.password = password;
}
private void getConn() {
try {
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/" + dbname + "?useSSL=false&serverTimezone=UTC&characterEncoding=utf8", user, password);
System.out.println("链接建立成功!");
} catch (SQLException e) {
e.printStackTrace();
}
}
//通过map对象代替我们resultset结果集返回
// 查询
public List<Map> query(String sql, Object... obj) {
getConn();
try {
pst = conn.prepareStatement(sql);
System.out.println(sql);
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
pst.setObject(i + 1, obj[i]);
}
rst = pst.executeQuery();
// 获取元数据
ResultSetMetaData metaData = rst.getMetaData();
List<Map> list = new ArrayList<>();
while (rst.next()) {
Map map = new HashMap();
// 获取查询的元数据的总列数
int count = metaData.getColumnCount();
// 列数是从1开始
for (int i = 1; i <= count; i++) {
// 获取当前记录当前索引的列名
String key = metaData.getColumnLabel(i);
// 获取记录的值
Object value = rst.getObject(key);
map.put(key, value);
}
list.add(map);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return null;
}
// 增,删,改
public int update(String sql, Object... obj) {
int num = 0;
getConn();
try {
pst = conn.prepareStatement(sql);
System.out.println(sql);
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
pst.setObject(i + 1, obj[i]);
}
num = pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return num;
}
// 关闭流
public void close() {
try {
if (rst != null) {
rst.close();
}
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}