一些方法可能要使用到该工具类,该工具类中的方法包括从链接数据库到数据表中记录的增删改查。

package JDBCTest;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.junit.Test; /**
* 操作JDBC的工具类,封装了一些工具方法。
*包括: 1.获取数据库连接方法
* 2.对数据表增删改的方法
* 3.对数据表查找的方法
* 4.使用反射为对象的属性赋值
* 5.关闭Statement对象和Connection连接。
* 6.关闭ResultSet、Statement、Connection连接。
* 7.SQL注入。
* 8.使用PerparedStatement查询数据判断是否登陆成功。
* 5.关闭3个连接的方法
*以上方法皆为静态方法。
* 版本:1.0
*
*/
public class TestTools { /**
* 1.获取数据库连接
* 步骤:
* 1.准备链接数据库的4个字符串
* 1_1.创建Properties对象
* 1_2.获取jabc.properties对应的输入流
* 1_3.加载1_2对应的输入流
* 1_4.获取具体数据(Driver、url、user、password)
* 2.加载数据库驱动程序(对应的Driver实现类中有注册驱动的代码块)
* 3.通过DriverManager的getConnection()方法获取数据库链接
*
*/
public static Connection getConnection() throws Exception{
//1_1.创建Properties对象
Properties properties = new Properties();
//1_2.获取jdbc.properties输入流
InputStream is = TestTools.class.getClassLoader().
getResourceAsStream("jdbc.properties");
//1_3.加载对应发输入流
properties.load(is);
//1_4.获取具体信息
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String jdbcUrl = properties.getProperty("jdbcUrl");
String driver = properties.getProperty("driver");
//2.加载数据库驱动程序
Class.forName(driver);
//3.通过DriverManager的getConnection()方法获取数据库链接,并返回
return DriverManager.getConnection(jdbcUrl, user, password);
} /**
* 2.操作数据库,包括增、删、改操作。
* 获取数据库链接(Connection)之后,使用(Statement)操作数据库,对数据库进行增删改操作。
*/
public static void getStatement(){
Connection conn = null;
Statement statement = null;
try {
//1.获取数据库连接
conn = TestTools.getConnection();
//2.准备插入的语句
//增
String sql1 = "INSERT INTO CUSTOMERS (NAME,AGE,BIRTH,address) " +
"VALUES ('王五','23','1995-05-12','河南省')";
//删
String sql2 = "DELETE FROM CUSTOMERS WHERE id = 1 ";
//改
String sql3 = "UPDATE CUSTOMERS SET NAME = '张辽' WHERE id = '5'";
//3_1.获取操作SQL语句的Statement对象
statement = conn.createStatement();
//3_2.调用Statement对象的executeUpdate(sql)方法,执行SQL语句进行插入
statement.execute(sql1);
} catch (Exception e) {
e.printStackTrace();
}finally{
//4.关闭连接
TestTools.release(statement, conn);
}
} /**
* 2_1.通用方法,对2.方法进行了通用性的修改,功能不变包括增、删、改操作。使用Statement进行数据表更新,包括增、删、改操作,但不包括查询。
* 获取数据库链接(Connection)之后,使用(Statement)操作数据库,对数据库进行增删改操作。
*/
public static void update(String sql){
Connection conn = null;
Statement statement = null;
try {
//1.获取数据库连接
conn = TestTools.getConnection();
//2.获取操作SQL语句的Statement对象
statement = conn.createStatement();
//3.调用Statement对象的executeUpdate(sql)方法,执行SQL语句进行插入
statement.execute(sql);
} catch (Exception e) {
e.printStackTrace();
}finally{
//4.关闭连接
TestTools.release(statement, conn);
}
}
/**
* 2_2.通用方法,对2_1.方法进行了修改,功能不变包括增、删、改操作。使用PreparedStatement进行数据表更新。
* Object ... args:表示可变参数。
* preparedstatement.executeUpdate();该方法用于更新。
* preparedstatement.executeQuery();该方法用于查询。
*/
public static void update(String sql ,Object ... args){
//1.获取链接
Connection conn = null;
//2.获取Preparedtatement对象
PreparedStatement preparedstatement = null;
try {
conn = TestTools.getConnection();
preparedstatement = conn.prepareStatement(sql);
//3.由于是可变参数,所以使用for循环,设置sql语句的占位符
for(int i = 1; i < args.length; i++){
preparedstatement.setObject(i+1, args[i]);
}
//4.执行更新
preparedstatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
//5.关闭连接
TestTools.release(preparedstatement, conn);
} } /**
* 3.操作数据库,对数据库进行查询操作,
* 步骤:
* 1.获取Connection连接
* 2.获取Statement对象
* 3.Statement对象调用executeQuery(sql)方法,执行查询操作返回结果给ResultSet对象。
* 4.处理ResultSet对象
* 5.关闭所有连接
*/
public static void getResultSet(){
Connection conn = null;
Statement state = null;
ResultSet rs = null;
try {
//1.获取连接
conn = TestTools.getConnection();
//2.获取Statement对象
state = conn.createStatement();
//3.Statement对象调用executeQuery(sql)方法
String sql = "select * from customers";
rs = state.executeQuery(sql);
//4.处理rs
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String age = rs.getString(3);
Date birth = rs.getDate(4);
String address = rs.getString(5);
System.out.println(id);
System.out.println(name);
System.out.println(age);
System.out.println(birth);
System.out.println(address);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
//5.关闭连接
TestTools.release(rs, state, conn);
}
} /**
* 3_1.通用方法,对3.方法进行修改,功能不变:对数据库进行查询操作,根据传入的参数查找是否存在该学生。,
* 步骤:
* 1.获取Connection连接
* 2.获取Statement对象
* 3.Statement对象调用executeQuery(sql)方法,执行查询操作返回结果给ResultSet对象。
* 4.处理ResultSet对象
* 5.关闭所有连接
*/
public static void query(String sql){
Connection conn = null;
Statement state = null;
ResultSet rs = null;
try {
//1.获取连接
conn = TestTools.getConnection();
//2.获取Statement对象
state = conn.createStatement();
//3.Statement对象调用executeQuery(sql)方法
rs = state.executeQuery(sql);
//4.处理rs
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String age = rs.getString(3);
Date birth = rs.getDate(4);
String address = rs.getString(5);
System.out.println(id);
System.out.println(name);
System.out.println(age);
System.out.println(birth);
System.out.println(address);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
//5.关闭连接
TestTools.release(rs, state, conn);
}
}
/**
* 3_2.通用方法,对3.方法进行修改,用户可以传进sql一语句和某个字段,使之更加灵活。
*功能不变:对数据库进行查询操作,根据传入的参数查找是否存在该学生。
*/
public static Student query(String sql, Object ... args){
Student student = null;
Connection conn = null;
PreparedStatement preparedstatement = null;
ResultSet rs = null;
try {
//2.开始连接数据库
conn = TestTools.getConnection();
//3.获取Statement对象
preparedstatement = conn.prepareStatement(sql);
//4.使用executeQuery()方法,执行查询
rs = preparedstatement.executeQuery(sql);
if(rs.next()){
student = new Student();
student.setFlowID(rs.getInt(1));
student.setType(rs.getInt(2));
student.setIDCard(rs.getString(3));
student.setExamCard(rs.getString(4));
student.setStudentName(rs.getString(5));
student.setLocation(rs.getString(6));
student.setGrade(rs.getInt(7));
}else{
return null;
} } catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
//5.关闭连接
TestTools.release(rs, preparedstatement, conn);
}
return student;
} /**
* 4.使用反射为对象的属性赋值
* @param entity:对象
* @param fieldName:属性名
* @param fieldValue:属性值
*/
public static void setFieldValue(Object entity,String fieldName,Object fieldValue){
try {
//首先通过反射获取指定名称的变量。
Field Name = entity.getClass().getDeclaredField(fieldName);
//设置私有的变量允许访问。
Name.setAccessible(true);
//Name调用set(对象,值)方法,为获取到的变量赋值
Name.set(entity, fieldValue); } catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} /**
* 5.关闭Statement对象和Connection连接。
*/
public static void release(Statement statement,Connection conn){
if(statement != null){
//1.关闭statement对象
try {
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn != null){
//2.关闭数据库连接
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 6.关闭ResultSet、Statement、Connection连接。
*/
public static void release(ResultSet rs,Statement statement,Connection conn){
if(rs != null){
//1.关闭数据库连接
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(statement != null){
//2.关闭statement对象
try {
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn != null){
//3.关闭数据库连接
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 7.SQL注入。
*SQL注入:利用某些系统没有对用户输入的数据进行充分的检查,而而在用户中注入非法的SQL语句段
*或命令从而利用系统的SQL引擎完成恶意操作。
*/
@Test
public void testSQLinjection(){
String username = "a' OR PASSWORD = ";
String password = " OR '1' = '1";
/*System.out.println("请输入账号密码:");
Scanner input = new Scanner(System.in);
System.out.println("账号:");
username = input.next();
System.out.println("密码:");
password = input.next();*/
String sql = "select * from user where username = '"+username
+"' and password = '"+password+"'";
System.out.println(sql);
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
try {
conn = TestTools.getConnection();
statement = conn.createStatement();
rs = statement.executeQuery(sql);
if(rs.next()){
System.out.println("登录成功!");
}else{
System.out.println("登录失败!");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(rs, statement, conn);
}
}
/**
* 8.使用PerparedStatement查询数据判断是否登陆成功。
* 同时学习PerparedStatement是如何防SQL注入的。
*/
@Test
public void testSQLinjection1(){
String username = "a' OR PASSWORD = ";
String password = " OR '1' = '1";
String sql = "select * from user where username = ? and password = ?";
Connection conn = null;
PreparedStatement preparedstatement = null;
ResultSet rs = null;
try {
conn = TestTools.getConnection();
preparedstatement = conn.prepareStatement(sql);
preparedstatement.setString(1, username);
preparedstatement.setString(2, password);
rs = preparedstatement.executeQuery();
if(rs.next()){
System.out.println("登录成功!");
}else{
System.out.println("登录失败!");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(rs, preparedstatement, conn);
}
}
}

工具类TestTools的更多相关文章

  1. 【转载】[C#]枚举操作(从枚举中获取Description,根据Description获取枚举,将枚举转换为ArrayList)工具类

    关键代码: using System; using System.Collections; using System.Collections.Generic; using System.Compone ...

  2. JFreeChart绘制XY折线图(工具类设计)

    准备用Java写通信的仿真平台作为毕业设计,相比matlab绘图,Java绘图需要自己去写很多工具类,博主在这采用了JFreeChart的开源解决方案,摸索着自己写了一个XY折线图工具类,话不多说贴源 ...

  3. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  4. Android—关于自定义对话框的工具类

    开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...

  5. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

  6. js常用工具类.

    一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...

  7. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  8. Java程序员的日常—— Arrays工具类的使用

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

  9. .net使用正则表达式校验、匹配字符工具类

    开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ...

随机推荐

  1. c# 界面自适应大小

    采用在窗体事件SizeChanged里面代码控制大小和位置,达到自动适应窗体大小,这样做调整起来方便. private void FrmMain_SizeChanged(object sender, ...

  2. STM32应用实例六:与MS5837压力传感器的I2C通讯

    MS5837压力传感器是一种可用于电路板上,适用于检测10-1200mbar压力范围的传感器,灵敏度非常高,理论上能够检测到0.01mbar的压力变化,实际使用过程中测试并无明显的变化. MS5837 ...

  3. 测试开发之前端——No9.HTML5中的视频/音频

    HTML5 视频和音频的 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> 元素提供了方法.属性和事件. 这些方法.属性和事件允许您使用 JavaS ...

  4. Laravel Eloquent 数据查询结果中日期的格式化

    两种情况: 使用 Model 的查询 例如: $item = App\Models\Apple::first(); $date = $item->created_at->format('Y ...

  5. 性能测试十:jmeter进阶之webService与socket

    一.webService 1.添加http post请求2.添加header:Conent-type:text/xml Post请求的body中填写<soapenv:Envelope  xmln ...

  6. 将eclipse的maven项目导入到intellij idea中

    最近项目中需要用到idea,需要将原来的eclipse项目进行转移.捣鼓了半天终于成功了,在这里和大家分享下,希望对大家有所帮助,如有错误,欢迎指正. idea的确是一款很智能的开发工具,真的是爱不释 ...

  7. Excel学习笔记:if({1,0})用法

    一.if函数 判断是否满足条件,满足则返回第2个参数,不满足则返回第3个参数. 使用格式:=if(A1>0,"正","负") 二.if({1,0})用法 ...

  8. H 模拟水题

    n个人 小明编号为m 从编号为a的人开始数 起始数字为b 遇到素数duang 并反相 求小明应该说什么 Sample Input 310 2 //n m3 4 //a b3 32 64 13 8 Sa ...

  9. 学习C程序设计(一)第一节总览

    1.程序设计面向的问题 一切可计算问题都可以用程序的方法解决.ps:这样程序与计算有关了 1.1程序设计的五个步骤: a.确定问题可以计算:(问题是可计算) b.建立问题的数学模型:(不懂) c.设计 ...

  10. [SDOI2014]数数

    题解: 做过ac自动机上dp的这题应该就很容易想到了 首先在ac自动机上搞dp 表示当前考虑了i位,在自动机的j位上 然后转移就可以了 考虑限制 显然是一个数位dp 考虑位数小于n显然满足要求 考虑位 ...