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);
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);
相关推荐
本组件"自己写的一个DAO 实现对jdbc dbcp封装 开源小组件"是作者学习研究的成果,适用于小型项目,同时也是初学者了解和实践DAO设计模式、JDBC以及Apache DBCP连接池的好材料。 1. JDBC(Java Database ...
综上所述,自封装的JdbcTemplate是一个简化JDBC操作的实用工具,它通过设计模式和面向对象编程,将复杂的数据库交互转化为简单的API调用,降低了开发难度,提高了代码质量。对于初学者而言,这是一个很好的学习和...
本项目中,"自己封装的小框架--JDBC封装 Action层封装 手动事务管理"是一个实用的实践案例,旨在提高开发效率,优化代码结构,并确保数据操作的完整性。下面我们将深入探讨这个框架中的主要组成部分及其相关知识点。...
本项目是一个使用JDBC连接MySQL数据库的简单示例,虽然目前只包含了基本的连接功能,但已经能够展示出如何通过Java代码与MySQL数据库进行交互。 首先,我们需要理解JDBC的核心概念。JDBC提供了一组接口和类,使得...
在这个“jdbc连接池封装及ORM框架jdbc.rar”文件中,我们可以探讨几个核心概念和技术,包括设计模式的应用、注解的使用以及反射机制。 首先,**设计模式**在软件开发中起着至关重要的作用。例如,工厂模式可能被...
jdbc封装(实现对实体的增删改查[分页]),辅助学习Hibernate 包含三个文件夹,分别是: code-access实现 是用access实现的,本意是access方便,就一个文件,方便部署。但access有好多不支持,就写成这样.主要是可参考Dao...
这个框架封装了增删改查的所有操作。可以很方便的操作JDBC,该自定义框架提供了两个相关的核心方法: int update(sql , params):是操作insert 、update、delete相关的SQL语句的方法,参数sql,是传入一个满足...
"JDBC封装方式"可能是包含上述封装策略的源代码文件,如`DBUtil.java`,`UserDAO.java`,`UserDAOImpl.java`等,这些文件共同构成了一个完整的JDBC封装体系。 通过以上介绍,我们可以理解JDBC封装是Java开发中提升...
在本课程"02-01-11-基于Spring JDBC手写定制自己的ORM框架1"中,我们将探讨如何利用Spring的JdbcTemplate设计理念,来构建一个自定义的ORM(对象关系映射)框架。ORM框架的主要目的是简化Java应用程序与数据库之间的...
SSH框架,全称为Struts2、...这个SSH框架封装demo可以帮助开发者快速理解如何将这三个框架整合起来,形成一个完整的应用程序。通过学习和实践,开发者能够掌握如何利用SSH框架有效地组织和管理代码,提高开发效率。
这个文件很可能是封装好的一个基类,为具体的DAO(Data Access Object)提供通用的方法。可能包含以下功能: - 连接管理:自动获取和释放连接,通常会利用`PoolManager`来获取连接池中的连接。 - SQL执行:提供...
在高级封装中,我们通常会创建一个数据库连接池来管理数据库连接,提高性能,避免频繁的打开和关闭连接。此外,使用PreparedStatement代替Statement可以防止SQL注入,并提高执行效率。批处理操作也是提高性能的一个...
- **代码复用**:将这些步骤封装到一个类或方法中,其他地方可以直接调用,无需重复编写相同代码。 - **异常处理**:封装可以统一处理异常,提高程序健壮性。 - **事务管理**:在封装的类中,可以方便地进行事务...
接着,我们来看JDBC封装类的基本结构。通常,这个类会包含以下功能: 1. 加载配置:读取`config.properties`,获取数据库连接信息。 2. 数据库连接管理:提供`getConnection()`方法来创建并返回数据库连接。可能...
标题提到的"类似hibernate的jdbc封装"就是这样的一个实践,它试图在不引入庞大框架的情况下,提供类似Hibernate的便捷性。 首先,我们来了解JDBC(Java Database Connectivity),它是Java中用于连接数据库的标准...
Spring JDBC提供了一个JdbcTemplate类,它能够自动处理数据库连接的创建和关闭,事务管理,以及异常处理,从而避免了手动编写繁琐的JDBC代码。 在描述中提到的"java 使用 jdbc+spring 所需要的包",这些是使用...
根据给定的信息,本文将详细解析Java中使用MyBatis框架封装JDBC的相关知识点,包括MyBatis的基础概念、环境搭建、基本使用方法以及高级特性等内容。 ### 一、MyBatis简介 MyBatis是一个优秀的持久层框架,它支持...
此外,我们还可以实现一个结果集处理类,将ResultSet映射到自定义的Java对象,这通常通过ORM(Object-Relational Mapping)框架如MyBatis或Hibernate完成。这种方法使得数据操作更加面向对象,提高代码的可读性和可...
通过封装这样一个JDBC工具类,开发者可以更便捷地执行数据库操作,而无需每次都手动处理连接、预编译、结果集等步骤,大大提高了开发效率。同时,良好的注释有助于其他团队成员理解和使用这个工具类。
反射是Java语言的一个强大特性,允许运行时动态地获取类的信息并调用其方法。在AOP中,反射用于在运行时创建目标对象的代理,执行增强(如事务管理、日志记录)并在适当的时候调用实际的目标方法。 三大框架指的是...