package test; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import org.junit.Test; import util.DBUtil; public class TestDay02 { /** * 模拟转账的业务。 * 1.为了巩固今天的内容。 * 2.为了引出新知识点:事务。 * * 假设用户(付款方)已经登录了网银, * 要给别人(收款方)转账N元, * 目前已经输入了收款方账号和金额。 * * 转账的实现流程: * 1)查询付款方余额,看够不够 * 2)查询收款方,判断账号对不对 * 3)修改付款方余额,减N元 * 4)修改收款方余额,加N元 * */ @Test public void test6() { //假设付款方输入了如下转账信息: String payId = "00001"; String recId = "00002"; double mny = 1000.0; //转账是一个完整的业务流程, //整个过程应该在一个事务内, //所以只能使用一个连接。 Connection conn = null; try { conn = DBUtil.getConnection(); //事实上JDBC默认会自动提交事务, //在调用executeUpdate()时。 //要想保证当前业务在一个事务内, //需要取消自动提交事务,改为手动提交。 conn.setAutoCommit(false); //1.查询付款方余额 String sql = "select * from accounts_lhh " + "where id=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, payId); ResultSet rs = ps.executeQuery(); Double payMny = 0.0; if(rs.next()) { payMny = rs.getDouble("money"); if(payMny<mny) { throw new SQLException("余额不足"); } } //2.查询收款方账号 String sql2 = "select * from accounts_lhh " + "where id=?"; PreparedStatement ps2 = conn.prepareStatement(sql2); ps2.setString(1, recId); ResultSet rs2 = ps2.executeQuery(); double recMny = 0.0; if(!rs2.next()) { throw new SQLException( "收款账号错误"); } else { recMny = rs2.getDouble("money"); } //3.付款方-N String sql3 = "update accounts_lhh set " + "money=? where id=?"; PreparedStatement ps3 = conn.prepareStatement(sql3); ps3.setDouble(1, payMny-mny); ps3.setString(2, payId); ps3.executeUpdate(); Integer.valueOf("abc"); //4.收款方+N String sql4 = "update accounts_lhh set " + "money=? where id=?"; PreparedStatement ps4 = conn.prepareStatement(sql4); ps4.setDouble(1, recMny+mny); ps4.setString(2, recId); ps4.executeUpdate(); //代码正常执行结束后,提交一次事务 conn.commit(); } catch (Exception e) { //发生异常时将数据回滚 try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); throw new RuntimeException( "回滚失败", e1); } e.printStackTrace(); throw new RuntimeException( "转账失败",e); } finally { DBUtil.close(conn); } } /** * 演示如何获取结果集元数据, * 以及如何从该对象中获取相关信息。 */ @Test public void test5() { //假设页面传入的查询条件如下 int deptno = 1; Connection conn = null; try { conn = DBUtil.getConnection(); String sql = "select * from emps_lhh " + "where deptno=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, deptno); ResultSet rs = ps.executeQuery(); //通过结果集获取其元数据, //包含了对结果集的描述信息, //即多少列、列名、列类型等。 ResultSetMetaData md = rs.getMetaData(); System.out.println(md.getColumnCount()); System.out.println(md.getColumnName(1)); System.out.println(md.getColumnType(1)); System.out.println(md.getColumnTypeName(1)); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException( "查询员工失败",e); } finally { DBUtil.close(conn); } } /** * 演示如何使用PS执行查询, * 避免注入攻击。 */ @Test public void test4() { //假设用户登录时输入的账号密码如下 String code = "zhangsan"; String pwd = "123' or 'a'='a"; Connection conn = null; try { conn = DBUtil.getConnection(); String sql = "select * from users_lhh " + "where username=? " + "and password=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, code); ps.setString(2, pwd); ResultSet rs = ps.executeQuery(); if(rs.next()) { System.out.println("登录成功"); } else { System.out.println("登录失败"); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException( "查询用户失败",e); } finally { DBUtil.close(conn); } } /** * 演示如何使用PS执行DQL语句 */ @Test public void test3() { //假设页面传入的搜索条件如下 int empno = 1; Connection conn = null; try { conn = DBUtil.getConnection(); String sql = "select * from emps_lhh " + "where empno=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, empno); ResultSet rs = ps.executeQuery(); if(rs.next()) { System.out.println( rs.getString("ename")); System.out.println( rs.getDouble("sal")); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException( "查询员工失败",e); } finally { DBUtil.close(conn); } } /** * 演示如何使用PS执行DML语句 */ @Test public void test2() { //假设页面传入的数据如下 String ename = "悟空"; String job = "保镖"; int mgr = 56; Date hiredate = Date.valueOf("2016-10-27"); double sal = 5000.0; double comm = 0.0; int deptno = 2; Connection conn = null; try { conn = DBUtil.getConnection(); String sql = "insert into emps_lhh values" + "(emps_seq_lhh.nextval,?,?,?,?,?,?,?)"; //创建ps,它会立刻发送SQL PreparedStatement ps = conn.prepareStatement(sql); //设置参数值: //ps.set类型(?的序号,?的值) //注意保证个数和顺序 ps.setString(1, ename); ps.setString(2, job); ps.setInt(3, mgr); ps.setDate(4, hiredate); ps.setDouble(5, sal); ps.setDouble(6, comm); ps.setInt(7, deptno); //让ps发送参数,并让DB执行SQL。 ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException( "增加员工失败",e); } finally { DBUtil.close(conn); } } /** * 1.测试DBUtil * 2.演示如何执行DQL */ @Test public void test1() { Connection conn = null; try { conn = DBUtil.getConnection(); System.out.println(conn); Statement smt = conn.createStatement(); String sql = "select * from emps_lhh " + "where empno<6"; //查询方法返回封装结果的对象ResultSet, //它内部包含了多行数据,每行含有多列。 //该类是采用了迭代器模式设计的, //所以通常采用while进行遍历。 ResultSet rs = smt.executeQuery(sql); while(rs.next()) { //每次遍历得到一行数据(含多列) //1. rs.get类型(列索引) //2. rs.get类型(列名) System.out.println(rs.getInt("empno")); System.out.println(rs.getString("ename")); System.out.println("--------------"); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("创建连接失败",e); } finally { DBUtil.close(conn); } } }
相关推荐
- 连接测试:可以设置在获取连接前进行测试,确保连接有效性。 - 监控:C3P0提供监控接口,可以通过JMX进行实时监控。 6. **最佳实践** - 配置合适的连接池大小,避免资源浪费和连接耗尽。 - 定期检查和更新C3P...
在提供的"util"文件夹中,可能包含了SqlHelper和DBUtil的实现源码,以及可能的示例或测试用例。开发者可以通过阅读这些源码,理解其内部工作原理,以及如何根据项目需求进行定制或扩展。 总结来说,韩顺平SqlHelper...
"dbutil+c3p0"这个组合涉及到两个关键组件:DBUtils和C3P0,它们都是Java数据库连接(JDBC)的辅助工具,使得数据库操作更加高效和便捷。下面将详细阐述这两个工具以及它们在实际应用中的作用。 首先,DBUtils是...
在`databaseUtil`这个文件中,可能包含了`DBUtil`类的Java源代码,以及相关的示例或者测试用例。开发者可以查看源码了解具体的实现细节,例如错误处理、事务处理等。此外,这个工具类可能还支持异步操作,使用`...
3. **测试用例**:`test`目录下的测试代码用于验证`dbutil`的正确性和性能。 4. **文档**:可能包括README.md,介绍了如何安装、导入和使用`dbutil`库。 5. **构建和发布脚本**:用于自动化构建、测试和发布`dbutil`...
带了一张全国地址数据的mysql单表版,DBUtil JDBC工具类 java封装的dao层,及测试类,可以直接用测试类测试查询,比如查询福建厦门几个区,福建三明几个县等等,可以用在用户注册页面地址数据的获取。
3、重新发布 com.kingdee.eas.custom.general.dbutil.app.DBUtilFacade 功能; 4、重新发布业务单元“用户自定义/通用/数据库/外部第三方数据库/外部数据库”; 5、刷新java代码; 6、启动测试... 操作步骤: 1...
DBUtil作为Apache的开源项目,是对JDBC的轻量级封装,简化了数据库查询操作,使得数据处理更为便捷。在服务器搭建过程中,服务器端代码集成到Web容器的Servlet ContextListener监听器中,确保服务器在Web容器启动时...
工具包还提供了一个测试类,用于测试数据库连接。该类中可以自行修改参数,以便测试不同的数据库连接场景。 7. 依赖项 工具包依赖于 Microsoft SQL Server 2005 数据库,使用 ...
所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加...
我们可以编写JUnit测试用例,模拟并发转账场景,确保在多线程环境下转账功能的正确性和线程安全性。 总结起来,通过Spring框架与DBUtils的整合,我们可以构建一个高效、安全的用户转账系统。利用Spring的DI和事务...
3、重新发布 com.kingdee.eas.custom.general.dbutil.app.DBUtilFacade 功能; 4、重新发布业务单元“用户自定义/通用/数据库/外部第三方数据库/外部数据库”; 5、刷新java代码; 6、启动测试... 操作步骤: 1、用...
DAO提供了一个抽象层,使得业务逻辑层与数据库交互时无需直接接触底层的SQL语句,降低了代码的耦合度,提高了系统的可维护性和可测试性。在Java中,DAO通常包含以下组件: 1. 接口:定义了对数据库进行操作的方法,...
3. 在DBUtil.java中实现数据库连接获取和关闭的静态方法,entity包中创建BookInfo和BookType实体类。 4. 创建BookInfoDao.java,实现根据图书名称和类别查询的findBook()方法以及根据图书编号查询的findBookById()...
在实际项目中,可以结合`unittest`, `pytest`等测试框架,配合`dbutil`模块来编写测试用例,确保数据库操作的正确性和稳定性。例如,你可以创建测试类,使用`setUp`和`tearDown`方法来初始化和关闭数据库连接,保证...
利用poi3.9做的excel导出工具。...----DBUtil.java ----POIExport.java lib dom4j-1.6.1.jar ojdbc14.jar poi-3.9-20121203.jar poi-ooxml-3.9-20121203.jar poi-ooxml-schemas-3.9-20121203.jar xmlbeans-2.3.0.jar
- `myormtest.rar`:ORM(对象关系映射)测试,可能是对Hibernate、MyBatis等ORM框架的使用示例或测试代码。 - `JQuery_UI.rar`:JQuery UI是一个基于jQuery的用户界面库,包含多种可交互的UI组件,如日期选择器、...
- "MyJavaweb"很可能包含了项目的源代码、配置文件、Web应用资源(如HTML、CSS、JavaScript)、数据库连接文件(如JDBC驱动)、以及可能的测试文件等。 6. **开发工具与环境**: 开发过程中可能使用了集成开发...
项目中使用了几个关键的技术栈,包括dbutil(数据库工具类)、beanutils(对象属性操作工具)和junit(单元测试框架),这些都是Java开发中的常见工具。 1. **Servlet**:Servlet是Java提供的一种用于扩展服务器...