`
sungang_1120
  • 浏览: 323770 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

利用反射封装JDBC工具类CRUD实例

 
阅读更多
/**
* JDBC工具类
*/
public class JdbcUtils {

private static final Logger logger = Logger.getLogger(JdbcUtils.class);//这种情况下默认使用logger打印,如是只打印到自定义的logger就获取自定义的logger的名称

         //这里使用的是c3p0数据源
private static DataSource dataSource;
        
         //数据源通过静态块进行初始化,保证在字节码加载时就初始话,且只初始化一次
static {
dataSource = new ComboPooledDataSource();
}
         
// 获得数据源连接池
public static DataSource getDateSource() {
return dataSource;
}

// 获得与指定数据库的连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}

// 统一的释放资源方法
public static void release(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}

// 通用的增删改方法
public static boolean update(String sql, Object[] params) throws DaoException{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
conn.setAutoCommit(false);//将事物默认提交设置为flase
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++)
pstmt.setObject(i + 1,params[i]);//通过setObject设置参数所对应的值。sql语句的参数用?占位
int num = pstmt.executeUpdate();//executeUpdate会返回影响结果的条数
conn.commit();
conn.setAutoCommit(false);
if (num > 0)
return true;
return false;
} catch (SQLException e) {
if(conn != null){
try {
conn.rollback();
} catch (SQLException e1) {
throw new DaoException(e1);
}
}
throw new DaoException(e);
} finally {
release(rs, pstmt, conn);
}
}

/**
* @author
* @since
* @throws
* @description 对数据进行批量添加,当数据量大于100时,则整除1000时提交一次,wbs里存放的是批量数值数组的集合
*/
public static boolean updateBatch(String sql,List wbs) throws DaoException{
logger.info("批量添加开始");
Calendar calendar = Calendar.getInstance();
long startTime = calendar.getTimeInMillis();
calendar = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int count = 0;
boolean flag = false;
try {
conn = getConnection();
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
for(Iterator it = wbs.iterator();it.hasNext();){
Object[] params = (Object[])it.next();
count++;
for (int i = 0; params != null && i < params.length; i++){
pstmt.setObject(i + 1, params[i]);
}
pstmt.addBatch();//将一批参数添加到pstmt对象的批处理命令
    if(count % 100 == 0){
    pstmt.executeBatch();
    conn.commit();//当数量到100时提交
    flag = true;
    }
}
pstmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
flag = true;
if(flag){
logger.info("批量添加结束");
Calendar calendarOld = Calendar.getInstance();
long endTime = calendarOld.getTimeInMillis();
//logger.info("批量添加共耗时:"+(endTime-startTime)+"ms");
logger.info("批量添加共耗时:"+(endTime-startTime)+"ms");
return true;
}
logger.info("批量添加失败");
return false;
} catch (SQLException e) {
if(conn != null){
try {
conn.rollback();
} catch (SQLException e1) {
throw new DaoException(e);
}
}
throw new DaoException(e);
} finally {
release(rs, pstmt, conn);
}
}

// 通用的查询方法
public static Object query(String sql, Object[] params, ResultSetHandler handler) throws DaoException{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++){
pstmt.setObject(i + 1, params[i]);
}
rs = pstmt.executeQuery();
Object result = handler.handle(rs);//此处的handler分为BeanHandler和ListHandler,对应的Handler通过反射将查询到值映射到对象或是集合里并返回。对应handler在最下方。
return result;
} catch (SQLException e) {
throw new DaoException(e);
} finally {
release(rs, pstmt, conn);
}
}

/**
* 此处返回的是插入数据后生成的主键
* @param sql
* @param params
* @return
*/
public static int insert(String sql,Object[] params) throws DaoException{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = getConnection();
pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
for (int i = 0; params != null && i < params.length; i++)
pstmt.setObject(i + 1, params[i]);
pstmt.executeUpdate();
rs =pstmt.getGeneratedKeys();//获取刚刚插入的主键rs
rs.next();//获取刚刚获取的主键
int key = rs.getInt(1);
if(key > 0){
return key;
}else{
return 0;
}
}catch(SQLException e){
throw new DaoException(e);
}finally{
release(rs,pstmt,conn);
}
}

}
对应的BeanHandler和ListHandler如下:
public class BeanHandler implements ResultSetHandler {
private Class clazz;

public BeanHandler(Class clazz) {
this.clazz = clazz;
}

// 将结果集的第一行数据封装到bean返回
public Object handle(ResultSet rs) throws DaoException{
try {
if (rs.next()) {
Object bean = this.clazz.newInstance();
ResultSetMetaData metaData = rs.getMetaData();//获取rs的元数据,该元数据可以获得列的数量和对应列索引处的列的名称值
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnName(i);
Object value = rs.getObject(columnName);//根据列的名称获取对应的值
if(value instanceof Integer){
BeanUtils.setProperty(bean, columnName, (Integer)value);//将值转化为对应的类型然后反射到对应对象属性中。
}else if(value instanceof String){
BeanUtils.setProperty(bean, columnName, (String)value);
}else if(value instanceof Date){
BeanUtils.setProperty(bean, columnName, (Date)value);
}else if(value instanceof Boolean){
BeanUtils.setProperty(bean, columnName, (Boolean)value);
}else if(value instanceof Float){
BeanUtils.setProperty(bean, columnName, (Float)value);
}
}
return bean;
}
return null;
} catch (Exception e) {
throw new DaoException(e);
}
}

}

public class BeanListHandler implements ResultSetHandler {
private Class clazz;

public BeanListHandler(Class clazz) {
this.clazz = clazz;
}

// 将结果集的每一行封装到bean,将bean加入一个list返回
public Object handle(ResultSet rs) throws DaoException{
try {
List list = new ArrayList();
while (rs.next()) {
Object bean = this.clazz.newInstance();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++){
String columnName = metaData.getColumnName(i);
Object value = rs.getObject(columnName);

if(value instanceof Integer){
BeanUtils.setProperty(bean, columnName, (Integer)value);
}else if(value instanceof String){
BeanUtils.setProperty(bean, columnName, (String)value);
}else if(value instanceof Date){
BeanUtils.setProperty(bean, columnName, (Date)value);
}else if(value instanceof Boolean){
BeanUtils.setProperty(bean, columnName, (Boolean)value);
}
}
list.add(bean);
}
return list;
} catch (Exception e) {
e.printStackTrace();
throw new DaoException(e);
}
} 

 

 

分享到:
评论

相关推荐

    SpringJdbcTemplate封装工具类

    通过上述分析,我们可以看到SpringJdbcTemplate是一个强大且灵活的工具,它通过封装JDBC操作,使得数据库访问变得更加简单和安全。在实际开发中,合理利用其特性,可以有效提升开发效率和代码质量。

    JDBC CRUD操作的粗略封装DEMO

    然后,DEMO可能展示了如何使用封装好的JDBC工具类对这些订单数据进行增、删、查、改操作。 增加操作:创建一个新的`OrderDish`对象,然后通过`JdbcUtil.executeUpdate()`插入到数据库。 删除操作:根据订单ID获取并...

    JDBC封装.rar

    "JDBC封装"是指将常见的数据库操作,如增删改查(CRUD:Create, Read, Update, Delete),进行模块化和抽象化的过程,以便于在代码中重复使用和简化数据库交互。下面将详细介绍JDBC封装的原理、步骤以及它带来的好处...

    j2ee09:jdbc03:jdbc的最后封装(用到了反射)

    本篇将重点讨论"j2ee09:jdbc03:jdbc的最后封装(用到了反射)"这一主题,该主题涉及到JDBC的高级使用技巧,特别是如何通过反射来优化和简化数据库操作。 首先,我们来看“jdbc03”的部分。这可能是项目中的一个模块...

    基于JDBC封装的BaseDao(实例代码)

    封装JDBC是为了提高代码的可重用性和可维护性,减少重复的数据库操作代码,使得数据库访问更加简洁、高效。本篇文章将介绍一个基于JDBC封装的`BaseDao`实例,该实例提供了一个通用的DAO(Data Access Object)模板,...

    DataGrid 封装类 的使用实例 及 jsp连接SqlServer数据库实例

    DataGrid封装类是为了简化开发过程而创建的一种工具,它将数据绑定、排序、分页等复杂功能进行了抽象和封装,使开发者能够更快速、高效地构建数据展示界面。使用DataGrid类,开发者无需关心底层的数据操作细节,只需...

    Mybatis通用DAO设计封装(mybatis)

    利用Mybatis的代码生成器,可以根据数据库表自动生成对应的Mapper接口、Mapper XML文件以及实体类,进一步减少手动编写的工作量。 8. **依赖注入**: 使用Spring框架进行依赖注入,将DAO实例注入到Service层,...

    使用java的反射机制来模拟hibernater的jdbc操作

    在本案例中,我们将探讨如何利用反射机制来模拟Hibernate的JDBC操作,实现数据库的增删改查(CRUD)功能,以及简单的分页封装。 首先,让我们了解什么是Hibernate。Hibernate是一个强大的对象关系映射(ORM)框架,...

    homework.zip

    在JDBC实例中,主程序可能是用于测试和展示如何使用工具类进行数据库操作的。 4. **数据库操作**:包括**增(Create)**(添加新的数据到student表)、**删(Delete)**(移除表中的记录)、**改(Update)**(修改...

    Java对数据库CRUD DEMO

    9. **CRUD工具集合**: 在实际项目中,通常会将这些基础操作封装成一个DAO(Data Access Object)层,提供更高级别的API,方便在业务逻辑中调用。这个DEMO可能包含了一个DAO接口及其实现,为每种操作提供了一致的...

    JDBC驱动插件

    3. **msutil.jar**: 这个文件包含了实用工具类,帮助开发者更好地管理和操作SQL Server数据库。这些工具可能包括性能优化的辅助类、查询分析工具、日期时间处理工具等,以提高与SQL Server交互的效率和便捷性。 ...

    spring-jdbcTemplate实例工程

    Spring JDBC Template是Spring框架中用于简化JDBC操作的一个核心组件,它是Spring对JDBC API的封装,旨在提供一个更加简洁、健壮且可测试的数据库访问层。在这个实例工程中,我们将深入探讨Spring JdbcTemplate的...

    使用EasyUI+Springmvc实现的CRUD

    1. **数据模型(Model)**:定义Java实体类,这些类通常对应数据库中的表,用于封装和传输数据。 2. **控制层(Controller)**:SpringMVC的控制器接收前端请求,调用业务逻辑方法,处理结果并返回。在这里,可能...

    JDBC个人小结

    - **定义连接工具类**: 使用连接池获取连接。 - **连接参数**: 写在属性文件中。 - **定义实体类**: 与数据表对应。 - **定义 BaseDAO 类**: 提供通用的 CRUD 操作。 - **重用性**: 一旦定义,后续项目可直接复用...

    JAVA经典的40个实例

    7. **反射**:利用反射API动态地获取类信息,创建对象,调用方法,以及访问私有成员。 8. **泛型**:了解泛型的基本概念,如何在类、接口和方法中使用泛型,以及类型擦除。 9. **设计模式**:如单例模式、工厂模式...

    hibenate 对DAO的封装

    4. 实用工具类(如`HibernateUtil.java`):用于初始化SessionFactory,提供全局的SessionFactory实例。 通过这样的封装,我们可以大大减少DAO层的代码量,提高开发效率,同时保持代码的整洁和可维护性。这种设计...

    springCloud的crud模板示例

    同时,我们需要一个Service类(如`UserService`)来调用Mapper接口的方法,并封装业务逻辑。最后,Controller层负责接收HTTP请求,调用Service进行处理,并返回响应。 6. **RESTful API设计**:为了实现CRUD操作,...

    DBUniversalOperation.zip

    本篇文章将详细讲解如何利用Java的反射机制封装一个名为DBUtil的工具类,以实现对MySQL数据库的万能增删改查功能。 首先,我们来看“反射”这一概念。反射是Java语言的一个强大特性,它允许运行中的Java程序对自身...

    web工程DAO实例

    4. `DBUtil.java`: 数据库连接工具类,通常包含数据库连接池配置和数据库连接的创建、关闭等方法。 5. `UserService.java`: 这是服务层类,调用DAO进行业务操作,它可能包含事务管理逻辑。 6. 测试类(如`...

    java模拟hibernate实现

    在Java编程领域,Hibernate...通过这个项目,你可以深入理解ORM的工作机制,掌握Java反射和注解的使用,以及如何高效地封装JDBC操作。此外,对事务管理和数据库设计的理解也将得到提升,这些都是Java开发中的重要技能。

Global site tag (gtag.js) - Google Analytics