關于用操作數據庫模板方法如下代碼:
[java]
jdbc.properties
url=jdbc:mysql://localhost:3306/cfms
user=root
password=123456
driverClass=com.mysql.jdbc.Driver
package cn.edu.hactcm.base.utils;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
[java] view plaincopyprint?
* CFMS :Computer files management system
* version :1.0 2013-2-19 上午08:44:27
*
* 操作JDBC的工具類
*/
public class JdbcUtils {
private JdbcUtils() {
}
private static String url;
private static String user;
private static String password;
/*
* 靜態代碼塊
*/
static {
try {
// 讀取配置文件,通過類加載器的方式讀取屬性文件
InputStream in = JdbcUtils.class.getClassLoader()
.getResourceAsStream("jdbc.properties");
Properties prop = new Properties();
prop.load(in);
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
// 注冊驅動
String driverClass = prop.getProperty("driverClass");
Class.forName(driverClass);
in.close();
in = null;
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* @return 獲取與指定數據庫的連接
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
// url,user,password可以直接使用是因為上面定義成靜態的了。
Connection connection = DriverManager
.getConnection(url, user, password);
return connection;
}
/**
* @param rs :結果集
* @param stmt:在程序中將使用PrepareStatement,其中Statement是其父類
* @param conn:數據庫連接
*/
public static void release(ResultSet rs, Statement stmt, Connection conn) {
// 判斷結果集是否為空,如果不為空,關閉清空
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
// 判斷聲明是否為空,如果不為空,關閉清空
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
// 判斷連接是否為空,如果不為空,關閉清空
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
package cn.edu.hactcm.base.dao;
import java.sql.ResultSet;
/**
* CFMS :Computer files management system
* version :1.0 2013-2-19 上午10:02:31
*/
public interface ResultSetHandler {
//處理結果集的方法
public Object handle(ResultSet rs);
}
/**
*
*/
package cn.edu.hactcm.base.dao.impl;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import cn.edu.hactcm.base.dao.ResultSetHandler;
/**
* CFMS :Computer files management system
* version :1.0 2013-2-19 上午10:38:37
*
* 取出第一行的所有記錄存入一個Object數組
*/
@SuppressWarnings( { "unchecked", "unused" })
public class ArrayHandler implements ResultSetHandler {
private Class clazz;
public ArrayHandler(Class clazz) {
this.clazz = clazz;
}
public Object handle(ResultSet rs) {
try {
if (rs.next()) {
// 指向了第一行的記錄
// 獲得元數據
ResultSetMetaData metaData = rs.getMetaData();
// 獲得用于查詢的sql中的字段列數
int count = metaData.getColumnCount();
// 創建數組
Object[] arr = new Object[count];
// 迭代所有列的值,存入數組
for (int i = 1; i <= count; i++) {
Object value = rs.getObject(i); // 獲得指定列的值
arr[i - 1] = value;
}
return arr;
}
return null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
/**
*
*/
package cn.edu.hactcm.base.dao.impl;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import cn.edu.hactcm.base.dao.ResultSetHandler;
/**
* CFMS :Computer files management system
* version :1.0 2013-2-19 上午10:38:37
*
* 此助手類用于取得結果集中的第一條記錄
*/
@SuppressWarnings("unchecked")
public class BeanHandler implements ResultSetHandler {
private Class clazz;
public BeanHandler(Class clazz) {
this.clazz = clazz;
}
public Object handle(ResultSet rs) {
// 不知道有幾列數據,不知道列名,不知道封裝到什么樣的bean
// 表的列明和javabean的字段名一致
try {
if(rs.next()) {
// 創建bean
Object bean = clazz.newInstance();
// 封裝數據
// 獲得結果集的元數據
ResultSetMetaData metaData = rs.getMetaData();
int count = metaData.getColumnCount();
// 迭代取每一列的數據
for(int i=1; i<=count; i++) {
// 獲得列名 username
String columnName = metaData.getColumnName(i);
// 獲得數據 ddd
Object value = rs.getObject(columnName);
// 根據列名反射出映射的屬性 username
Field field = clazz.getDeclaredField(columnName);
// 為屬性賦值
field.setAccessible(true);
field.set(bean, value);
}
return bean;
}
return null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package cn.edu.hactcm.base.dao.impl;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import cn.edu.hactcm.base.dao.ResultSetHandler;
/**
* CFMS :Computer files management system
* version :1.0 2013-2-19 上午10:07:19
*
* 此助手類用于取得結果集中的記錄的list列表集合,集合中的每個元素是數據庫中的一條記錄 www.wx-jr.com
*/
@SuppressWarnings("unchecked")
public class BeanListHandler implements ResultSetHandler {
private Class clazz;
public BeanListHandler(Class clazz) {
this.clazz = clazz;
}
public Object handle(ResultSet rs) {
try {
// 取出結果集所有的記錄,封裝到bean,存入list返回
List list = new ArrayList();
while (rs.next()) {
Object bean = clazz.newInstance();
// 獲得元數據
ResultSetMetaData metaData = rs.getMetaData();
// 獲得列的數量
int count = metaData.getColumnCount();
// 遍歷列
for (int i = 1; i <= count; i++) {
// 取列名
String columnName = metaData.getColumnName(i);
// 取這列的值
Object value = rs.getObject(columnName);
// 反射出屬性
Field field = clazz.getDeclaredField(columnName);
// 設置屬性
field.setAccessible(true);
field.set(bean, value);
}
// 加入list
list.add(bean);
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package cn.edu.hactcm.base.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.edu.hactcm.base.dao.ResultSetHandler;
import cn.edu.hactcm.base.utils.JdbcUtils;
public class GenericDaoImpl {
/**
* 用于處理公共的insert,update,delete操縱雅思答案
* @param sql :這里是傳入的sql語句
* @param params :這里是參數數組
* @return
* @throws SQLException
*/
public static int update(String sql, Object[] params) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
//預編譯sql
pstmt = conn.prepareStatement(sql);
//將參數設置進去
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i+1, params[i]);
}
//發送sql
int num = pstmt.executeUpdate();
return num;
} finally {
JdbcUtils.release(rs, pstmt, conn);
}
}
/**
* 用于處理公共"查詢所有"的操作
* @param sql :查詢參數
* @param params :出入的id值
* @param rsh :表示要實現那個結果封裝類
* @return
* @throws SQLException
*/
public static Object query(String sql,Object[] params,ResultSetHandler rsh) throws SQLException{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//獲得連接
conn = JdbcUtils.getConnection();
//預編譯sql
pstmt = conn.prepareStatement(sql);
//將參數設置進去
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setObject(i+1, params[i]);
}
//發送sql
rs = pstmt.executeQuery();
//不知道別人想如何處理結果集
//干脆想別人所要一個結果集的處理器
//為了讓當前代碼繼續,定義一個結果集處理器接口
//策略模式,規定算法,具體的算法留給將來的調用者實現 www.dakaoedu.com
Object obj = rsh.handle(rs);
return obj;
} finally {
//釋放資源
JdbcUtils.release(rs, pstmt, conn);
}
}
}