Statement的子接口,预编译SQL,动态SQL

功能比爹强大

用来解决SQL注入的

预编译SQL:参数使用?作为占位符,执行SQL的时候给?赋上值就可以了

使用步骤:

1.导入驱动jar包
  复制jar包,粘贴到libs文件夹下。文件名可以任意,一般就叫libs
  选择复制的jar包,右键,点击Add As Library
2.注册驱动
3.获取数据库的连接对象 Connection(本地的java代码和数据库的桥梁对象)
4.定义SQL语句
  ①参数使用?作为占位符。例如:select * from user where username=? and password = ?;
5.获取执行SQL语句的对象 PreparedStatement Connection.prepareStatement(String sql)
6.给?赋值

7.执行SQL,接收返回结果,不需要传递SQL语句了(传递SQL语句时它父类Statement的方法,这个是子类特有的)
8.处理结果
9.释放资源

不使用Statement

prepareStatement(String sql)
创建参数化的SQL语句发送到数据库的 PreparedStatement对象。


SQL注入

SQL注入:通过操作输入来修改SQL语句
在上个练习中,会产生SQL注入问题

①用户名随便输

②密码输入

  

例如:

表中就没有那个用户名和密码

查看SQL语句执行效果:

(利用输入的bug,把输入的密码,转换为一个判断)
会把所有的用户名密码查询出来

解决上次练习的SQL注入

package cn.itcast.jdbc;

import cn.itcast.util.JDBCUtils;

import java.sql.*;
import java.util.Scanner; public class JdbcDemo11 { public static void main(String[] args) {
//1.键盘录入,接收用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入密码");
String password = sc.nextLine(); //2.调用方法login,因为不是静态方法,所以要创建对象
boolean flag = new JdbcDemo11().login2(username, password); //3.判断结果,输出同语句
if (flag){
System.out.println("登录成功");
}else {
System.out.println("登录失败,用户名或密码错误");
}
} /**
* 登录方法,PreparedStatement实现
*/
public boolean login2(String username, String password) {
if (username == null || password == null) {//如果有一个为空就不用去连接数据库,做操作
return false;
}
//连接数据库是否判断成功
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//1.获取数据库连接
conn = JDBCUtils.getConnection();
//2.定义SQL
String sql = "select * from user where username= ? and password = ?;";
//3.获取执行SQL的对象
pstmt = conn.prepareStatement(sql);
//给?赋值
pstmt.setString(1,username);
pstmt.setString(2,password); //4.执行查询,不需要传参数
rs = pstmt.executeQuery();
//5.判断
/* if (rs.next()){//不用这样写rs.next()返回的就是true,false
return true;
}else {
return false;
}*/
return rs.next();//如果有下一行返回true } catch (SQLException e) {
e.printStackTrace();
} finally {//释放资源
JDBCUtils.close(rs, pstmt, conn);
} return false;
}
}

JDBC——PreparedStatement执行SQL的对象的更多相关文章

  1. JDBC——Statement执行SQL语句的对象

    Statement该对象用于执行静态SQL语句并返回它产生的结果.表示所有的参数在生成SQL的时候都是拼接好的,容易产生SQL注入的问题 PreparedStatement对象是一个预编译的SQL语句 ...

  2. Java JDBC下执行SQL的不同方式、参数化预编译防御

    相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...

  3. JDBC中执行SQL语句的方式

    一.执行DDL.DML语句 DDL.DML分别表示数据库定义语言.数据库操纵语言,操控这两种语言应该使用Statement对象的executeUpdate方法. 代码如下: public static ...

  4. JDBC进阶之PreparedStatement执行SQL语句(MySQL)

    一.什么是PreparedStatement           参阅Java API文档,我们可以知道,PreparedStatement是Statement的子接口(如图所示),表示预编译的 SQ ...

  5. PreparedStatement执行sql語句

    import com.loaderman.util.JdbcUtil; import java.sql.Connection; import java.sql.PreparedStatement; i ...

  6. JDBC方式执行SQL,支持CRUD返回LIST

    背景: 用惯了Mybatis,接收一个老项目使用Hibernate,特别不习惯.新的功能需要系统后台定时执行任务,顾使用JDBC封装工具类执行 源代码 import java.sql.Connecti ...

  7. 使用预处理PreparedStatement执行Sql语句

    /** * 使用预处理的方式执行Sql * @param sql Sql语句 * @param obj 变量值数组 * @return 查询结果 * @throws SQLException */ p ...

  8. jdbc批量执行SQL insert 操作

    package com.file; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayLi ...

  9. 使用PreparedStatement执行SQL语句时占位符(?)的用法

    1.Student数据库表 ID  name gender       2.Java代码 public static void main(String[] args) { int _id=1; Str ...

随机推荐

  1. C++ Primer 抄书笔记(一)

    操作系统通过调用main函数(function)来运行C++程序: int main(){ ; } main函数返回类型必为int.大多数系统中main的返回值被用来指示状态.0即成功:非0由系统定义 ...

  2. Redis-异步消息

    关于异步消息,大家都知道,如下: 这些用起来都是比较复杂的,RabbitMQ先要创建Exchange,在创建Queue,还要将Queue和Exchange通过某种规则绑定起来.发消息之前要指定rout ...

  3. 【DTOJ】2703:两个数的余数和商

    DTOJ 2703:两个数的余数和商  解题报告 2017.11.10 第一版 ——由翱翔的逗比w原创,引用<C++ Primer Plus(第6版)中文版> 题目信息: 题目描述 给你a ...

  4. IDEA创建mybatisDemo,并实现简单的CRUD

    Mybatis 是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.在Java或者Java Web项目中,添加Mybatis必须的核心包,就能对数据表进行增删改查操作了.下面以MySQL数据库o ...

  5. vuex的state在组件选项data和computed上引用的区别

    引用在vue组件的data选项,不因数值被改变而更新引在在vue组件的computed选项,因数值变化而更组件 案例代码如下,调整下引用vue和vuex地址即可展示 <!DOCTYPE html ...

  6. mysql-主从备份问题小结

    一:防火墙 常用命令 firewall-cmd --state 或 systemctl status firewalld # 查看状态 systemctl start firewalld# 启动 sy ...

  7. node post 大数据无响应超时

    使用 express 框架,post 较大数据量(富文本,里面包含了图片base64数据,大约300k)时,node 无响应,把数据内容减少后能顺利提交. 是因为数据量大过body post 的限制导 ...

  8. [Linux] git add时的注意事项

    git add -A  提交所有变化 git add -u  提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) git add .  提交新文件(new)和被修改( ...

  9. 小白的java学习之路 “ 二重循环”

    二重循环: 1.什么是二重循环: 一个循环体内又包含另一个完整的循环结构 语法: while(循环条件1) { //循环操作1 while(循环条件2) { //循环操作2 } } do { //循环 ...

  10. 再访JavaScript对象(原型链和闭包)

    一:原型链简介 JavaScript通常被描述为基于原型的语言 (从继承机制的角度)- 为了提供继承,对象(注意:区别于实例)可以拥有一个原型对象,它充当一个模板对象,它继承了方法和属性.对象的原型对 ...