BaseDao加強版,可連接sqlserver和mysql,使用時直接在main類調用即可,需在src目錄下創建一個properties後綴的文件夾,用來存放數據庫名稱和地址,具體如下

package com.hkd.basedao;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;




public class BaseDao{
String DBUser;
String DBPwd;
String DBHost;//服務器地址
String DBName;
int Port;
int Port2;
int DBType;//1 mysql 2 sqlserver 3 oracle;
Connection conn;
PreparedStatement ps;
public ResultSet rs;
public BaseDao(){
Properties pro=new Properties();
InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
try {
pro.load(is);
DBUser=pro.getProperty("DBUser");
DBPwd=pro.getProperty("DBPwd");
DBHost=pro.getProperty("DBHost");
DBName=pro.getProperty("DBName");
Port=Integer.parseInt(pro.getProperty("Port"));
DBType=Integer.parseInt(pro.getProperty("DBType"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void open(){
try {
if(DBType==1){
Class.forName("com.mysql.jdbc.Driver");
// jdbc:mysql://localhost:3306/數據庫名
conn=DriverManager.getConnection("jdbc:mysql://"+DBHost+":"+Port+"/"+DBName, DBUser, DBPwd);
}else if(DBType==2){
Class.forName("com.microsoft.sqlserver.sqlserverDriver");
//jdbc:sqlserver://localhost:1433;databasename=myschool
conn=DriverManager.getConnection("jdbc:sqlserver://"+DBHost+":"+Port2+";databasename="+DBName, DBUser, DBPwd);
}else{

}
} catch (Exception e){
e.printStackTrace();
}
}
public void close(){
//後出現的先關閉
try {
if(rs!=null){
rs.close();
}
ps.close();
conn.close();
} catch (Exception e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 執行增刪改
* @param sql 所執行的sql語句
* @param params sql語句中的參數
* @return 受影響的行數
*/
public int add(Object o){
int a=0;
Class clz=o.getClass();//獲取對象的類
String className=clz.getName();//獲取完整名稱,包括包名
//例如com.hkd.Student
int p=className.lastIndexOf(".");//尋找最後一個點
className=className.substring(p+1);//從點後面開始截取字符串,截取到完整的類名
//insert into 表(列,列,列)values(值,值,值,值)
StringBuffer sb=new StringBuffer();
sb.append("insert into "+className+"(");
Field fs[]=clz.getDeclaredFields();//獲取所有列
for (int i = 0; i < fs.length; i++) {
if(i==fs.length-1){
sb.append(fs[i].getName());//最後一個不需要加逗號
}else{
sb.append(fs[i].getName()+",");//其他加逗號
}
}
sb.append(") values (");//開始values後面拼接
for (int i = 0; i < fs.length; i++) {
if(i==fs.length-1){
sb.append("?");//最後一個不需要加
}else{
sb.append("?,");//1其他加逗號
}
}
sb.append(")");//sql完畢
Object parm[]=new Object[fs.length];//參數個數根據屬性個數確定
try{
for (int i = 0; i < fs.length; i++) {
fs[i].setAccessible(true);//強制訪問屬性
parm[i]=fs[i].get(o);//根據屬性獲取對象的屬性值
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
a=executeUpdate2(sb.toString(), parm);//執行
System.out.println(sb);
return a;
}
    public int delete(Object o){
    int a=0;
Class clz=o.getClass();//獲取對象的類
String className=clz.getName();//獲取完整名稱,包括包名
//例如com.hkd.Student
int p=className.lastIndexOf(".");//尋找最後一個點
className=className.substring(p+1);//從點後面開始截取字符串,截取到完整的類名
//delete from 表 where id =?
StringBuffer sb=new StringBuffer();
sb.append("delete from "+className+" where ");
Field fs[]=clz.getDeclaredFields();//獲取屬性
sb.append(fs[0].getName()+" = ?");//拼接sql where 後面的主鍵列名
Object parm[]=new Object[1];//只有一個參數,主鍵的個數(就是爲了訪問主鍵)
try {
fs[0].setAccessible(true);//強制訪問
parm[0]=fs[0].get(o);//只獲取一個屬性,(主鍵)
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a=executeUpdate2(sb.toString(), parm);
System.out.println(sb);
return a;
   
    }
    public int update(Object o){
    int a=0;
    Class clz =o.getClass();//獲取對象的類
String className=clz.getName();//獲取完整名稱,包括包名
//例如com.hkd.Student
int p=className.lastIndexOf(".");//尋找最後一個點
className=className.substring(p+1);//從點後面開始截取字符串,截取到完整的類名
//delete from 表 where id =?
StringBuffer sb=new StringBuffer();
sb.append("update "+className +" set ");
Field fs[]=clz.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
if(i==fs.length-1)//最後一個
sb.append(fs[i].getName()+"= ? ");
else
sb.append(fs[i].getName()+"= ? ,");
}
sb.append("where "+fs[0].getName()+" = ?");//默認主鍵是第一個
    Object parm[]=new Object[fs.length+1];//參數數組
    try{
    for (int i = 0; i < fs.length; i++) {
fs[i].setAccessible(true);//強制訪問
parm[i]=fs[i].get(o);//複製
}
    parm[fs.length]=fs[0].get(o);//主鍵
    }catch (Exception e) {
// TODO: handle exception
    e.printStackTrace();
}
    a=executeUpdate2(sb.toString(), parm);
System.out.println(sb);
    return a;
    }
    public List select(Class clz,String where,Object parm[]){
    List list =new ArrayList();
    String className=clz.getName();
    int p=className.lastIndexOf(".");//尋找最後一個點
className=className.substring(p+1);//從點後面開始截取字符串,截取到完整的類名
//insert into 表(列,列,列)values(值,值,值,值)
StringBuffer sb=new StringBuffer();
sb.append("select * from "+className+" where "+where);
rs=executeQuery(sb.toString(), parm);
Field fs[]=clz.getDeclaredFields();
try{
while(rs.next()){
Object o=clz.newInstance();//創建對象
for (Field f : fs) {
f.setAccessible(true);
Object v =rs.getObject(f.getName());
f.set(o, v);
}
list.add(o);
}
close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
    return list;
    }
    public int executeUpdate(String sql,Object []params){
open();
int a=0;
try{
ps=conn.prepareStatement(sql);
if(params!=null){
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1,params[i]);
}
}
a=ps.executeUpdate();
} catch (Exception e){
e.printStackTrace();
}
close();
return a;
}

public int executeUpdate2(String sql,Object... params){ //...表示 可變參數
open();
int a=0;
try{
ps=conn.prepareStatement(sql);
if(params!=null){
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1,params[i]);
}
}
a=ps.executeUpdate();
} catch (Exception e){
e.printStackTrace();
}
close();
return a;
}
/**
* 執行查詢,返回結果集
* @param sql
* @param params
* @return 返回結果集
*/
public ResultSet executeQuery(String sql,Object []params){
open();
try{
ps=conn.prepareStatement(sql);
if(params!=null){
for (int i = 0; i < params.length; i++){
ps.setObject(i+1,params[i]);
}
}
rs=ps.executeQuery();
}catch (Exception e){
e.printStackTrace();
}
return rs;
}

}

database.properties如下所示:

#database property
DBUser=root
DBPwd=root
DBHost=localhost
DBName=school
Port=3306
Port2=1433
DBType=1

發佈了54 篇原創文章 · 獲贊 68 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章