JAVA连接数据库增强DAO.docx
《JAVA连接数据库增强DAO.docx》由会员分享,可在线阅读,更多相关《JAVA连接数据库增强DAO.docx(28页珍藏版)》请在冰豆网上搜索。
![JAVA连接数据库增强DAO.docx](https://file1.bdocx.com/fileroot1/2023-2/21/7137fe2c-d789-4b4a-8508-ab2bc7d74880/7137fe2c-d789-4b4a-8508-ab2bc7d748801.gif)
JAVA连接数据库增强DAO
JAVA连接数据库增强DAO
在简单的连接数据库的基础上,通过JAVA反射机制可以将对象与数据库表之间映射,直接保存对象、得到对象集合
packagecom.jgj.dao;
importjava.lang.reflect.Field;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.ResultSetMetaData;
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.util.List;
importjava.util.Vector;
/**
*数据库管理类(增强DAO)V1.0,请注意及时释放资源
作者:
蒋固金
*
*@author蒋固金
*
*/
publicclassDBManager{
//数据库连接
Connectionconn=null;
Statementstm=null;
PreparedStatementpstm=null;
//结果集
ResultSetrs=null;
//驱动字符串
privateStringDRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
//连接URL,默认master
privateStringfullDB_URL="jdbc:
sqlserver:
//localhost:
1433;databaseName=master";
privateStringDB_URL="jdbc:
sqlserver:
//localhost:
1433;databaseName=";
//用户名
privateStringuserName="sa";
//密码
privateStringpassword="123";
//是否显示SQL语句
privatebooleanshow_sql=false;
/**
*默认构造方法,连接数据库master
*/
publicDBManager(){
}
/**
*连接指定数据库
*
*@paramdatabaseName
*/
publicDBManager(StringdatabaseName){
fullDB_URL=DB_URL+databaseName;
}
/**
*设置驱动字符串
*
*@paramdriver
*/
publicvoidsetDRIVER(Stringdriver){
this.DRIVER=driver;
}
/**
*得到驱动字符串
*
*@return驱动字符串
*/
publicStringgetDRIVER(){
returnDRIVER;
}
/**
*设置数据库名称,以默认方式自动生成连接URL
*
*@paramdatabaseName
*/
publicvoidsetDataBaseName(StringdatabaseName){
fullDB_URL=DB_URL+databaseName;
}
/**
*设置完整连接URL
*
*@paramfullDB_URL
*/
publicvoidsetFullDB_URL(StringfullDB_URL){
this.fullDB_URL=fullDB_URL;
}
/**
*得到完整URL
*
*@return完整URL
*/
publicStringgetFullDB_URL(){
returnfullDB_URL;
}
/**
*设置用户名
*
*@paramuserName
*/
publicvoidsetUserName(StringuserName){
this.userName=userName;
}
/**
*得到用户名
*
*@return用户名
*/
publicStringgetUserName(){
returnuserName;
}
/**
*设置密码
*
*@parampassword
*/
publicvoidsetPassword(Stringpassword){
this.password=password;
}
/**
*得到密码
*
*@return密码
*/
publicStringgetPassword(){
returnpassword;
}
/**
*设置是否显示SQL语句
*
*@paramshow
*/
publicvoidsetShowSql(booleanshow){
this.show_sql=show;
}
/**
*得到是否显示SQL语句
*
*@returntrue显示
*/
publicbooleangetShowSql(){
returnshow_sql;
}
/**
*获得数据库连接
*
*@returnconn
*/
publicConnectiongetConnect()throwsException{
try{
//加载驱动
Class.forName(DRIVER);
//获得连接
conn=DriverManager.getConnection(fullDB_URL,userName,password);
}catch(Exceptione){
throwe;
}
returnconn;
}
/**
*获得结果集
*
*@paramsqlsql语句
*@return结果集
*@throwsException
*/
publicResultSetgetResultSet(Stringsql)throwsException{
checkSQL(sql);
conn=getConnect();
try{
stm=conn.createStatement();
rs=stm.executeQuery(sql);
}catch(Exceptione){
throwe;
}
returnrs;
}
/**
*获得PreparedStatement
*
*@paramsql
*@returnPreparedStatement对象
*@throwsException
*/
publicPreparedStatementgetpreparedStatement(Stringsql)throwsException{
checkSQL(sql);
pstm=getConnect().prepareStatement(sql);
returnpstm;
}
/**
*获得Statement
*
*@returnstm
*@throwsException
*/
publicStatementgetStatement()throwsException{
stm=getConnect().createStatement();
returnstm;
}
/**
*获得查询结果的向量集合
*
*@paramsql
*@returnVector>
*/
publicVector>DBQuery(Stringsql)throwsException{
checkSQL(sql);
conn=getConnect();
Vector>vvo=newVector>();
try{
stm=conn.createStatement();
rs=stm.executeQuery(sql);
ResultSetMetaDatarsmd=rs.getMetaData();
intcolumnCount=rsmd.getColumnCount();
while(rs.next()){
Vector
for(intm=1;m<=columnCount;m++){
vo.add(rs.getObject(m));
}
vvo.add(vo);
}
}catch(Exceptione){
throwe;
}finally{
try{
freeConnect();
}catch(Exceptionex){
}
}
returnvvo;
}
/**
*获得影响记录的条数
*
*@paramsql
*@return影响记录的条数
*@throwsException
*/
publicintgetAffectRecordCount(Stringsql)throwsException{
checkSQL(sql);
conn=getConnect();
intcount=0;
try{
stm=conn.createStatement();
count=stm.executeUpdate(sql);
}catch(Exceptione){
throwe;
}finally{
try{
freeConnect();
}catch(Exceptionex){
}
}
returncount;
}
/**
*执行SQL语句,判断是否成功
*
*@paramsql
*@paramresult
*@returntrue影响记录条数为result
*/
publicbooleanexeSQL(Stringsql,intresult)throwsException{
inttemp=0;
try{
temp=this.getAffectRecordCount(sql);
}catch(Exceptione){
throwe;
}
if(temp==result){
returntrue;
}
returnfalse;
}
/**
*执行SQL语句,判断是否成功
*
*@paramsql
*@returntrue影响记录条数为1
*/
publicbooleanexeSQL(Stringsql)throwsException{
returnexeSQL(sql,1);
}
/**
*检查SQL语句
*
*@paramsql
*@throwsException
*/
privatevoidcheckSQL(Stringsql)throwsException{
if(sql==null||sql.trim().equals("")){
thrownewException("thesqlisnullorinvalid");
}
if(show_sql){
System.out.println(sql);
}
}
/**
*释放资源
*
*@throwsSQLException
*/
publicvoidfreeConnect()throwsSQLException{
try{
if(rs!
=null){
rs.close();
rs=null;
}
if(pstm!
=null){
pstm.close();
pstm=null;
}
if(stm!
=null){
stm.close();
stm=null;
}
if(conn!
=null){
conn.close();
conn=null;
}
}catch(SQLExceptione){
throwe;
}
}
/**
*向表中插入数据,未释放资源,不适合主键为自增列
*
*@paramobject
*@paramtableName
*@returntrue插入成功
*@throwsException
*/
privatebooleaninsertObject(Objectobject,StringtableName)throwsException{
booleanflag=false;
Classcls=object.getClass();
//得到所有已定义字段
Field[]fields=cls.getDeclaredFields();
//得到字段值不为空的字段集合
VectornotNull=newVector();
//SQL语句
StringBuffersql=newStringBuffer("insertinto"+tableName+"(");
//动态参数的?
号
StringBufferque=newStringBuffer();
try{
//获得字段名称,生成SQL语句
for(inti=0;iFieldfield=fields[i];
field.setAccessible(true);
if(field.get(object)!
=null){
notNull.addElement(field);
sql.append(getFieldName(field)+",");
que.append("?
");
}
}
//最后一位为,,去除
if(sql.charAt(sql.length()-1)==','){
sql.deleteCharAt(sql.length()-1);
}
if(que.charAt(que.length()-1)==','){
que.deleteCharAt(que.length()-1);
}
sql.append(")values("+que+")");
getpreparedStatement(sql.toString());
for(inti=0;ipstm.setObject(i+1,notNull.elementAt(i).get(object));
}
if(pstm.executeUpdate()==1){
flag=true;
}
}catch(Exceptionex){
throwex;
}finally{
try{
if(pstm!
=null){
pstm.close();
}
}catch(Exceptione){
}
}
returnflag;
}
/**
*向表中插入数据,未释放资源,适合主键为自增列
*
*@paramobject
*@paramtableName
*@paramprimaryKeyName
*@returntrue插入成功
*@throwsException
*/
privatebooleaninsertObjectA(Objectobject,StringtableName,StringprimaryKeyName)throwsException{
booleanflag=false;
Classcls=object.getClass();
//得到所有已定义字段
Field[]fields=cls.getDeclaredFields();
//得到字段值不为空的字段集合
VectornotNull=newVector();
//SQL语句
StringBuffersql=newStringBuffer("insertinto"+tableName+"(");
//动态参数的?
号
StringBufferque=newStringBuffer();
try{
//获得字段名称,生成SQL语句
for(inti=0;iFieldfield=fields[i];
field.setAccessible(true);
if(field.get(object)!
=null&&!
getFieldName(field).equals(primaryKeyName)){
notNull.addElement(field);
sql.append(getFieldName(field)+",");
que.append("?
");
}
}
//最后一位为,,去除
if(sql.charAt(sql.length()-1)==','){
sql.deleteCharAt(sql.length()-1);
}
if(que.charAt(que.length()-1)==','){
que.deleteCharAt(que.length()-1);
}
sql.append(")values("+que+")");
getpreparedStatement(sql.toString());
for(inti=0;ipstm.setObject(i+1,notNull.elementAt(i).get(object));
}
if(pstm.executeUpdate()==1){
flag=true;
}
}catch(Exceptionex){
throwex;
}finally{
try{
if(pstm!
=null){
pstm.close();
}
}catch(Exceptione){
}
}
returnflag;
}
/**
*将对象保存在数据库中,表名为类名小写,适合主键不是自增列
*
*@paramobject
*@returntrue成功
*/
publicbooleansaveObject(Objectobject)throwsException{
Classcls=object.getClass();
returnsaveObject(object,getClassNameWithoutPackage(cls).toLowerCase());
}
/**
*将对象保存在数据库的对应表中,仅保存不为空的字段,适合主键不是自增列
*
*@paramobject
*@paramtableName
*@returntrue成功
*@throwsException
*/
publicbooleansaveObject(Objectobject,StringtableName)throwsException{
booleanflag=false;
try{
flag=insertObject(object,tableName);
}catch(Exceptione){
throwe;
}finally{
try{
freeConnect();
}catch(Exceptione){
}
}
returnflag;
}
/**
*将对象保存在数据库中,表名为类名小写,适合主键为自增列
*
*@paramobject
*@paramprimaryKeyName主键
*@returntrue成功
*/
publicbooleansaveObjectA(Objectobject,StringprimaryKeyName)throwsException{
Classcls=object.getClass();
returnsaveObjectA(object,getClassNameWithoutPackage(cls).toLowerCase(),primaryKeyName);
}
/**
*将对象保存在数据库对应表中,适合主键为自增列
*
*@paramobject
*@paramtableName
*@paramprimaryKeyName
*@returntrue保存成功
*@throwsException
*/
publicbooleansaveObjectA(Objectobject,StringtableName,StringprimaryKeyName)throwsException{
booleanflag=false;
try{
flag=insertObjectA(object,tableName,primaryKeyName);
}catch(Excepti