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 ...
随机推荐
- Beta冲刺(3/4)
队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:学习了很多东西 Github签入记录 接下来的计划:继续学习 还剩下哪些任务:后端部分 燃尽图 遇到的困难:自己太菜了 收获和疑问: ...
- Android模拟器Genymotion安装使用教程详解
一.注册\登录 打开Genymotion官网,https://www.genymotion.com/ ,首先点击右上角的Sign in进行登录操作.如何登录就不细讲了,下面讲一下如何注册(备注:注册按 ...
- sshd_config参数说明
SSHD_CONFIG(5) OpenBSD Programmer's Manual SSHD_CONFIG(5)名称 sshd_config - OpenSSH SSH 服务器守护进程配置文件大纲 ...
- Flink状态管理和容错机制介绍
本文主要内容如下: 有状态的流数据处理: Flink中的状态接口: 状态管理和容错机制实现: 阿里相关工作介绍: 一.有状态的流数据处理# 1.1.什么是有状态的计算# 计算任务的结果不仅仅依赖于输入 ...
- linux tar包追加问题
只能已归档的文件才能追加文件. 如果tar.gz文件是如此生成:#tar -zcvf test.tar.gz a.txt即tar.gz是压缩(-z)和归档(-c)文件,则无法给它追加文件:若果tar ...
- Python 发送微信小程序的模板消息
在小程序的开发过程中,会存在模板消息的发送,具体文档见 这里,模板消息的发送是和语言无关的,这里将简要写一下怎么用 Python 给用户发送模板消息. 通过文档可以知道,发送的时候,需要使用小 ...
- javascript之typeof
定义和用法
- 设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)
登录 保存密码 安全 加密 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而我前一段时间正好稍微研究了一下,所以把我知道的告诉大家,节约大家查找资料的时间. 你 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- kafka的安装及使用(单节点)
介绍了linux环境下,kafka 服务的安装与配置 安装 jdk 环境 下载 kafka 源码包放到服务器,解压 开启 zookeeper 开启 kafka server 创建主题 开启生产者 开启 ...