`

JDBC练习测试

    博客分类:
  • JDBC
阅读更多
Util类
package tarena.util;



import java.io.InputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;



public class DBUtil {

	private static final String URL;

	private static final String DRIVER;

	private static final String USERNAME;

	private static final String PASSWORD;

	

	private static ThreadLocal threadLocal = 

		new ThreadLocal();

	

	static {

		try {

			InputStream in = DBUtil.class.getResourceAsStream("/db.properties");

			Properties props = new Properties();

			props.load(in);

			in.close();

			

			URL=props.getProperty("url");

			DRIVER=props.getProperty("driver");

			USERNAME=props.getProperty("username");

			PASSWORD=props.getProperty("password");

			Class.forName(DRIVER); // 注册驱动

		} catch(Exception e) {

			System.out.println("无法获得数据库连接信息");

			throw new RuntimeException(e);

		}

	}

	

	private DBUtil() {}

	

	public static Connection open() throws SQLException{

		return DriverManager.getConnection(

				URL,USERNAME,PASSWORD);

	}

	

	public static void close(

			Connection con,

			Statement stmt,

			ResultSet rs) {

		try {rs.close();} catch(Exception e) {}

		try {stmt.close();} catch(Exception e) {}

		try {con.close();} catch(Exception e) {}

	}

	

	public static Connection openInThread() throws SQLException{

		Connection con = 

			(Connection)threadLocal.get();

		if(null == con) {

			con = open();

			threadLocal.set(con);

		}

		return con;

	}

	

	public static void closeInThread() {

		try {

			Connection con = openInThread();

			con.close();

			threadLocal.remove();

		} catch(Exception e) {}

	}

}




测试类
package day02;



import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.Scanner;



import tarena.util.DBUtil;



public class JDBCTest3 {

	public static void main(String[] args) throws Exception {

		test1();

	}



	static void test1() throws Exception  {

		Connection con = null;

		Statement stmt = null;

		try {

			con = DBUtil.openInThread();

			con.setAutoCommit(false);

			// 输入员工数据保存

			// 如果姓名存在,删除再插入新数据

			// 如果不存在,直接插入新数据

			Emp emp = inputEmp();

			if(nameExist(emp.getFirstName(), emp.getLastName())) {

				deleteByName(emp.getFirstName(), emp.getLastName());

			}

			save(emp);

			con.commit();

		} catch(Exception e) {

			con.rollback();

			throw e;

		} finally {

			DBUtil.closeInThread();

		}

	}



	private static void save(

			Emp emp) throws Exception {

		Connection con = DBUtil.openInThread();

		PreparedStatement pstmt = 

			con.prepareStatement(

					"insert into s_emp(id,first_name, last_name, salary) " +

					"values(?,?,?,?)");

		pstmt.setInt(1, emp.getId());

		pstmt.setString(2, emp.getFirstName());

		pstmt.setString(3, emp.getLastName());

		pstmt.setDouble(4, emp.getSalary());

		pstmt.executeUpdate();

	}

	private static void deleteByName(String firstName, String lastName) throws Exception {

		Connection con = DBUtil.openInThread();

		PreparedStatement pstmt = 

			con.prepareStatement(

					"delete from s_emp " +

					"where first_name=? " +

					"and last_name=?");

		pstmt.setString(1, firstName);

		pstmt.setString(2,lastName);

		pstmt.executeUpdate();

	}

	private static boolean nameExist(String firstName, String lastName) throws Exception {

		Connection con = DBUtil.openInThread();

		PreparedStatement pstmt = 

			con.prepareStatement(

					"select * from s_emp " +

					"where first_name=? " +

					"and last_name=?");

		pstmt.setString(1, firstName);

		pstmt.setString(2,lastName);

		ResultSet rs = pstmt.executeQuery();

		// 指针下移有数据,即存在同名员工

		boolean exist = rs.next();

		rs.close();

		pstmt.close();

		return exist;

	}



	private static Emp inputEmp() {

		Scanner sc = new Scanner(System.in);

		System.out.print("请输入id:");

		int id = sc.nextInt();

		System.out.print("请输入first name:");

		String fname = sc.next();

		System.out.print("请输入last name:");

		String lname = sc.next();

		System.out.print("请输入salary:");

		double sal = sc.nextDouble();		

		Emp e = new Emp(id,fname,lname,sal);

		return e;

	}

}


引用

元数据

数据连接元数据

DatabaseMetadata

数据库品牌、版本

表.....

结果集的元数据

ResultSetMetadata



getColumnCount() - 结果集中字段数量

getColumnName(序号) - 指定字段的名字

getColumnType(序号) - 指定字段的类型数字编号

使用Types中的常量做判断

getColumnTypeName(序号) - 指定字段的类型名称



java.sql.Types

封装表示字段类型的数字变号常量

Types.DATE - 年月日

Types.TIME - 时分秒

Types.TIMESTAMP - 年月日时分秒



ResultSet

数据传输量

setFetchSize(数据行数)

0 - JDBC驱动自行决定每次抓取的数据量



int age = rs.getInt("age");

// 刚取出的字段中数据在数据表中是否为null

boolean b = rs.wasNull();

double height = rs.getDouble("height");

b = rs.wasNull();





PreparedStatement

是Statement的子接口

比Statement更常用



1, 预编译的sql语句,重复执行相同的sql语句效率较高

pstmt = con.prepareStatement("select ...");

			pstmt.executeQuery();

			pstmt.executeQuery();



2, 对sql语句中参数数据进行设置

	pstmt = con.prepareStatement(

				"insert into emp(id,name,sal) values(?,?,?)");

			pstmt.setInt(1,4534);

			pstmt.setString(2, "1' or '1' = '1");

			pstmt.setDouble(3,5000D);

			pstmt.executeUpdate(); // 执行上面已经设置好的sql语句

			

			pstmt.setInt(1, 4535);

			pstmt.executeUpdate(); 



3, 不用拼sql,不用处理sql注入





事务处理

事务

1, 启动事务

无事务:自动提交 auto commit = true

启动事务:关闭自动提交 auto commit = false

con.setAtuoCommit(false);

到达事务上边界

2, 提交

con.commit();

到达事务下边界

3, 回滚

con.rollback();

1, 在捕获到异常时执行

2, 在一定条件下



分享到:
评论

相关推荐

    jdbc练习题2.doc

    JDBC 实践题 2 - 数据访问对象(DAO)设计与实现 本题目要求设计和实现一个数据访问对象(DAO),用于操作 personnel 表中的数据。该 DAO 需要提供五个方法:插入人员、修改人员、删除人员、查询所有人员和分页查询...

    JDBC练习小项目用于java初学者

    **标题解析:** "JDBC练习小项目用于java初学者" 这个标题表明这是一个针对初学者设计的Java编程练习项目,重点在于JDBC(Java Database Connectivity)的应用。JDBC是Java语言中用来规范客户端程序如何连接和操作...

    jdbc 练习作业

    在JDBC练习作业中,你可以尝试以下实践: 1. 创建一个简单的数据库连接并执行查询,展示结果。 2. 使用PreparedStatement处理动态SQL,例如用户输入的查询条件。 3. 实现一个DAO类,封装常用的CRUD(Create、Read、...

    Java Dao JDBC 基础练习代码

    本练习代码主要关注如何使用DAO模式和JDBC API来实现用户购买物品和订单处理的功能。首先,我们来详细了解这两个概念。 DAO模式是一种设计模式,它提供了一种在业务逻辑和数据访问之间解耦的方式。在Java应用中,...

    jdbc struts练习源代码

    这个"jdbc struts练习源代码"的压缩包文件很可能是为了帮助开发者学习如何在Struts框架中集成和使用JDBC进行数据操作。 首先,让我们详细了解一下Struts框架。Struts提供了强大的控制层,使得开发者可以更好地组织...

    jdbc练习题3.doc

    在主函数中,实例化`UserDao`并调用对应方法进行测试。 以上就是JDBC操作数据库的基本步骤,涵盖了创建表、插入、更新、删除、查询和用户登录验证等功能。在实际开发中,还需要考虑事务管理、异常处理、连接池的...

    Spring aop、jdbc和事务tx练习

    本练习主要涵盖了Spring的三个方面:面向切面编程(AOP)、JDBC(Java Database Connectivity)以及事务管理(TX)。让我们详细探讨这些知识点。 1. **Spring AOP(面向切面编程)** 面向切面编程是Spring框架的一...

    Jdbc测试的简单实例

    在Java编程领域,JDBC(Java Database Connectivity)是Java应用程序连接和操作数据库的标准接口。它允许程序员使用SQL语言与...通过实际的编程练习和不断学习,你可以更深入地理解和运用JDBC,从而提升你的开发技能。

    java大型数据库技术课程在线练习及测试系统分析与设计.毕业论文.docx

    系统采用 Struts2 + JDBC + Oracle 为主要的开发模式,主要实现了题库管理、分章练习、自动组卷测试及成绩分析等几块功能。 大型数据库技术课程在线练习及测试系统的需求分析 随着计算机技术和互联网技术的发展,...

    mybatis 测试练习项目

    在本测试练习项目中,我们将深入理解MyBatis的核心功能和常见操作,如增删改查(CRUD)以及级联查询。项目采用的是MyBatis的v3.2.2版本。 首先,`test.sql`文件通常是数据库初始化脚本,用于创建测试用的表结构和...

    jdbc.zip_JDBC mysql java_mysql jdbc

    这个压缩包对于初学者来说是一个很好的起点,它提供了实战练习,帮助理解JDBC与MySQL的配合使用,以及如何在Java程序中实现数据库操作。通过阅读相关代码和运行测试程序,可以快速掌握JDBC的基础知识和实践技巧。

    spring框架+jdbc+事务+Junit练习(银行转账)

    总的来说,这个练习将带你深入理解Spring如何处理数据库操作,如何利用事务保证数据一致性,以及如何使用JUnit进行单元测试。通过实际操作,你将能更好地掌握这些核心技能,提升自己的开发能力。在实践中不断学习,...

    JDBC_test:练习JDBC程序

    **JDBC_test: 练习JDBC程序** 在Java编程中,JDBC(Java Database Connectivity)是连接Java应用程序与各种数据库的重要桥梁。本项目“JDBC_test”旨在提供一个实践平台,帮助开发者深入理解并熟练掌握JDBC的核心...

    SSSM测试练习.rar

    SSSM测试练习是一个基于Java编程语言的项目,其核心是Spring MVC框架的运用。Spring MVC是Spring框架的一个模块,主要用于构建Web应用程序。这个压缩包文件可能是为了教学目的而设计的,帮助初学者深入理解Java编程...

    hivesql语句练习

    <description>JDBC connect string for a JDBC metastore <name>javax.jdo.option.ConnectionDriverName <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore ...

    Java Dao JDBC Hibernate XMLmapping 代码

    最后,"tp3"可能是一个项目或测试模块的名称,表示这是一个关于DAO、JDBC、Hibernate和XML mapping的第三部分练习或测试用例,用于实践和检验上述技术的正确使用。 综上所述,这个项目涵盖了Java后端开发中数据库...

    java的JDBC项目,银行管理系统,用来练习java,数据库采用的是mysql.zip

    Java的JDBC(Java Database Connectivity)项目,如“银行管理系统”,是学习和实践Java编程语言以及数据库操作的理想...在实际项目中,还需要考虑性能优化、代码复用、测试策略等多个方面,以实现高效、可维护的系统。

    考试系统 exam练习

    综上所述,"考试系统exam练习"是一个全面的项目,涵盖了从后端到前端,从数据库设计到测试的多种IT技能。对于希望提升Java Web开发能力的学习者来说,这是一个很好的实践平台,可以通过实际操作来加深理解和应用这些...

    JAVAWEB练习,模拟ATM网页版

    这个练习可以帮助开发者掌握和应用JavaWeb开发中的关键概念和技术,如Servlet、JSP、JDBC以及用户交互设计。以下是一些相关的知识点: 1. **Servlet**:Servlet是Java编程语言中用于扩展服务器功能的接口。在这个...

    javaee练习

    这个练习集主要是针对JavaEE技术栈的学习与实践,通过"J2EE习题甲.xls"和"J2EE习题乙.xls"两个Excel文件,我们可以深入理解和掌握JavaEE的核心概念和技术。 JavaEE的主要组件包括: 1. **Servlet**:Servlet是...

Global site tag (gtag.js) - Google Analytics