1.DB_Utils工具类
package com.sj.utils;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mysql.cj.jdbc.result.ResultSetMetaData;
import com.sj.pojo.User;
public class DB_Utils {
private static String driver;
private static String url;
private static String user;
private static String password;
static {
InputStream in = DB_Utils.class.getResourceAsStream("/db.properties");
Properties pro = new Properties();
try {
pro.load(in);
driver = pro.getProperty("mysql.driver");
url = pro.getProperty("mysql.url");
user = pro.getProperty("mysql.username");
password = pro.getProperty("mysql.password");
Class.forName(driver);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getCon() throws SQLException, ClassNotFoundException {
Connection con = DriverManager.getConnection(url, user, password);
return con;
}
public static void close(Connection con, Statement pstmt, ResultSet rs) {
try {
if (rs != null) {
rs.close();
rs = null;
System.out.println("rs");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (pstmt != null) {
pstmt.close();
pstmt = null;
System.out.println("ps");
}
} catch (Exception e2) {
e2.printStackTrace();
}
finally {
try {
if (con != null) {
System.out.println("con");
con.close();
con = null;
}
} catch (Exception e3) {
e3.printStackTrace();
}
}
}
}
/** 预处理赋值
* @param sql
* @param params 预处理?对应的值,必须按顺序存放在params
* @param con
* @return PreparedStatement
* @throws SQLException
* @throws ClassNotFoundException
*/
public static PreparedStatement prepareSql(String sql,Object[] params, Connection con) throws SQLException, ClassNotFoundException {
PreparedStatement pstmt = con.prepareStatement(sql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}
return pstmt;
}
/** 单条记录的插入、删除、更新
* @param sql
* @param params
* @param con
* @return
* @throws SQLException
* @throws Exception
*/
public static int updateSql(String sql, Object[] params, Connection con) throws SQLException ,Exception {
int i = -1;
PreparedStatement pstmt=null;
try {
pstmt = prepareSql(sql, params,con);
i = pstmt.executeUpdate();
} catch (SQLException e) {
throw e;
} catch (Exception e) {
throw e;
}finally {
close(null, pstmt, null);
}
return i;
}
/**
* 根据结果集获取查询结果的别名/id usrname
*
* @param rs
* @return
* @throws SQLException
*/
private static String[] getColNames(ResultSet rs) throws SQLException {
ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();// 整表属性结果集
// 获取查询的列数
int count = rsmd.getColumnCount();
String[] colNames = new String[count];
for (int i = 1; i <= count; i++) {
// 获取查询类的别名
colNames[i - 1] = rsmd.getColumnLabel(i);
}
return colNames;
}
/**
* 利用Java反射技术将查询结果封装为对象
* 必须保证数据库表字段全部是小写,或者首字母大写, id Id
* @param sql
* @param params
* @param clazz
* @param con
* @return
* @return
* @throws SQLException
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static <T> T queryObjectSql(String sql, Object[] params, Class<T> clazz, Connection con)
throws SQLException,Exception {
PreparedStatement pstmt=null;
Object object = null;
ResultSet rs=null;
try {
pstmt = prepareSql(sql, params,con);
rs = pstmt.executeQuery();
String[] colNames = getColNames(rs);
while (rs.next()) {
object = clazz.newInstance();
for (int i = 0; i < colNames.length; i++) {
String colName = colNames[i];// 首字母转换成大写 数据库列名与set不同 id setId
String methodName = "set" + Character.toUpperCase(colName.charAt(0)) + colName.substring(1);
// 直接根据方法名获取对应的Method对象
Object value = rs.getObject(colName);
Method m = clazz.getMethod(methodName, value.getClass());
if (m != null) {
m.invoke(object, value);
}
}
}
} catch (SQLException e) {
throw e;
} catch (Exception e) {
throw e;
}
finally {
close(null, pstmt, rs);
}
return (T)object;
}
/**利用Java反射技术将查询结果封装为集合
* @param sql
* @param params
* @param clazz
* @param con
* @return
* @throws SQLException
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static <T> List<T> queryListSql(String sql, Object[] params, Class<T> clazz,Connection con
) throws SQLException, Exception {
PreparedStatement pstmt=null;
Object object = null;
List<T> list=null;
ResultSet rs=null;
try {
pstmt = prepareSql(sql, params,con);
rs = pstmt.executeQuery();
String[] colNames = getColNames(rs);
list = new ArrayList<T>();
while (rs.next()) {
object = clazz.newInstance();
for (int i = 0; i < colNames.length; i++) {
String colName = colNames[i];// 首字母转换成大写 数据库列名与set不同 id setId
String methodName = "set" + Character.toUpperCase(colName.charAt(0)) + colName.substring(1);
// 直接根据方法名获取对应的Method对象
Object value = rs.getObject(colName);
Method m = clazz.getMethod(methodName, value.getClass());
if (m != null) {
m.invoke(object, value);
}
}
list.add((T) object);
}
} catch (SQLException e) {
throw e;
} catch (Exception e) {
throw e;
}
finally {
close(null, pstmt, rs);
}
return list;
}
}
2.测试类
package com.sj.test;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.junit.Test;
import org.w3c.dom.UserDataHandler;
import com.mysql.cj.protocol.Resultset.Concurrency;
import com.sj.pojo.User;
import com.sj.utils.DB_Utils;
public class DBTest {
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
@Test
public void deleteById() throws Exception {
String sql = "delete from user where id=?";
Object[] params = { 2 };
con = DB_Utils.getCon();
int i = DB_Utils.updateSql(sql, params, con);
System.out.println(i);
}
@Test
public void getObject() {
String sql = "select * from user where id=?";
Object[] params = { 9 };
try {
con = DB_Utils.getCon();
User u = DB_Utils.queryObjectSql(sql, params, User.class, con);
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
} finally {
DB_Utils.close(con, pstmt, rs);
System.out.println(con);
}
}
@Test
public void getListObject() {
String sql = "select * from user";
Object[] params = null;
try {
con = DB_Utils.getCon();
List<User> u = DB_Utils.queryListSql(sql, params, User.class, con);
for (User user : u) {
System.out.println(user);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
DB_Utils.close(con, pstmt, rs);
}
}
@Test
public void saveObject() throws Exception {
String sql = "insert into user (name,money) values(?,?)";
con = DB_Utils.getCon();
pstmt = con.prepareStatement(sql);
for (int i = 0; i < 1; i++) {
User u = new User("sj" + i, Double.valueOf(i));
Object[] params = { u.getName(), u.getMoney() };
int t = DB_Utils.updateSql(sql, params, con);
System.out.println("success" + (i + 1));
}
}
}