`
superamzon
  • 浏览: 4844 次
  • 来自: 天津
社区版块
存档分类
最新评论

自己写的一个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);
分享到:
评论
1 楼 hilliate 2008-07-07  
很有意思,参考中,谢谢博主~

相关推荐

    自己写一个DAO 实现对jdbc dbcp封装 开源小组件

    本组件"自己写的一个DAO 实现对jdbc dbcp封装 开源小组件"是作者学习研究的成果,适用于小型项目,同时也是初学者了解和实践DAO设计模式、JDBC以及Apache DBCP连接池的好材料。 1. JDBC(Java Database ...

    JdbcTemplate,自己封装的jdbc小框架

    综上所述,自封装的JdbcTemplate是一个简化JDBC操作的实用工具,它通过设计模式和面向对象编程,将复杂的数据库交互转化为简单的API调用,降低了开发难度,提高了代码质量。对于初学者而言,这是一个很好的学习和...

    自己封装的小框架--JDBC封装 Action层封装 手动事务管理

    本项目中,"自己封装的小框架--JDBC封装 Action层封装 手动事务管理"是一个实用的实践案例,旨在提高开发效率,优化代码结构,并确保数据操作的完整性。下面我们将深入探讨这个框架中的主要组成部分及其相关知识点。...

    自己写的一个使用jdbc连接mysql的源代码

    本项目是一个使用JDBC连接MySQL数据库的简单示例,虽然目前只包含了基本的连接功能,但已经能够展示出如何通过Java代码与MySQL数据库进行交互。 首先,我们需要理解JDBC的核心概念。JDBC提供了一组接口和类,使得...

    jdbc连接池封装及ORM框架jdbc.rar

    在这个“jdbc连接池封装及ORM框架jdbc.rar”文件中,我们可以探讨几个核心概念和技术,包括设计模式的应用、注解的使用以及反射机制。 首先,**设计模式**在软件开发中起着至关重要的作用。例如,工厂模式可能被...

    jdbc封装(实现对实体的增删改查[分页]).zip

    jdbc封装(实现对实体的增删改查[分页]),辅助学习Hibernate 包含三个文件夹,分别是: code-access实现 是用access实现的,本意是access方便,就一个文件,方便部署。但access有好多不支持,就写成这样.主要是可参考Dao...

    自定义JDBC框架-JDBCFrarmework源码

    这个框架封装了增删改查的所有操作。可以很方便的操作JDBC,该自定义框架提供了两个相关的核心方法: int update(sql , params):是操作insert 、update、delete相关的SQL语句的方法,参数sql,是传入一个满足...

    JDBC封装.rar

    "JDBC封装方式"可能是包含上述封装策略的源代码文件,如`DBUtil.java`,`UserDAO.java`,`UserDAOImpl.java`等,这些文件共同构成了一个完整的JDBC封装体系。 通过以上介绍,我们可以理解JDBC封装是Java开发中提升...

    02-01-11-基于Spring JDBC手写定制自己的ORM框架1

    在本课程"02-01-11-基于Spring JDBC手写定制自己的ORM框架1"中,我们将探讨如何利用Spring的JdbcTemplate设计理念,来构建一个自定义的ORM(对象关系映射)框架。ORM框架的主要目的是简化Java应用程序与数据库之间的...

    SSH框架封装demo

    SSH框架,全称为Struts2、...这个SSH框架封装demo可以帮助开发者快速理解如何将这三个框架整合起来,形成一个完整的应用程序。通过学习和实践,开发者能够掌握如何利用SSH框架有效地组织和管理代码,提高开发效率。

    jdbc-utils.rar_Utils_jdbc_jdbc封装

    这个文件很可能是封装好的一个基类,为具体的DAO(Data Access Object)提供通用的方法。可能包含以下功能: - 连接管理:自动获取和释放连接,通常会利用`PoolManager`来获取连接池中的连接。 - SQL执行:提供...

    深入JDBC高级封装

    在高级封装中,我们通常会创建一个数据库连接池来管理数据库连接,提高性能,避免频繁的打开和关闭连接。此外,使用PreparedStatement代替Statement可以防止SQL注入,并提高执行效率。批处理操作也是提高性能的一个...

    java封装jdbc的操作代码

    - **代码复用**:将这些步骤封装到一个类或方法中,其他地方可以直接调用,无需重复编写相同代码。 - **异常处理**:封装可以统一处理异常,提高程序健壮性。 - **事务管理**:在封装的类中,可以方便地进行事务...

    java JDBC包装类

    接着,我们来看JDBC封装类的基本结构。通常,这个类会包含以下功能: 1. 加载配置:读取`config.properties`,获取数据库连接信息。 2. 数据库连接管理:提供`getConnection()`方法来创建并返回数据库连接。可能...

    类似hibernate的jdbc封装

    标题提到的"类似hibernate的jdbc封装"就是这样的一个实践,它试图在不引入庞大框架的情况下,提供类似Hibernate的便捷性。 首先,我们来了解JDBC(Java Database Connectivity),它是Java中用于连接数据库的标准...

    java jdbc 需要包

    Spring JDBC提供了一个JdbcTemplate类,它能够自动处理数据库连接的创建和关闭,事务管理,以及异常处理,从而避免了手动编写繁琐的JDBC代码。 在描述中提到的"java 使用 jdbc+spring 所需要的包",这些是使用...

    java的JDBC使用Mybatis框架封装

    根据给定的信息,本文将详细解析Java中使用MyBatis框架封装JDBC的相关知识点,包括MyBatis的基础概念、环境搭建、基本使用方法以及高级特性等内容。 ### 一、MyBatis简介 MyBatis是一个优秀的持久层框架,它支持...

    对jdbc的封装的总结

    此外,我们还可以实现一个结果集处理类,将ResultSet映射到自定义的Java对象,这通常通过ORM(Object-Relational Mapping)框架如MyBatis或Hibernate完成。这种方法使得数据操作更加面向对象,提高代码的可读性和可...

    JDBC工具类

    通过封装这样一个JDBC工具类,开发者可以更便捷地执行数据库操作,而无需每次都手动处理连接、预编译、结果集等步骤,大大提高了开发效率。同时,良好的注释有助于其他团队成员理解和使用这个工具类。

    面向切面封装的JDBC

    反射是Java语言的一个强大特性,允许运行时动态地获取类的信息并调用其方法。在AOP中,反射用于在运行时创建目标对象的代理,执行增强(如事务管理、日志记录)并在适当的时候调用实际的目标方法。 三大框架指的是...

Global site tag (gtag.js) - Google Analytics