很久的代碼整理一下分享給大家,記錄給自己
(一)DBC操作數據庫的基本步驟:
1)加載(註冊)數據庫驅動(到JVM)。
2)建立(獲取)數據庫連接。
3)創建(獲取)數據庫操作對象。
4)定義操作的SQL語句。
5)執行數據庫操作。
6)獲取並操作結果集。
7)關閉對象,回收數據庫資源(關閉結果集-->關閉數據庫操作對象-->關閉連接)。
(二)基本屬性值類:該類使用了單例模式來加載數據庫的基本信息,代碼如下,
package com.shuang.commons;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 注意繼承Properties類
* @author shuang
*
*/
public class Env extends Properties {
/**
*
*/
private static final long serialVersionUID = 1L;
private static Env instance;
/**
* 構造方法私有化
*/
private Env(){
try {//以流的形式加載配置文件信息
InputStream in=getClass().getResourceAsStream("/db.properties");
//使用父類的方法將文件流加載到Properties對象
load(in);
//關閉流
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 提供獲取實例的方法
* @return
*/
public static Env getInstance(){
if(null==instance){
return new Env();
}else{
return instance;
}
}
}
db.properties文件內容
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
username=law
password=a
maxActive=30
maxIdle=10
maxWait=100
(三)數據庫操作類
package com.shuang.commons;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
/**
* 連接池實現
* @author shuang
*
*/
public class DBHelper {
private Connection conn=null;
private PreparedStatement pstmt=null;
private ResultSet rs = null;
public Connection getConnection(){
try {
DataSource dataSource=(DataSource)BasicDataSourceFactory.createDataSource(Env.getInstance());
conn=dataSource.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 給佔位符賦值
* @param pstmt :要操作的sql語句
* @param params :要執行的sql語句中對應的佔位符的值 爲null則沒有佔位符
* @throws SQLException
*/
public void setValue(PreparedStatement pstmt, List<Object> params)
throws SQLException {
// 給佔位符賦值
if (params != null && params.size() > 0) {
Object obj = null;
String type = "";
for (int i = 0; i < params.size(); i++) {
obj = params.get(i);
if (obj != null) {
type = obj.getClass().getName();
if ("[B".equals(type)) {
pstmt.setBytes(i + 1, (byte[]) obj);
} else {
pstmt.setString(i + 1, String.valueOf(obj));
}
} else {
pstmt.setString(i + 1, String.valueOf(obj));
}
}
}
}
/**
* 更新操作
*
* @param sql
* 要操作的sql語句
* @param params
* 要執行的sql語句中對應的佔位符的值 爲null則沒有佔位符
* @return
*/
public int update(String sql, List<Object> params) {
int result = 0;
try {
conn = this.getConnection();
pstmt = conn.prepareStatement(sql);
this.setValue(pstmt, params);
result = pstmt.executeUpdate(); // 執行語句
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
/**
* 查詢結果集
*
* @param sql
* 要執行的sql語句
* @param params
* 要執行的sql語句中對應的佔位符的值 爲null則沒有佔位符
* @return
*/
public List<Map<String, Object>> select(String sql, List<Object> params) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = null; // 以列名爲鍵,以對應的值爲鍵
try {
conn = this.getConnection();
pstmt = conn.prepareStatement(sql);
this.setValue(pstmt, params);
rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();// 獲取元數據
// 從元數據中獲取列的信息
String[] colNames = new String[rsmd.getColumnCount()];
for (int i = 0; i < colNames.length; i++) {
colNames[i] = rsmd.getColumnName(i + 1);
}
while (rs.next()) {
map = new HashMap<String, Object>();
Object obj = null;
String type;
if (colNames != null && colNames.length > 0) {
// 循環取出每一個值
for (String s : colNames) {
obj = rs.getObject(s);
if (obj != null) {
type = obj.getClass().getName();
if ("oracle.sql.BLOB".equals(type)) {
Blob blob = rs.getBlob(s);
byte[] bt = null;
InputStream is = blob.getBinaryStream();
if (is != null) {
bt = new byte[(int) blob.length()];
try {
is.read(bt);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
map.put(s, bt);
} else {
map.put(s, null);
}
} else {
map.put(s, String.valueOf(obj));
}
} else {
map.put(s, null);
}
}
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
/**
* 聚合查詢
*
* @param sql
* 要執行的sql語句
* @param params
* 要執行的sql語句中對應的佔位符的值 爲null則沒有佔位符
* @return
*/
public double selectPloymer(String sql, List<Object> params) {
double result = 0;
conn = this.getConnection();
try {
pstmt = conn.prepareStatement(sql);
this.setValue(pstmt, params);
rs = pstmt.executeQuery();
if (rs.next()) {
result = rs.getDouble(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
/**
* 聚合查詢
*
* @param sql
* 要執行的sql語句
* @param params
* 要執行的sql語句中對應的佔位符的值 爲null則沒有佔位符
* @return
*/
public List<Double> selectPloymers(String sql, List<Object> params) {
List<Double> result = new ArrayList<Double>();
;
conn = this.getConnection();
try {
pstmt = conn.prepareStatement(sql);
this.setValue(pstmt, params);
rs = pstmt.executeQuery();
if (rs.next()) {
for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
result.add(rs.getDouble(i + 1));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
/**
* 關閉資源的方法
*/
public void close(){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
//e.printStackTrace();
throw new RuntimeException();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
//e.printStackTrace();
throw new RuntimeException();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
//e.printStackTrace();
throw new RuntimeException();
}
}
}
/**
* DDL操作
*
* @param sql
* 要執行的語句
* @return
*/
public boolean createOp(String sql) {
boolean bl = false;
try {
conn = this.getConnection();
pstmt = conn.prepareStatement(sql);
bl = pstmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}
return bl;
}
// 查詢結果 公共的方法
public <T> List<T> find(String sql, List<Object> params, Class<T> c) {
List<T> list = new ArrayList<T>();
try {
// 獲取數據庫連接對象
conn = this.getConnection();
pstmt = conn.prepareStatement(sql);// 獲取預處理對象
this.setValue(pstmt, params);
rs = pstmt.executeQuery();
// 獲取返回結果集衆所有列的列名
ResultSetMetaData rsmd = rs.getMetaData();// 獲取元數據,包含類的名稱,類型等信息
String columnNames[] = new String[rsmd.getColumnCount()];
for (int i = 0; i < rsmd.getColumnCount(); i++) {// 循環獲取列名存儲到數組中
columnNames[i] = rsmd.getColumnName(i + 1);
}
// 獲取當前給定類中所有公有的方法
Method[] methods = c.getMethods();
// set列名與給定的類中的方法忽略大小寫循環比較,如果能夠匹配上,則激活該方法將當前列的注入到對象對應的屬性中
T t;// 實例化對象
String methodName = null;// 方法名
String colName = null;// 列名
String typeName = null;// 參數類型名
Object val = null; // 當前循環列的值
while (rs.next()) {
t = (T) c.newInstance();// 實例化一個類的對象
for (int i = 0; i < columnNames.length; i++) {
// 獲取當前循環的列名
colName = columnNames[i];
// 根據列名獲取當前列的值
val = rs.getObject(colName);
for (Method m : methods) {// 循環方法與方法名進行比較
methodName = m.getName();
if (("set" + colName).equalsIgnoreCase(methodName)
&& null != val) {
// 獲取返回值的類型
typeName = val.getClass().getName();
if ("java.math.BigDecimal".equals(typeName)) {
m.invoke(t, rs.getInt(colName)); // 激活方法並設置
} else if ("java.lang.String".equals(typeName)) {
m.invoke(t, rs.getString(colName)); // 激活方法並設置
// 後續自己完成
} else if("java.lang.Boolean".equals(typeName)) {
m.invoke(t, rs.getBoolean(colName));
}else if("java.lang.Byte".equals(typeName)){
m.invoke(t, rs.getByte(colName));
}else if("java.lang.Short".equals(typeName)){
m.invoke(t, rs.getShort(colName));
}else if("java.lang.Integer".equals(typeName)){
m.invoke(t, rs.getInt(colName));
}else if("java.lang.Long".equals(typeName)){
m.invoke(t, rs.getLong(colName));
}else if("java.lang.Float".equals(typeName)){
m.invoke(t, rs.getFloat(colName));
}else if("java.lang.Double".equals(typeName)){
m.invoke(t, rs.getDouble(colName));
}else if("[B".equals(typeName)){
m.invoke(t, rs.getBytes(colName));
}else if("java.sql.Time".equals(typeName)){
m.invoke(t, rs.getTime(colName));
}else if("java.sql.Timestamp".equals(typeName)){
m.invoke(t, rs.getTimestamp(colName));
}else if("oracle.sql.CLOB".equals(typeName)){
m.invoke(t,rs.getString(colName));
}else{
m.invoke(t, rs.getString(colName));
}
}
}
}
list.add(t);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
/**
* 多表查詢
* @param sql:查詢語句
* @param params: 查詢語句中?所對應的值
* @return:結果集,存在一個List表中,用Map一對一的存放
* @throws SQLException
*/
public List<String> findList(String sql,List<Object> params){
List<String> result=new ArrayList<String>(); //將結果一次存在list中返回
conn=this.getConnection();
try {
pstmt=conn.prepareStatement(sql);
this.setValue(pstmt, params);
rs=pstmt.executeQuery();
ResultSetMetaData md=rs.getMetaData(); //獲取結果集的元數據
String[] colnames=new String[md.getColumnCount()]; //獲取結果集中的列名
for(int i=0;i<colnames.length;i++){
colnames[i]=md.getColumnName(i+1);
}
while(rs.next()){
for(int i=0;i<colnames.length;i++){
result.add(rs.getString(i+1));
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}finally{
this.close();
}
return result;
}
}