自己写的一个JDBC框架封装类

ObjectMapper是映射类:

package com.base.db;

import java.sql.*;
import java.lang.ref.*;
import java.lang.reflect.*;

public class ObjectMapper {
private Object object;

/** 实例的类型 */
private Class classType;

/** 类的名字 */
private String className;

/** 对应的表的名字 */
private String tableName;

/** 表中所有的字段的名字 */
private String tableFieldNames[];

/** 类的所有属性 */
private Field fields[];

/** 类的所有get方法 */
private Method getMethods[];

/** 类的所有set方法 */
private Method setMethods[];

/** 类的getId方法 */
private Method getIdMethod;

/** 类的setId方法 */
private Method setIdMethod;

/** 对象的id */
private Long id;

public ObjectMapper(Class classType) throws Exception {
this(classType.getConstructor(new Class[] {}).newInstance(
new Object[] {}));
}

public ObjectMapper(Object object) throws Exception {
this.object = object;
this.classType = object.getClass();
// 获得类名,不带包的名字
int dotLocation = classType.getName().lastIndexOf(".");
this.className = classType.getName().substring(dotLocation + 1);

// 获得对应的表名
this.tableName = className.toUpperCase() + "S";

// 获得类的所有属性
this.fields = classType.getDeclaredFields();

// 获得表的所有字段名,类的所有get方法和set方法
this.tableFieldNames = new String[fields.length];
this.getMethods = new Method[fields.length];
this.setMethods = new Method[fields.length];
for (int i = 0; i < fields.length; i++) {
tableFieldNames[i] = fields[i].getName().toUpperCase();
getMethods[i] = getMethod(fields[i], "get");
setMethods[i] = getMethod(fields[i], "set");

if (fields[i].getName().equals("id")) {
this.id = (Long) executeGetMethod(getMethods[i]);
this.getIdMethod = getMethods[i];
this.setIdMethod = setMethods[i];
}
}
}

public void setId(Long id) {
this.id = id;
}

private Object executeGetMethod(Method method) throws Exception {
return method.invoke(this.object, new Object[] {});
}

private void executeSetMethod(Method method, Object parameter)
throws Exception {
method.invoke(this.object, new Object[] { parameter });
}

private Method getMethod(Field field, String prefix) throws Exception {
String methodName = prefix;
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
methodName = prefix + firstLetter + fieldName.substring(1);

if (prefix.equals("set"))
return this.classType.getMethod(methodName, new Class[] { field
.getType() });
else
return this.classType.getMethod(methodName, new Class[] {});
}

private String getInsertSql() throws Exception {
String sql = "insert into " + tableName + "(";

for (int i = 0; i < tableFieldNames.length; i++) {
sql = sql + tableFieldNames[i];
if (i != tableFieldNames.length - 1)
sql = sql + ",";
}

sql = sql + ")values(";

for (int i = 0; i < tableFieldNames.length; i++) {
sql = sql + "?";
if (i != tableFieldNames.length - 1)
sql = sql + ",";
}
sql = sql + ")";

System.out.println(sql);

return sql;
}

private String getSelectSql() throws Exception {
String sql = "select ";

for (int i = 0; i < tableFieldNames.length; i++) {
sql = sql + tableFieldNames[i];
if (i != tableFieldNames.length - 1)
sql = sql + ",";
}

sql = sql + " from " + tableName + " where ID=?";
System.out.println(sql);
return sql;
}

public PreparedStatement getInsertStatement(Connection con)
throws Exception {
PreparedStatement stmt = con.prepareStatement(getInsertSql());

for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
Method getMethod = getMethods[i];

if (field.getName().equals("id")) {
this.id = new Long(getNextId(con));
executeSetMethod(setIdMethod, id);
stmt.setLong(i + 1, this.id.longValue());
continue;
}

Class fieldType = field.getType();

if (fieldType.getName().equals("int"))
stmt.setInt(i + 1, ((Integer) executeGetMethod(getMethod))
.intValue());

if (fieldType.getName().equals("java.lang.String"))
stmt.setString(i + 1, (String) executeGetMethod(getMethod));

if (fieldType.getName().equals("long"))
stmt.setLong(i + 1, ((Long) executeGetMethod(getMethod))
.longValue());

}
return stmt;
}

public PreparedStatement getSelectStatement(Connection con)
throws Exception {
PreparedStatement stmt = con.prepareStatement(getSelectSql());
stmt.setLong(1, this.id.longValue());
return stmt;
}

