`

测试DBUtil

 
阅读更多
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);
		}
	}

}

 

分享到:
评论

相关推荐

    DBUtil使用于javaWeb连接池c3p0

    - 连接测试:可以设置在获取连接前进行测试,确保连接有效性。 - 监控:C3P0提供监控接口,可以通过JMX进行实时监控。 6. **最佳实践** - 配置合适的连接池大小,避免资源浪费和连接耗尽。 - 定期检查和更新C3P...

    韩顺平SqlHelper,DBUtil工具类

    在提供的"util"文件夹中,可能包含了SqlHelper和DBUtil的实现源码,以及可能的示例或测试用例。开发者可以通过阅读这些源码,理解其内部工作原理,以及如何根据项目需求进行定制或扩展。 总结来说,韩顺平SqlHelper...

    dbutil+c3p0

    "dbutil+c3p0"这个组合涉及到两个关键组件:DBUtils和C3P0,它们都是Java数据库连接(JDBC)的辅助工具,使得数据库操作更加高效和便捷。下面将详细阐述这两个工具以及它们在实际应用中的作用。 首先,DBUtils是...

    android-DBUtil类

    在`databaseUtil`这个文件中,可能包含了`DBUtil`类的Java源代码,以及相关的示例或者测试用例。开发者可以查看源码了解具体的实现细节,例如错误处理、事务处理等。此外,这个工具类可能还支持异步操作,使用`...

    dbutil:围绕常见sqlite行为的Golang包装器

    3. **测试用例**:`test`目录下的测试代码用于验证`dbutil`的正确性和性能。 4. **文档**:可能包括README.md,介绍了如何安装、导入和使用`dbutil`库。 5. **构建和发布脚本**:用于自动化构建、测试和发布`dbutil`...

    mysql全国地址数据单表版,java 带DBUtil工具、dao类

    带了一张全国地址数据的mysql单表版,DBUtil JDBC工具类 java封装的dao层,及测试类,可以直接用测试类测试查询,比如查询福建厦门几个区,福建三明几个县等等,可以用在用户注册页面地址数据的获取。

    eas数据库操作类(可操作外部数据库)_20140223

    3、重新发布 com.kingdee.eas.custom.general.dbutil.app.DBUtilFacade 功能; 4、重新发布业务单元“用户自定义/通用/数据库/外部第三方数据库/外部数据库”; 5、刷新java代码; 6、启动测试... 操作步骤: 1...

    基于Android平台的课堂测试软件的设计与开发.pdf

    DBUtil作为Apache的开源项目,是对JDBC的轻量级封装,简化了数据库查询操作,使得数据处理更为便捷。在服务器搭建过程中,服务器端代码集成到Web容器的Servlet ContextListener监听器中,确保服务器在Web容器启动时...

    韩顺平 sqlHelper 工具包

    工具包还提供了一个测试类,用于测试数据库连接。该类中可以自行修改参数,以便测试不同的数据库连接场景。 7. 依赖项 工具包依赖于 Microsoft SQL Server 2005 数据库,使用 ...

    基于Servlet的学生管理系统,应用MVC的设计模式,使用c3p0数据库连接池,使用DBUTil框架简化JDBC操作.zip

    所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加...

    使用spring框架整合DBUtils技术,实现用户转账功能

    我们可以编写JUnit测试用例,模拟并发转账场景,确保在多线程环境下转账功能的正确性和线程安全性。 总结起来,通过Spring框架与DBUtils的整合,我们可以构建一个高效、安全的用户转账系统。利用Spring的DI和事务...

    eas数据库操作类(可操作外部数据库,多数据源)_20190520

    3、重新发布 com.kingdee.eas.custom.general.dbutil.app.DBUtilFacade 功能; 4、重新发布业务单元“用户自定义/通用/数据库/外部第三方数据库/外部数据库”; 5、刷新java代码; 6、启动测试... 操作步骤: 1、用...

    dbutils +dbcp 连接池构建dao层

    DAO提供了一个抽象层,使得业务逻辑层与数据库交互时无需直接接触底层的SQL语句,降低了代码的耦合度,提高了系统的可维护性和可测试性。在Java中,DAO通常包含以下组件: 1. 接口:定义了对数据库进行操作的方法,...

    《Java Web开发技术》-实践技能测试 A

    3. 在DBUtil.java中实现数据库连接获取和关闭的静态方法,entity包中创建BookInfo和BookType实体类。 4. 创建BookInfoDao.java,实现根据图书名称和类别查询的findBook()方法以及根据图书编号查询的findBookById()...

    Python 链接Mysql数据库注意点.docx

    在实际项目中,可以结合`unittest`, `pytest`等测试框架,配合`dbutil`模块来编写测试用例,确保数据库操作的正确性和稳定性。例如,你可以创建测试类,使用`setUp`和`tearDown`方法来初始化和关闭数据库连接,保证...

    利用poi3.9做的excel导出工具

    利用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组件,如日期选择器、...

    Javaweb学生信息管理系统

    - "MyJavaweb"很可能包含了项目的源代码、配置文件、Web应用资源(如HTML、CSS、JavaScript)、数据库连接文件(如JDBC驱动)、以及可能的测试文件等。 6. **开发工具与环境**: 开发过程中可能使用了集成开发...

    java web 网上商城项目

    项目中使用了几个关键的技术栈,包括dbutil(数据库工具类)、beanutils(对象属性操作工具)和junit(单元测试框架),这些都是Java开发中的常见工具。 1. **Servlet**:Servlet是Java提供的一种用于扩展服务器...

Global site tag (gtag.js) - Google Analytics