主要内容:

/*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()传入参数值格式!的更多相关文章

  1. JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql

    JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...

  2. JAVAWEB实现增删查改(图书信息管理)之修改功能实现

    首先通过点击index.jsp页面的修改按钮,获取该行的id:↓ 其次,跳转到updateBooks.jsp页面进行修改信息,页面代码如下:↓ <%@ page import="Boo ...

  3. JAVAWEB实现增删查改(图书信息管理)之添加功能实现

    addBooks.jsp页面代码:↓ <%-- Created by IntelliJ IDEA. User: NFS Date: 2019-7-12 Time: 14:30 To change ...

  4. JavaWeb实现增删查改(图书信息管理)之删除功能实现

    —————————————————————————————————————————————————————————— 删除按钮对应的servlet -->DeleteBooks.java  ↓ ...

  5. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  6. 在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  7. [课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版

    (课本P273-任务九) /**DAO: Data Access Object * 为什么用: 实现功能的模块化,更有利于代码的维护和升级 * 是什么: 访问数据信息的类,包含对数据的CRUD(cre ...

  8. 2015.8.2 jdbc实现商品类的增删查改

    在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几 ...

  9. JDBC+Servlet+jsp(增删查改)

    先在mysql新增数据库和表先,把下面的几句代码复制去到mysql运行就可以创建成功了!  创建数据库 create database jdbc01 character set utf8 collat ...

随机推荐

  1. linux 下修改时间

    修改linux的时间可以使用date指令 date命令的功能是显示和设置系统日期和时间. 输入date 查看目前系统时间. 修改时间需要 date -功能字符 修改内容 命令中各选项的含义分别为: - ...

  2. extract()函数:用于从一个date或者interval类型中截取到特定的部分

    extract()函数:用于从一个date或者interval类型中截取到特定的部分 ### extract 语法extract ( { year | month | day | hour | min ...

  3. Beginning Linux Programming 学习--chapter 1 Getting start--What's linux,GNU,HeaderFiles, Libraries

    "文明的建立的不是机器而是思想" -- 托尔斯泰 Linux truly become a viable operating system, especially in the s ...

  4. CSS样式三种形式

    CSS基本表现形式只有三种:标签样式.Class类样式.ID样式 标签样式: 必须与HTML标签同名.仅仅影响同名标签 Class样式:可以在任何标签中使用: class="样式名" ...

  5. c语言求回文数的三种算法的描述

    c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...

  6. java使用poi操作word, 支持动态的行(一个占位符插入多条)和表格中动态行, 支持图片

    依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifa ...

  7. spring 条件化配置

    步骤一: 实现接口:org.springframework.context.annotation.Condition import org.springframework.context.annota ...

  8. Python Unittest进行接口测试的简单示例

    今年肯定是要把Python学到一定程度的,否则感觉自己混不下去了,那就开始半挣扎的咸鱼生活吧. ---------------------------------------------------- ...

  9. 【转发】Java split()用法

    特殊情况有 * ^ : | . \ 一.单个符号作为分隔符  String address="上海\上海市|闵行区\吴中路"; String[] splitAddress=addr ...

  10. win7 ReadyBoot 文件位置修改

    右键我的电脑,依次点开系统工具-性能-数据收集器集-系统-事件跟踪会话 在右边找到ReadyBoot,右键打开属性,会话框上方选择文件,根据示例文件名的路径找到ReadyBoot.etl文件,复制到你 ...