接下来我们来做结合Servlet和JSP技术的简单的综合应用。
首先新建一个web项目,将之前的工具类和oracle驱动贴在相应的位置,如图
Web项目添加驱动Jar有个方便的方法,直接将jar文件复制到WebRoot/WEB-INF/lib目录下就行类,当然用我上面讲述的方法同样适用。接下来,我在DBUtil工具类中添加了关闭资源的代码:
/**
* 关闭所有资源
*/
public static void closeAll(ResultSet rs, Statement st)
{
try
{
//先从结果集关闭
if (null != rs)
{
rs.close();
rs = null;
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
//Statement接口关闭
if (null != st)
{
st.close();
st = null;
}
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
if (null != con)
{
if (con.getAutoCommit())
{
//最后数据库连接关闭
con.close();
con = null;
}
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
接下来,需要一个jdbc操作模板,我们将JDBC对数据库的基本操作定义在这个模板类中,不再是上个例子中写在测试类中类,我将模板类命名为JDBCTemplate类。具体代码如下:
package com.java.jdbc.jdbctemplate;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import com.java.jdbc.util.DBUtil;
public abstract class JDBCTemplate<T> {
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
// 增删改
public boolean update(String sql, Object... params) throws Exception {
int res = 0;
con = DBUtil.getCon();
ps = con.prepareStatement(sql);
//params是一个存储参数的数组
if (null != params)
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
res = ps.executeUpdate();
DBUtil.closeAll(rs, ps);
if (res > 0)
return true;
else
return false;
}
// 查
public ArrayList<T> select(String sql, Class c, Object... params) {
ArrayList<T> lst = new ArrayList<T>();
con = DBUtil.getCon();
try {
ps = con.prepareStatement(sql);
if (null != params)
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
rs = ps.executeQuery();
while (rs.next()) {
lst.add(getObject(rs, c));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closeAll(rs, ps);
}
if (lst.size() == 0)
return null;
return lst;
}
/**
* 通过反射得到某个对象
*/
private T getObject(ResultSet rs, Class c) {
T t = null;
String colName = null;
String methodName = null;
String colType = null;
try {
// 对象的实例
t = (T) c.newInstance();
// 所有公共方法
Method[] ms = c.getMethods();
// 得到元数据
ResultSetMetaData rsmd = rs.getMetaData();
// 查询的所有列
int colCount = rsmd.getColumnCount();
for (int i = 0; i < colCount; i++) {
// 得到列名
colName = rsmd.getColumnName(i + 1); //
// 得到类型
colType = rsmd.getColumnTypeName(i + 1);
// 拼接成set方法 setId setName setBirth setGender setAddress
methodName = "set" + colName.substring(0, 1).toUpperCase()
+ colName.substring(1);
// 得到set方法
for (Method m : ms) {
if (m.getName().equalsIgnoreCase(methodName)) {
// 调用set方法
if ("NUMBER".equalsIgnoreCase(colType)) {
try {
m.invoke(t, rs.getInt(colName));
} catch (Exception e) {
m.invoke(t, rs.getBoolean(colName));
}
} else
m.invoke(t, rs.getObject(colName));
}
}
}
}