jdbc操作数据库以及防止sql注入
public class pr {
public static void main(String[] args) {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 加载驱动
// DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); 不用这种方法加载,因为源码里面已经有static代码块加载驱动了,直接加载类进内存就行了
Class.forName("com.mysql.cj.jdbc.Driver");
// 连接到数据库
conn = DriverManager.getConnection("jdbc:mysql://localhost/meiduo_mall","root","xxxxxx");
// 创建Statement对象
st = conn.createStatement();
// 执行查询,得到结果集
String sql = "select * from tb_goods_category";
rs = st.executeQuery(sql);
// 遍历查询每一条数据
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + "---" + name);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
JDBCutils.release(conn,st,rs); // 单独写一个工具类来释放资源
}
}
}
工具类:
public class JDBCutils {
public static void release(Connection conn,Statement st,ResultSet rs){
closeConn(conn);
closeSt(st);
closeRs(rs);
}
private static void closeRs(ResultSet rs){
try {
if (rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs = null;
}
}
public static void closeSt(Statement st){
try {
if (st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
st = null;
}
}
public static void closeConn(Connection conn){
try {
if (conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
上面的方法会有SQL注入的隐患。
解决方法:用PreparedStatement对象替换前面的Statement对象。PreparedStatement对象可以预先处理给定的SQL语句,在sql语句里面使用?占位符来替代后续要传递进来的变量。后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
public class pr2 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// 连接到数据库
conn = DriverManager.getConnection("jdbc:mysql://localhost/meiduo_mall","root","480916");
// 创建Statement对象
String sql = "select * from tb_goods_category where id=?";
ps = conn.prepareStatement(sql);
ps.setInt(1,1);
// 执行查询,得到结果集
rs = ps.executeQuery();
// 遍历查询每一条数据
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + "---" + name);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
JDBCutils.release(conn,ps,rs); // 单独写一个工具类来释放资源
}
}
}
jdbc操作数据库以及防止sql注入的更多相关文章
- jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件
day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一 ...
- 用于JDBC操作数据库的公共类
/* * @(#)CommonSql.java 2011-9-5 * * Copyright 2011 Bianjing,All rights reserved. */ import java.sql ...
- JDBC中的PreparedStatement-防止SQL注入攻击
在JDBC对数据库进行操作的时候,SQL注入是一种常见的针对数据库的注入攻击方式.如下面的代码所演示,在我们的提交字段中掺入了SQL语句,会使得程序的登录校验失效: package org.lyk.m ...
- Spring入门(十五):使用Spring JDBC操作数据库
在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...
- JDBC操作数据库的学习(2)
在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本 ...
- JDBC操作数据库的学习(1)
单单对数据库的操作,比如说MySQL,我们可以在命令行窗口中执行,但是一般是应用程序要操作数据库,因此我们应该在程序中的代码上体现对数据库的操作,那么使用程序应用如何操作数据库呢?那就要使用到数据库的 ...
- 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷
原文:通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEcl ...
- JDBC操作数据库的三种方式比较
JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...
- Spark Streaming通过JDBC操作数据库
本文记录了学习使用Spark Streaming通过JDBC操作数据库的过程,源数据从Kafka中读取. Kafka从0.10版本提供了一种新的消费者API,和0.8不同,因此Spark Stream ...
随机推荐
- BZOJ1911:[Apio2010]特别行动队——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1911 又是一个显然的dp……好吧我懒得讲了. s[i]是战斗力前缀和. 我们仍然设k<j< ...
- BZOJ2005:[Noi2010]能量采集——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2005 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光 ...
- 003.关于数组的操作 [growing]
1.获取数组的长度 #include<iostream> using namespace std; template<class T> int length(T& ar ...
- SpringMVC 用注解Annotation驱动的IoC功能@Autowired @Component
转载自:http://blog.csdn.net/lufeng20/article/details/7598564 本文分为三个部分:概述.使用注解进行属性注入.使用注解进行Bean的自动定义. 一, ...
- canvas知识03:学写一个字案例
效果
- C11性能之道:转移和转发
1.move C++11中可以将左值强制转换为右值,从而避免对象的拷贝来提升性能.move将对象的状态或者所有权从一个对象转移到另一个对象,没有内存拷贝.深拷贝和move的区别如图: 从图可以看出,深 ...
- centos6.8配置FTP普通用户除了家目录外还能访问其他目录
今天有个需求,使用ftp服务搭建一个文件共享服务器,每个普通用户除了能访问自己家目录的东西,还能访问一个公共的目录.配置步骤如下: 环境如下: 创建用户并配置密码(使用默认家目录/home) user ...
- bzoj 2957: 楼房重建 ——线段树
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 【Luogu】P3930 SAC E#1 - 一道大水题 Knight
[题目]洛谷10月月赛R1 提高组 [题意]给定n*n棋盘和<=16个棋子,给几个棋子种类和攻击范围,现我方只有一马,求能否吃王. [算法]状压+BFS [题解]16种棋子中,马不能吃马,直接处 ...
- python学习笔记(四)之分支和循环
python中比较操作符有: > >= < <= == != 这些操作符返回True或False 1 >>> 1 < 3 2 True 3 >&g ...