封装数据库操作,Javabean给数据库瘦身
封装数据库操作,目的就是为了隐藏java.sql包内的类,在编码中去掉核心的数据库操作代码。以杜绝直接数据库操作容易带来的资源未释放问题。同时也减少了数据库操作的编码量。
但是很多网友在封装时,却喜欢返回结果集(ResultSet对象),那么这个封装就没有意义了。
1.又是直接操作核心数据库类,跟封装前几乎没什么变化。
2.结果集总是依赖于它使用的连接(Connection)对象。因此当连接对象在方法内被关闭后,你返回的ResultSet就没有用了。
如果真的要获得查询数据库的结果集,就把结果集对象内的所有数据,转储到以Map为元素的List对象内。
当然,这种方式,不能适应大数据量的查询,不过如果真的碰到大数据量的查询,那用什么封装都不好,还是得直接数据库操作.:)))
下面是简单的数据库操作Javabean的代码
DbWrapper.java
importjava.sql.*;
importjava.util.*;
publicclassDbWrapper
{
//定义连接池对象为静态变量,将一直存在,直到工作目录关闭。
privatestaticDataSourceds=null;
//1.用连接池的方式获得连接
//如果不是做多数据库程序,推荐使用此方法
//相关内容:在tomcat管理界面配置连接池
publicstaticConnectionopenConnection()throwsException
{
//只需要初始化1次
if(ds==null)
{
ContextinitContext=newInitialContext();
ContextenvContext=(Context)initContext.lookup("java:/comp/env");
DataSourceds=(DataSource)envContext.lookup("jdbc/MyDataSource");
}
returnds.getConnection();
}
//2.用jdbc驱动获得连接
//相关内容:JSP数据库连接大全
publicstaticConnectionopenConnection(
Stringdriver,
Stringurl,
Stringusername,
Stringpassword)
throwsException
{
Class.forName(driver).newInstance();
returnDriverManager.getConnection(url,username,password);
}
publicstaticvoidcloseConnection(Connectionconn)throwsException
{
if(conn!=null)
{
conn.close();
}
}
publicstaticintexecuteUpdate(Stringsql)throwsException
{
intcount=0;
Connectionconn=null;
Statementstmt=null;
try
{
conn=openConnection();
stmt=conn.createStatement();
count=stmt.executeUpdate(sql);
}
catch(Exceptione)
{
throwe;
}
finally
{
closeConnection(conn);
}
returncount;
}
publicstaticListexecuteQuery(Stringsql)throwsException
{
Listlist=newArrayList();
Connectionconn=null;
Statementstmt=null;
ResultSetrs=null;
try
{
conn=openConnection();
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
ResultSetMetaDatarsmd=rs.getMetaData();
while(rs.next())
{
Mapmap=newHashMap();
for(inti=1;i<=rsmd.getColumnCount();i++)
{
map.put(rsmd.getColumnName(i),rs.getObject(i));
}
list.add(map);
}}
catch(Exceptione)
{
e.printStackTrace();
}
finally
{
if(rs!=null)rs.close();
closeConnection(conn);
}
returnlist;}
}
使用示例:
//1.对于insert,update,delete语句intcount=DbWrapper.executeUpdate(sql);
//2.对于selete语句
java.util.Listlist=DbWrapper.executeQuery(sql);
//方法一:按名字取值,注意大小写是严格区分的
for(inti=0;i<list.size();i++)
{
java.util.Mapmap=(java.util.Map)list.get(i);
out.println(mag.get("column_name").toString());
}
//方法二:遍历取值
for(inti=0;i<list.size();i++)
{
java.util.Mapmap=(java.util.Map)list.get(i);
for(java.util.Iteratorit=map.keySet().iterator();it.hasNext();)
{
Stringcolumn_name=it.next().toString());//取值时注意null判断
out.println(column_name+"="+map.get(column_name)==null?"":map.get(column_name).toString());
}
}