JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!
主要内容:
/*SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime());
熟悉了使用PreparedStatement的优势,没有使用封装和使用封装的方法进行实现了;
以及JDBCTools新增update_sql(String sql,Object...args) 和query_sql(String sql,Object...args)两个功能模块,分别实现了SQL的update和select的功能.
了解了sql注入,以及实现了模拟注入和PreparedStatement阻止注入的样例.
PreparedStatement的使用步骤:
1.创建PreparedStatement,创建同时传入一个sql
* String sql="insert into examstudent values(?,?,?)";
* //2.调用PreparedStatement 的setXXX(int index,Object val)设置占位符的值,
* Index从1开始,
* //3.使用方法执行SQL语句: 执行 查询 或者 升级 : executeQuery() 或executeUpdate()
* //因此,省略了SQl语句
1 使用PreparedStatement, 没有使用封装和使用封装的方法进行实现
package day_19;
import org.junit.Test; import java.sql.Connection;
import java.sql.PreparedStatement;
/*
SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime());
*/
/**PreparedStatement 优势:减轻sql语句的大量书写,
* 1/是Statement的子接口,可以使用其所有方法
* 2/可以传入带占位符的SQL语句,并且提供了补充占位符变量的方法.
* 3/可以有效地防止SQL注入!
* 4/提高性能,使用一次就编译好了sql母句,节省时间;
* --------------------
* //1.创建PreparedStatement,创建同时传入一个sql
* String sql="insert into examstudent values(?,?,?)";
* //2.调用PreparedStatement 的setXXX(int index,Object val)设置占位符的值,
* Index从1开始,
* //3.使用方法执行SQL语句: 执行 查询 或者 升级 : executeQuery() 或executeUpdate()
* //因此,省略了SQl语句
*/
public class testPreparedStatement {
@Test //使用封装进JDBCTools的update_sql(sql,args1)的方法进行测试;最后直接进行preparedStatement.executeUpdate();
public void test1(){
String sql="insert into author(id,author_name,nation,second_nation) " +
"values(?,?,?,?)";
Object args1[]=new Object[]{4,"刘慈欣","北京","河北"};
Object args2[]=new Object[]{5,"瑞","元星","阿斯加特"};
JDBCTools.update_sql(sql,args1);
JDBCTools.update_sql(sql,args2);
} //没有使用封装的方法进行
public void test2(){
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
connection=JDBCTools.getConnection();
String sql="insert into author(id,author_name,nation) " +
"values(?,?,?,?)";
preparedStatement =connection.prepareStatement(sql);
preparedStatement.setInt(1, 3);
preparedStatement.setString(2, "山枫叶纷飞233");
preparedStatement.setString(3, "中国");
//执行Update更新语句
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null,preparedStatement,connection);
}
} }
2 JDBC的工具类
package day_19;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties; /**操纵JDBC的工具类,其中封装了一些工具方法
* Version 1 : getConnection() : 通过读取配置文件从数据库服务器获取一个连接;
* Version 2 : release() : 关闭数据库资源的ResultSet/Statement/Statement
* Version 3 : update_sql() : 添加preparedStatement的select的sql的方法
* Version 4: query_sql() : 执行preparedStatement的的查询操作!
*/
public class JDBCTools {
/*** 执行sql 语句,使用Preparedstatement
* @param sql
* @param args
*/
public static void update_sql(String sql,Object...args){//添加preparedStatement的update更新sql的方法,同理可以实现 : 增删改
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
connection = JDBCTools.getConnection();
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
preparedStatement.setObject(i+1, args[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
release(null,preparedStatement ,connection);
}
} //添加preparedStatement的select的sql的方法
public static void query_sql(String sql,Object...args){//执行preparedStatement的的查询操作!
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
connection = JDBCTools.getConnection();
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
preparedStatement.setObject(i+1, args[i]);
}
ResultSet resultSet=null;
resultSet=preparedStatement.executeQuery();//执行查询操作!
if(resultSet.next())
System.out.println("RsultSet查询已经就绪!");
else
System.out.println("数据表为空或者404!");
} catch (Exception e) {
e.printStackTrace();
} finally {
release(null,preparedStatement ,connection);
}
}
public static void release(ResultSet rs,Statement statement, Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e2) {
e2.printStackTrace();
}
}
}
public static Connection getConnection() throws Exception{
//1.准备数据库的连接的四个字符串
String driverClass=null,jdbcUrl=null,user=null,password=null;
//jdbc:mysql:///books ;也可以将localhost省略掉!
//2.读取类路径下的jdbc.properties 文件
InputStream in=
JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties =new Properties();
properties.load(in);
driverClass =properties.getProperty("driver");
jdbcUrl=properties.getProperty("jdbcUrl");
user = properties.getProperty("user");
password = properties.getProperty("password");
//3.加载数据库驱动程序(注册驱动),driver对应的实现类中有注册驱动的静态代码块
// Class.forName(driverClass); //
//或这么手动加载,也可以注册多个数据库连接的代码块
//DriverManager.registerDriver( Class.forName(driverClass).newInstance()); //4.通过DriverManager 的getConnection()方法获取数据库连接。
Connection connection=DriverManager.getConnection(jdbcUrl,user,password);
System.out.print(connection); //com.mysql.jdbc.JDBC4Connection@19e1023e return connection;
}
}
3 testSQLInjection
package day_19; import org.junit.Test; import javax.swing.text.DocumentFilter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement; public class testSQLInjection {
/**使用
*
*/
@Test //因为匹配结果恒真,就可以进行SQL注入!使用PreparedStatement可以避免这个问题!
public void testSQLInjection(){
String username = "a' OR PASSWORD = ";
String password = " OR '1'='1"; String sql = "SELECT * FROM users WHERE username = '" + username
+ "' AND " + "password = '" + password + "'"; System.out.println(sql);
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null; try {
connection=JDBCTools.getConnection();
statement=connection.createStatement();
resultSet=statement.executeQuery(sql);
if(resultSet.next())
System.out.println("登陆成功!");
else
System.out.println("404 ! ");
/*******/
System.out.println("PreparedStatement测试结果为:");
String sql2 = "SELECT * FROM users WHERE username = ? AND password = ?";
JDBCTools.query_sql(sql2,username,password); } catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(resultSet, statement,connection );
} }
}
JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!的更多相关文章
- JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql
JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...
- JAVAWEB实现增删查改(图书信息管理)之修改功能实现
首先通过点击index.jsp页面的修改按钮,获取该行的id:↓ 其次,跳转到updateBooks.jsp页面进行修改信息,页面代码如下:↓ <%@ page import="Boo ...
- JAVAWEB实现增删查改(图书信息管理)之添加功能实现
addBooks.jsp页面代码:↓ <%-- Created by IntelliJ IDEA. User: NFS Date: 2019-7-12 Time: 14:30 To change ...
- JavaWeb实现增删查改(图书信息管理)之删除功能实现
—————————————————————————————————————————————————————————— 删除按钮对应的servlet -->DeleteBooks.java ↓ ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- [课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版
(课本P273-任务九) /**DAO: Data Access Object * 为什么用: 实现功能的模块化,更有利于代码的维护和升级 * 是什么: 访问数据信息的类,包含对数据的CRUD(cre ...
- 2015.8.2 jdbc实现商品类的增删查改
在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几 ...
- JDBC+Servlet+jsp(增删查改)
先在mysql新增数据库和表先,把下面的几句代码复制去到mysql运行就可以创建成功了! 创建数据库 create database jdbc01 character set utf8 collat ...
随机推荐
- 2019年Java面试题基础系列228道(5)
21.存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为C 么?如 C = (C) B: 这属于强制类型转换,如果被转换的B实例不是C类型,会有异常 比如你的ABC分别对应动物,猫,黑猫. ...
- hdu 2167 题解
题目 题意 一个数字正方形(所有数都是两位的正整数),取了一个数后,它的周围 $ 8 $ 个数都不能被选,问最大取数总和. 注意数据范围 $ 3=< n <=15 $ 我们可能一开始会去想 ...
- python基础 — CSV 数据处理
什么是csv 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本) 编码: encode ...
- DRF+Vue项目(一)——项目架构
永久配置安装源 为了加速模块的下载 1.文件管理器文件路径地址栏敲:%APPDATA% 回车,快速进入 C:\Users\电脑用户\AppData\Roaming 文件夹中 2.新建 pip 文件夹并 ...
- WUSTOJ 1325: Distance(Java)坐标计算
题目链接:1325: Distance Description There is a battle field. It is a square with the side length 100 mil ...
- java之aop使用及自定义注解
目的: 1.Java注解简介 2.Java元注解(重点) 3.自定义注解 案例一(获取类与方法上的注解值) 案例二(获取类属性上的注解属性值) 案例三(获取参数修饰注解对应的属性值) 4.Aop自定义 ...
- JPA逆向工程
1.1 说明 所谓的逆向工程就是通过数据库的结构生成代码. 目的:提高开发的效率 1.2 步骤 1.2.1 第一步:创建JPA项目 (1)创建项目 (2)指定项目名.JPA版本 (3)完成创建 1.2 ...
- 关于memset的赋值(最大值最小值的选择)
memset赋值赋的是ASSCII码转为二进制赋值 比如 memset(,0xff,sizeof()),0xff转为二进制11111111,int为4字节所以最后为111111111111111111 ...
- 表单送件按钮代码(一)cs(C#)(未完)
protected void BtnRequest_Clich(object sender, EventArgs e) { lblMsg.Text= " " ; lblfmsg.T ...
- Visual Studio中找不到.Net Core SDK
在win 7 64位上安装了.Net Core 2.1 x86 SDK后,又卸载重新安装了.Net Core 3/2 x64 SDK.结果在VS中新建项目时没有.Net Core 3.1 SDK. 在 ...