代码区

还是一个工具类

代码:

package cn.itcats.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//工具类 一个实例都不会有
public final class JdbcUtils {
// 优点修改的时候只需改这一处 私有对你以后类的演化有好处
private static String url = "jdbc:mysql://localhost:3306/test";
private static String user = "root";
private static String password = "123456";
private JdbcUtils() {

}

static {//放入静态代码块 只执行一次
try {// 优化的目的注册驱动只能进行一次
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}

}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, user, password);
}

public static void free(ResultSet rs,Statement st,Connection conn) {
try {
if(rs!=null)
rs.close();
}catch(SQLException e){
e.printStackTrace();
}finally {
try {
if(st!=null)
st.close();
}catch(SQLException e){
e.printStackTrace();
}finally {
if(conn!=null)
try {
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}

}

在这里我给        PreparedStatement   和   Statement   执行的时间做了比较      PreparedStatement  写法的优点较多

代码仅供参考:

package cn.itcats.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLInject {//C创建 R读取 U更新 D删除
public static void main(String[] args) throws Exception{
read1("Jack");
System.out.println("********************************");
read("Jack");
}

static void read1(String name) throws SQLException {
Connection conn = null;
/*
* 与Statement区别 程序修改引入PreparedStatement接口 做一些预处理 特殊字符过滤 系统的优化
* 解决SQl注入的问题
* 在不考虑SQl注入问题基础上 sql语句执行次数越多 那么PrepareStatement 效率较高(只有在数据库连接没有关闭的条件下)
*/
PreparedStatement ps = null;
ResultSet rs = null;
try {
//2建立连接 最耗时
conn = JdbcUtils.getConnection();
//3创建语句 不能用拼字符串的方式 很不安全
long start1 = System.currentTimeMillis(); //毫秒
String sql = "select id,name,birthday,money from user where name=?"; //and id=?and....
ps = conn.prepareStatement(sql);
ps.setString(1, name);
// 1,name 第一个问号替换 name
//4执行语句
System.out.println(sql);
rs = ps.executeQuery(); // 构造的时候已经给他了写不写sql都一样 不需要写sql

//5处理结果
while(rs.next()) { //行遍历
System.out.println( //四列 代码灵活性提高了
rs.getObject("id") + "\t" + rs.getObject("name") + "\t" +
rs.getObject("birthday") + "\t" + rs.getObject("money"));
}
long end1 = System.currentTimeMillis();
System.out.println("read1 " + (end1 - start1));


} finally {
JdbcUtils.free(rs, ps, conn);

}

}
static void read(String name) throws SQLException {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//2建立连接
conn = JdbcUtils.getConnection();
//3创建语句
long start = System.currentTimeMillis();
st = conn.createStatement();
//4执行语句
String sql = "select id,name,birthday,money from user where name='"
+ name + "'";

rs = st.executeQuery(sql);
//建议不要*不然会都查出来 可读性不好 写列名 维护成本低

//5处理结果
while(rs.next()) { //行遍历
System.out.println( //四列 代码灵活性提高了
rs.getObject("id") + "\t" + rs.getObject("name") + "\t" +
rs.getObject("birthday") + "\t" + rs.getObject("money"));
}
long end = System.currentTimeMillis();
System.out.println("read " + (end - start));


} finally {
JdbcUtils.free(rs, st, conn);

}
}
}

SQL注入,PreparedStatement和Statement的更多相关文章

  1. jdbc防止sql注入-PreparedStatement

    jdbc防止sql注入 jdbc防止sql注入-PreparedStatement public List getUserByName(String name,String password){    ...

  2. 利用PreparedStatement预防SQL注入

    1.什么是sql注入 SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为. 例如登录用户名采用  ' or 1=1 or username=‘,后台数据查询语句就变成 ...

  3. 1021上课演练----SQL注入与避免(银行系统)

    package com.bank; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Dat ...

  4. JAVA jdbc(数据库连接池)学习笔记(二) SQL注入

    PS:今天偶然间发现了SQL的注入...所以就简单的脑补了一下,都是一些简单的例子...这篇写的不怎么样...由于自己没有进行很深的研究... 学习内容: 1.SQL注入的概念...   所谓SQL注 ...

  5. Java学习之路- SQL注入

    用户名: __________ 密码:——————— 假如没有使用预处理的Statement 对象 拼接字符串查数据库的话,易收到sql注入攻击: 例如说 : mysql 中   #代表的是单行注释 ...

  6. Web安全篇之SQL注入攻击

    在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...

  7. sql注入二

    大家早上好!今天由我给大家带来<web安全之SQL注入篇>系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:        第一讲:“纸上谈兵:我们需要在本地架设注入环境,构造注 ...

  8. MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题

    JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...

  9. Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?

    问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...

  10. 在JDBC中使用PreparedStatement代替Statement,同时预防SQL注入

    本篇讲诉为何在JDBC操作数据库的过程中,要使用PreparedStatement对象来代替Statement对象. 在前面的JDBC学习中,对于Statement对象,我们已经知道是封装SQL语句并 ...

随机推荐

  1. app渗透测试 服务端篇

    基本知识 平时安装的应用位置,里面主要是odex可运行文件 /data/app 系统应用位置(需要root权限),里面主要是odex可运行文件 /system/app 应用的数据相关的位置,里面包含一 ...

  2. vue 树形数据增加属性并计算树节点的深度

    需求:在一组菜单树结构中转换数据结构(增加一些属性),并计算该树结构的节点深度. 实现util.js: function transferTreeData(arr, vm, list, level, ...

  3. 「POJ Challenge」生日礼物

    Tag 堆,贪心,链表 Solution 把连续的符号相同的数缩成一个数,去掉两端的非正数,得到一个正负交替的序列,把该序列中所有数的绝对值扔进堆中,用所有正数的和减去一个最小值,这个最小值的求法与「 ...

  4. Pytorch编程记录

    搭建网络的方式: 1.用sequential方式搭建,只能适用于线性网络 2.用forward和init方式搭建

  5. Stone Game, Why are you always there? HDU - 2999

    题目链接:https://vjudge.net/problem/HDU-2999 题意:有N堆石头,两个人交替取,每次只能取连续的k个石子,最后没有石子取得人输. 思路:如果我们每次取靠边的k个,那么 ...

  6. P1423_小玉在游泳(JAVA语言)

    题目描述 小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦. 已知小玉第一步能游2米,可是随着越来越累,力气越来越小, 她接下来的每一步都只能游出上一步距离的98%. 现在小玉想知道 ...

  7. Java系列教程-Spring 教程目录

    Spring 教程目录 可参考MyBatis的官方文档也比较清楚 https://mybatis.org/mybatis-3/zh/getting-started.html 代码 目录 https:/ ...

  8. Nacos 2.0 正式发布,性能提升 10 倍!!

    3月20号,Nacos 2.0.0 正式发布了! Nacos 简介: 一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. 通俗点讲,Nacos 就是一把微服务双刃剑:注册中心 + 配置中 ...

  9. Spring笔记(五)

    Spring 事务操作 一.事务(概念) 1. 什么是事务 事务是数据库的最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败,那么所有的操作都失败 典型场景: lucy转账100元给mary l ...

  10. MongoDB 那些事(一文以蔽之)

    前言 身边一直都有小伙伴在问:MongoDB到底是什么?它有到底什么特性?有什么与众不同?在什么情况下使用MongoDB最合适?以什么样的姿势是最好的?难道就一定要用吗?....说实话,这些问题都问到 ...