`

测试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);
		}
	}

}

 

分享到:
评论

相关推荐

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

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

    DBUtil的使用.docx

    ——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!

    DbUtil的介绍使用.docx

    ——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!

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

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

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

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

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

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

    利用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

    Loger_slf4j写入数据表Demo

    一、运行部署 1、将LogerWriteMySqlDemo项目导入Eclipse 2、修改db.properties文件中数据库...三、配置文件db.properties、log4j.properties两个配置文件可以通过servlet配置来使用,也可以直接先用DbUtil.java中先测试

    基于java超市供销存管理系统+源代码+文档说明+数据库(Java+MySQL毕业设计)

    更改DBUtil中的数据库连接密码 5.使用数据表中的user显示的用户密码登录进入管理员和收银员界面 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源...

    Java+Servlet+Jdbc+Jsp+Mysql实现Web学生信息管理系统

    Java+Servlet+Jdbc+Jsp+Mysql实现Web学生信息管理系统,系统经多次测试,运行无误,请大家放心下载

    使和commons-dubtis 封闭装的数据库工具类

    简洁明快的一个数据库工具尖,使用apache commns-dbutil 进行封装,使用了数据源, 封装了最常用的数据库操作方法,比如万能更新,万能能查询,插入数据后返回自增id的方法等 内含测试用的示例和数据库建表语句以及...

    smartHotel_V1.0:无框架酒店管理系统——软件工程小组作业

    src/team/hotel/dao/DBUtil.java 测试账号密码 admin 123456 user 123456 guest2 1212 项目开发情况 数据库开发 数据表设计 存储过程 存储过程的完全测试 网站详细开发 登录注册功能 经理管理 客房标准管理 ...

    Java个人简历模板10.doc

    2. 熟悉中型项目开发经验,能独立完成软件某个模块的分析、设计、开发、单元测试 个人技能 1. 具备一定的英语能力 2. 具备逻辑思维能力 3. 具备团队合作精神 项目经验 1. 具备项目经验,曾经参与过多个项目的...

    Android项目源码安卓联网中国象棋源码

    我没有测试具体的功能,感兴趣的可以自己链接数据库试试吧。下面是运行指南和开发设计文档。 本源码分为客户端和服务端 客户端编译即可运行,socket连接为:127.0.0.1:9898 运行服务端时,需要使用MySQL建表,建表...

    基于JSP和Servlet的网上蛋糕商城源码+数据库+项目说明(毕设项目).zip

    该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    12.2.1 alpha测试基本原理 335 12.2.2 一个椭圆窗口的案例 335 12.3 模板测试 337 12.3.1 基本原理 337 12.3.2 一个简单的案例 340 12.4 任意剪裁平面 341 12.4.1 基本原理 341 12.4.2 茶壶被...

Global site tag (gtag.js) - Google Analytics