1.新建一个工程,写一个工具类,该类至少有1个无参构造,2个有参构造,参数分别是:连接对象或连接池对象。
2.该类中至少要有实现单表:增删改的update方法,和实现各种查询的query,queryForObject,queryForMap,queryForList方法
package com;
import javax.sql.DataSource;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.*;
public final class JDBCUtil {
private DataSource ds;
private Connection con;
public JDBCUtil(Connection con) {
this.con = con;
}
public JDBCUtil(DataSource ds) {
this.ds = ds;
try {
this.con = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
public DataSource getDs() {
return ds;
}
public void setDs(DataSource ds) {
this.ds = ds;
}
public Connection getCon() {
return con;
}
public void setCon(Connection con) {
this.con = con;
}
private JDBCUtil(){};
//增删改
public int update(String sql,Object ...args){
try {
PreparedStatement pstm = con.prepareStatement(sql);
for (int i = 0; i <args.length ; i++) {
pstm.setObject(i+1,args[i]);
}
int i = pstm.executeUpdate();
return i;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
//query
public <T>List<T> MyQuery(String sql,Class<T> c, Object ...args){
try {
PreparedStatement prep = con.prepareStatement(sql);
for (int i = 0; i <args.length ; i++) {
prep.setObject(i+1,args[i]);
}
ResultSet rs = prep.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
ArrayList<T> list = new ArrayList<>();
while (rs.next()){
T t = c.newInstance();
for (int i = 1; i <columnCount ; i++) {
Object value = rs.getObject(i);
String columnName = md.getColumnName(i);
Field f = c.getDeclaredField(columnName);
System.out.println(f);
f.setAccessible(true);
f.set(t,value);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//queryForMap
public Map<String,Object> MyQueryForMap(String sql, Object ...args){
try {
PreparedStatement prep = con.prepareStatement(sql);
for (int i = 0; i <args.length ; i++) {
prep.setObject(i+1,args[i]);
}
ResultSet rs = prep.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
HashMap map = new HashMap();
if (rs.next()){
for (int i = 1; i <columnCount ; i++) {
Object value = rs.getObject(i);
String columnName = md.getColumnName(i);
map.put(columnName,value);
}
}
return map;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//queryForList
public List<Map> MyQueryForList(String sql, Object ...args){
try {
PreparedStatement prep = con.prepareStatement(sql);
for (int i = 0; i <args.length ; i++) {
prep.setObject(i+1,args[i]);
}
ResultSet rs = prep.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
ArrayList<Map> maps = new ArrayList<>();
while (rs.next()){
HashMap map = new HashMap();
for (int i = 1; i <columnCount ; i++) {
Object value = rs.getObject(i);
String columnName = md.getColumnName(i);
map.put(columnName,value);
}
maps.add(map);
}
return maps;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//queryForObject
public <T> T MyQueryForObject(String sql,Class<T> c, Object ...args){
try {
PreparedStatement prep = con.prepareStatement(sql);
for (int i = 0; i <args.length ; i++) {
prep.setObject(i+1,args[i]);
}
ResultSet rs = prep.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
T t =null;
if(rs.next()){
//情况一:聚合函数
if ((sql.toLowerCase().contains("count")||sql.toLowerCase().contains("sum")||
sql.toLowerCase().contains("max") ||sql.toLowerCase().contains("min")
||sql.toLowerCase().contains("avg"))&&columnCount==1){
return (T) rs.getObject(1);
}
//情况2:查单行数据
t=c.newInstance();
for (int i = 0; i <=columnCount ; i++) {
Object value = rs.getObject(i);
String columnName = md.getColumnName(i);
Field field = c.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t,value);
}
}
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}