本文是JDBC的簡單封裝,吸收了一些思想經行的封裝,封裝的很通用,每種數據庫都可用,如果有什麼錯誤請指教,,謝謝:
1.配置文件
<?xml version="1.0" encoding="UTF-8"?> <db> <driver>oracle.jdbc.driver.OracleDriver</driver> <url>jdbc:oracle:thin:@192.168.3.27:1521:orcl</url> <login_name>scott</login_name> <login_password>tiger</login_password> </db>
本來想再寫個藉口屏蔽 實現。。。懶得寫了
2.DBUtil類 獲取連接
/**
* Copyright (C), 1995-2010, ChengDu Lovo info. Co., Ltd.
* FileName: DBUtil .java
* <p> DBUtil 實現</p>
*
* @author Tjee
* @Date 2010-5-12
* @version 1.00 9999/99/99 類創建者姓名
* @see 參考類1
* @see 參考類2
*/
public class DBUtil implements IConnection{
/**
* 字段
**/
// 單例模式只允許 產生一個對象
private static DBUtil instanse=null;
private String driver;
private String url;
private String login_name;
private String login_password;
private Connection con;
/**
* 構造方法
* */
private DBUtil(){
//讀取配置
this.readConfig();
}
/**
* 方法
* */
//用static 一開始就被加載
public static DBUtil getInstanse(){
if(instanse==null){ // 排除不是第一次產生的對象
synchronized(DBUtil.class){// synchronized同步 讓都是第一次產生對象多線程 在此排隊
if(instanse==null){ // 那個線程先進來 就只讓他產生對象
instanse=new DBUtil();
}
}
}
return instanse;
}
/**
* 獲取 dbxml 配置文件的 路徑
* */
private InputStream getPath(){
InputStream is=this.getClass().getResourceAsStream("/com/lovo/config/db.xml");
return is;
}
private void readConfig(){
//讀取文件中的數據
SAXReader saxreader= new SAXReader();
try {
Document doc = saxreader.read(this.getPath());//讀取 xml 文件中的數據 放到 doc裏面
List<Element> list =doc.selectNodes("/db/driver");
this.driver=list.get(0).getTextTrim();
List<Element> list1 =doc.selectNodes("/db/url");
this.url=list1.get(0).getTextTrim();
List<Element> list2 =doc.selectNodes("/db/login_name");
this.login_name=list2.get(0).getTextTrim();
List<Element> list3 =doc.selectNodes("/db/login_password");
this.login_password=list3.get(0).getTextTrim();
System.out.println("driver:"+this.driver);
System.out.println("url:"+this.url);
System.out.println("login_name:"+this.login_name);
System.out.println("login_password:"+this.login_password);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲得連接 並返回 Connection
* @throws ClassNotFoundException
* @throws SQLException
*/
public Connection getConnection() throws Exception{
Class.forName(driver);
con=DriverManager.getConnection(url,login_name,login_password);
return con;
}
/**
* 關閉 連接 和回滾事務
* 由於要關閉的連接是實際情況中具體的 所以需要傳參數
* @throws SQLException
* @throws SQLException */
public void closeConnectionRollback(Connection con,PreparedStatement pre,ResultSet rs)throws Exception {
/**如果rs不爲空關閉連接*/
if(rs!=null)rs.close();
/**如果pre不爲空關閉連接*/
if(pre!=null)pre.close();
/**如果con不爲空關閉連接 回滾*/
if(con!=null){
if(!con.getAutoCommit()){
con.rollback();
}
con.close();
}
}
/**
* 關閉 連接 和提交事務
* 由於要關閉的連接是實際情況中具體的 所以需要傳參數
* @throws SQLException
* @throws SQLException */
public void closeConnectionCommit(Connection con,PreparedStatement pre,ResultSet rs)throws Exception {
/**如果rs不爲空關閉連接*/
if(rs!=null)rs.close();
/**如果pre不爲空關閉連接*/
if(pre!=null)pre.close();
/**如果con不爲空關閉連接 提交事務*/
if(con!=null){
if(!con.getAutoCommit()){
con.commit();
}
con.close();
}
}
}
3.DataAccessObject 用的類繼承他 就可以了 通用增、刪、改、查。
/**
* Copyright (C), 1995-2010, ChengDu Lovo info. Co., Ltd.
* FileName: DataAccessObject.java
* <p> DataAccessObject實現</p>
*
* @author Tjee
* @Date 2010-5-12
* @version 1.00 9999/99/99 類創建者姓名
* @see 參考類1
* @see 參考類2
*/
public class DataAccessObject {
protected Connection con=null;
protected PreparedStatement pre=null;
protected ResultSet rs=null;
private IConnection connect;
/**獲得連接
* @throws Exception */
protected void getConnection() throws Exception{
con= DBUtil.getInstanse().getConnection();
}
/**關閉連接和回滾*/
public void closeConnectionRollback(Connection con,PreparedStatement pre,ResultSet rs)throws Exception{
DBUtil.getInstanse().closeConnectionRollback(con, pre, rs);
}
/**關閉連接和提交*/
public void closeConnectionCommit(Connection con,PreparedStatement pre,ResultSet rs)throws Exception{
DBUtil.getInstanse().closeConnectionRollback(con, pre, rs);
}
/**
* 開始事務,設置爲手動提交
*/
public void beginTransation()throws Exception {
this.con.setAutoCommit(false);
}
/**
* 跟新數據庫
* 封裝非查詢語句(insert,delete,update-返回影響的行數;DDL:create,drop,truncate-返回0)
* @param sql sql語句
* @param args 問號的值
* @return
* @return int 影響幾行
* @throws Exception
*/
public int executeSQL(String sql,Object[] args )throws Exception{
int row = 0;
/**獲得數據庫連接*/
try {
con=DBUtil.getInstanse().getConnection();
pre=con.prepareStatement(sql);
/**判斷是否爲空在進行對問號賦值*/
if(args!=null && args.length>0){
for(int i=0;i<args.length;i++){
pre.setObject(i+1, args[i]);
}
}
row = pre.executeUpdate();
} catch (Exception e) {
/**通知事務中其它sql要回滾*/
throw e;
}
return row;
}
/**查詢 所有字段
* @param sql
* @param args
* @param cls
* @return
* @throws Exception
* @return List
*/
public List queryForList(String sql,Object[] args,Class cls) throws Exception{
List list = new ArrayList();
try{
System.out.println(sql);
pre = con.prepareStatement(sql);
if(args!=null && args.length>0){
for(int i=0;i<args.length;i++){
pre.setObject(i+1, args[i]);
}
}
/**得到結果集*/
rs = pre.executeQuery();
/**獲取類模板的所有字段*/
Field[] fields = cls.getDeclaredFields();
while(rs.next()){
Object obj = cls.newInstance();
//通過反射對各個屬性進行賦值
for(int i=0;i<fields.length;i++){
Field field = fields[i];
//直接訪問private屬性
field.setAccessible(true);
Class type = field.getType();
/**用oracle才使用 判斷*/
if(type==Double.class||type==double.class){
String str = rs.getString(i+1);
if(str!=null){
Double value = Double.parseDouble(str);
field.set(obj, value);//obj.name='mike'
}
}else if(type==Integer.class||type==int.class){
String str = rs.getString(i+1);
if(str!=null){
Integer value = Integer.parseInt(str);
field.set(obj, value);
}
}else if(type==Float.class||type==float.class){
String str = rs.getString(i+1);
if(str!=null){
Integer value = Integer.parseInt(str);
field.set(obj, value);
}
}else if(type==java.sql.Timestamp.class){
String str = rs.getString(i+1);
if(str!=null){
java.sql.Timestamp rq = strToDateTime(str);
field.set(obj, rq);
}
}
else{
field.set(obj, rs.getObject(i+1));
}
}
list.add(obj);
}
}catch(Exception e){
throw e;
}
return list;
}
/**
* 查詢 包括單個字段,和多個字段的查詢
* 注意(如果與數據庫字段不一致 請用 別名 代替 使之與javabean保持一致)
* @param sql 語句
* @param args 問號的值
* @param cls bean模板
* @throws Exception
* @return List 返回這個bean結合
*/
public List querySQL(String sql,Object[] args,Class cls) throws Exception{
List list = new ArrayList();
pre = con.prepareStatement(sql);
/**設置問號*/
if(args!=null && args.length>0){
for(int i=0;i<args.length;i++){
pre.setObject(i+1, args[i]);
}
}
/**獲取類模板的所有字段*/
Field[] fields = cls.getDeclaredFields();
/**得到結果集*/
rs = pre.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
while(rs.next()){
/** 得到cls實例*/
Object obj=cls.newInstance();
for(int i=1;i<=rs.getMetaData().getColumnCount();i++) {
/**判斷結果集是否存在Javabean 裏面的字段 匹配 別名或者是字段名*/
for(int j=0;j<fields.length;j++ ){
if( rsmd.getColumnLabel(i).equalsIgnoreCase(fields[j].getName()) ||
rsmd.getColumnName(i).equalsIgnoreCase(fields[j].getName())){
fields[j].setAccessible(true);
Class type = fields[j].getType();
if(type==Double.class||type==double.class){
String str = rs.getString(j+1);
/**判斷取出來的值是否爲空 在處理*/
if(str!=null){
Double value = Double.parseDouble(str);
fields[j].set(obj, value);
}
}else if(type==Integer.class||type==int.class){
String str = rs.getString(j+1);
if(str!=null){
Integer value = Integer.parseInt(str);
fields[j].set(obj, value);
}
}else if(type==Float.class||type==float.class){
String str = rs.getString(j+1);
if(str!=null){
Integer value = Integer.parseInt(str);
fields[j].set(obj, value);
}
}else{
fields[j].set(obj, rs.getObject(j+1));
}
}
}
}
list.add(obj);
}
return list;
}
/**
* 從網頁上或外部輸入時(一般不會輸入時分秒),需要將日期轉化爲數據庫的日期類型
*/
public final static java.sql.Timestamp strToDateTime(String dateStr)
throws Exception{
int len = dateStr.length();
String format = "yyyy-MM-dd HH:mm:ss.SSS".substring(0, len);
DateFormat df = new SimpleDateFormat(format);
java.util.Date timeDate = df.parse(dateStr);
System.out.println("dasdasdadasdass"+timeDate);
java.sql.Timestamp dateTime = new java.sql.Timestamp(timeDate.getTime());// sql類型
System.out.println("dasdasdadasdass"+dateTime);
return dateTime;
}
}