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 ...
随机推荐
- Nginx负载均衡-如何自定义URL中的hash key2
upstream backend1 { server 192.168.3.236:555; server 192.168.3.236:222; ...
- List<E>
List<E>——列表 有序,存储和读取的顺序是一致的 由整数索引 允许重复 add(int index,E element)——将元素插入指定位置 get(int index)——获取指 ...
- java多线程中篇(二) —— 线程的创建和Synchronized锁关键字
学习之前,先了解线程状态图 说明:线程共包括以下5种状态. 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread ...
- CentOS 7.6出现SSH登录失败的解决方法
CentOS 7.6出现SSH登录失败的解决方案 问题重现: iterm登录 ssh vagrant@192.168.10.10 The authenticity of host '192.168.1 ...
- [C++] 例题 2.7.1 用栈实现简易计算器
目录 前置技能 栈 (stack) 中缀表达式 (InfixExp) 与后缀表达式 (PostfixExp) 需求描述 概要设计 函数详细设计 中缀转后缀 infix_to_postfix(strin ...
- C++实现2048小游戏
代码如下: #define _CRT_SECURE_NO_WARNINGS//去掉编译器内部扩增问题 #include<stdio.h> #include<stdlib.h> ...
- 随记sqlserver学习笔记(一)
create database testuse test --部门表create table department( dept_id int not null identity primary key ...
- 接口缓存--把接口放在redis数据库中,减少访问量
针对访问量大,且数据较固定的接口,建议建立接口缓存,建立了缓存之后,不会再直接去访问接口了. 比如下面的轮播图接口,每刷新一下首页都会访问一下轮播图接口,所以我们用接口缓存来处理,减少访问量. 视图模 ...
- PAT(B) 1077 互评成绩计算(Java)
题目链接:1077 互评成绩计算 (20 point(s)) 题目描述 在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这 ...
- jdk 8 特性
date相关: 1.在jdk 8之前,由于Date,Calendar的烂设计(烂的原因:日期计算复杂,Date没有时区),催生了一个优秀的第三方时间框架:Joda-Time(解决了:日期的计算,时区) ...