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

猜你喜欢

转载自blog.csdn.net/fredrik/article/details/74931198