public Object parseResultSet(ResultSet rs) throws Exception {

for (int i = 0; i < fields.length; i++) {
try
{
Field field = fields[i];
Class fieldType = field.getType();

Method setMethod = setMethods[i];

if (fieldType.getName().equals("int"))


executeSetMethod(setMethod, new Integer(rs.getInt(field
.getName())));

if (fieldType.getName().equals("java.lang.String"))

executeSetMethod(setMethod, rs.getString(field.getName()));
if (fieldType.getName().equals("java.lang.Long"))

executeSetMethod(setMethod, new Long(rs
.getLong(field.getName())));

if (fieldType.getName().equals("java.util.Date"))

executeSetMethod(setMethod, rs.getDate(field.getName()));

if (fieldType.getName().equals("java.math.BigDecimal"))

executeSetMethod(setMethod, rs.getBigDecimal(field.getName()));
}
catch(Exception ex){continue;}

}
return this.object;
}

/**
* 生成一个新的主键值,取值为表的当前最大主键值+1,如果表不包含记录,就返回1
*/
private long getNextId(Connection con) throws Exception {
long nextId = 0;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = con.prepareStatement("select max(ID) from " + tableName);
rs = stmt.executeQuery();
if (rs.next()) {
nextId = rs.getLong(1) + 1;
if (rs.wasNull())
nextId = 1;
} else {
nextId = 1;
}
return nextId;
} finally {
try {
rs.close();
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

这是引用它的MANAGER类:

package com.base.db;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import oracle.jdbc.*;
import oracle.jdbc.driver.OracleDriver;

public class PersistenceManager {
private String dbUrl = "jdbc:oracle:thin:@10.3.2.56:1521:ORADB";

private String dbUser = "shuibj";

private String dbPwd = "shuibj";

public PersistenceManager() throws Exception {
// 加载MySQL数据库驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
DriverManager.registerDriver(new OracleDriver());
}

public Connection getConnection() throws Exception {
// 获得一个数据库连接
return java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPwd);
}

public void save(Object object) throws Exception {
Connection con = null;
PreparedStatement stmt = null;
try {
con = getConnection(); // 获得数据库连接

// 开始一个数据库事务
con.setAutoCommit(false);

ObjectMapper om = new ObjectMapper(object);
stmt = om.getInsertStatement(con);
stmt.execute();

// 提交数据库事务
con.commit();

} catch (Exception e) {
e.printStackTrace();
try {// 如果出现异常,撤销整个事务
con.rollback();
} catch (SQLException sqlex) {
sqlex.printStackTrace(System.out);
}
throw e;
} finally {
try {
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

public List load(Class classType, String prostr,TreeMap parametermap) throws Exception {
Connection con = null;
OracleCallableStatement cstmt = null;
ResultSet rs = null;
List list = new ArrayList();
try {
con = getConnection();

cstmt = (OracleCallableStatement) con.prepareCall(prostr);
int cursorindex=0;

if(parametermap!=null)
{
Set keyset=parametermap.keySet();
Iterator it=keyset.iterator();


while(it.hasNext())
{
Integer key=((Integer)it.next());
Object value=parametermap.get(key);

if(value.toString().equals("OracleTypes.CURSOR"))
{
cursorindex=key.intValue();
System.out.println("index "+cursorindex);

}
else
{
cstmt.setObject(key.intValue(),value);
}

}
}

cstmt.registerOutParameter(cursorindex, OracleTypes.CURSOR);
cstmt.execute();

rs = cstmt.getCursor(cursorindex);
while (rs.next()) {

ObjectMapper om = new ObjectMapper(classType);
Object object = om.parseResultSet(rs);
list.add(object);
}

} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
rs.close();
cstmt.close();
con.close();
} catch (Exception e) {

e.printStackTrace();
}
}
return list;
}

public Object load(Class classType, long id) throws Exception {
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
con = getConnection(); // 获得数据库连接

ObjectMapper om = new ObjectMapper(classType);
om.setId(new Long(id));
stmt = om.getSelectStatement(con);
rs = stmt.executeQuery();

Object object = om.parseResultSet(rs);
return object;

} finally {
try {
rs.close();
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

调用的例子:

paramap.put(new Integer(1), "1");
paramap.put(new Integer(2), "");
paramap.put(new Integer(3), "");
paramap.put(new Integer(4), "OracleTypes.CURSOR");
List list = pm.load(District.class, "{call sgnq.stat_wud1(?,?,?,?)}",
paramap);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值