/** * 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是一个强大且灵活的工具,它通过封装JDBC操作,使得数据库访问变得更加简单和安全。在实际开发中,合理利用其特性,可以有效提升开发效率和代码质量。
然后,DEMO可能展示了如何使用封装好的JDBC工具类对这些订单数据进行增、删、查、改操作。 增加操作:创建一个新的`OrderDish`对象,然后通过`JdbcUtil.executeUpdate()`插入到数据库。 删除操作:根据订单ID获取并...
"JDBC封装"是指将常见的数据库操作,如增删改查(CRUD:Create, Read, Update, Delete),进行模块化和抽象化的过程,以便于在代码中重复使用和简化数据库交互。下面将详细介绍JDBC封装的原理、步骤以及它带来的好处...
本篇将重点讨论"j2ee09:jdbc03:jdbc的最后封装(用到了反射)"这一主题,该主题涉及到JDBC的高级使用技巧,特别是如何通过反射来优化和简化数据库操作。 首先,我们来看“jdbc03”的部分。这可能是项目中的一个模块...
封装JDBC是为了提高代码的可重用性和可维护性,减少重复的数据库操作代码,使得数据库访问更加简洁、高效。本篇文章将介绍一个基于JDBC封装的`BaseDao`实例,该实例提供了一个通用的DAO(Data Access Object)模板,...
DataGrid封装类是为了简化开发过程而创建的一种工具,它将数据绑定、排序、分页等复杂功能进行了抽象和封装,使开发者能够更快速、高效地构建数据展示界面。使用DataGrid类,开发者无需关心底层的数据操作细节,只需...
利用Mybatis的代码生成器,可以根据数据库表自动生成对应的Mapper接口、Mapper XML文件以及实体类,进一步减少手动编写的工作量。 8. **依赖注入**: 使用Spring框架进行依赖注入,将DAO实例注入到Service层,...
在本案例中,我们将探讨如何利用反射机制来模拟Hibernate的JDBC操作,实现数据库的增删改查(CRUD)功能,以及简单的分页封装。 首先,让我们了解什么是Hibernate。Hibernate是一个强大的对象关系映射(ORM)框架,...
在JDBC实例中,主程序可能是用于测试和展示如何使用工具类进行数据库操作的。 4. **数据库操作**:包括**增(Create)**(添加新的数据到student表)、**删(Delete)**(移除表中的记录)、**改(Update)**(修改...
9. **CRUD工具集合**: 在实际项目中,通常会将这些基础操作封装成一个DAO(Data Access Object)层,提供更高级别的API,方便在业务逻辑中调用。这个DEMO可能包含了一个DAO接口及其实现,为每种操作提供了一致的...
3. **msutil.jar**: 这个文件包含了实用工具类,帮助开发者更好地管理和操作SQL Server数据库。这些工具可能包括性能优化的辅助类、查询分析工具、日期时间处理工具等,以提高与SQL Server交互的效率和便捷性。 ...
Spring JDBC Template是Spring框架中用于简化JDBC操作的一个核心组件,它是Spring对JDBC API的封装,旨在提供一个更加简洁、健壮且可测试的数据库访问层。在这个实例工程中,我们将深入探讨Spring JdbcTemplate的...
1. **数据模型(Model)**:定义Java实体类,这些类通常对应数据库中的表,用于封装和传输数据。 2. **控制层(Controller)**:SpringMVC的控制器接收前端请求,调用业务逻辑方法,处理结果并返回。在这里,可能...
- **定义连接工具类**: 使用连接池获取连接。 - **连接参数**: 写在属性文件中。 - **定义实体类**: 与数据表对应。 - **定义 BaseDAO 类**: 提供通用的 CRUD 操作。 - **重用性**: 一旦定义,后续项目可直接复用...
7. **反射**:利用反射API动态地获取类信息,创建对象,调用方法,以及访问私有成员。 8. **泛型**:了解泛型的基本概念,如何在类、接口和方法中使用泛型,以及类型擦除。 9. **设计模式**:如单例模式、工厂模式...
4. 实用工具类(如`HibernateUtil.java`):用于初始化SessionFactory,提供全局的SessionFactory实例。 通过这样的封装,我们可以大大减少DAO层的代码量,提高开发效率,同时保持代码的整洁和可维护性。这种设计...
同时,我们需要一个Service类(如`UserService`)来调用Mapper接口的方法,并封装业务逻辑。最后,Controller层负责接收HTTP请求,调用Service进行处理,并返回响应。 6. **RESTful API设计**:为了实现CRUD操作,...
本篇文章将详细讲解如何利用Java的反射机制封装一个名为DBUtil的工具类,以实现对MySQL数据库的万能增删改查功能。 首先,我们来看“反射”这一概念。反射是Java语言的一个强大特性,它允许运行中的Java程序对自身...
4. `DBUtil.java`: 数据库连接工具类,通常包含数据库连接池配置和数据库连接的创建、关闭等方法。 5. `UserService.java`: 这是服务层类,调用DAO进行业务操作,它可能包含事务管理逻辑。 6. 测试类(如`...
在Java编程领域,Hibernate...通过这个项目,你可以深入理解ORM的工作机制,掌握Java反射和注解的使用,以及如何高效地封装JDBC操作。此外,对事务管理和数据库设计的理解也将得到提升,这些都是Java开发中的重要技能。