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注入的更多相关文章

  1. jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

    day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一 ...

  2. 用于JDBC操作数据库的公共类

    /* * @(#)CommonSql.java 2011-9-5 * * Copyright 2011 Bianjing,All rights reserved. */ import java.sql ...

  3. JDBC中的PreparedStatement-防止SQL注入攻击

    在JDBC对数据库进行操作的时候,SQL注入是一种常见的针对数据库的注入攻击方式.如下面的代码所演示,在我们的提交字段中掺入了SQL语句,会使得程序的登录校验失效: package org.lyk.m ...

  4. Spring入门(十五):使用Spring JDBC操作数据库

    在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...

  5. JDBC操作数据库的学习(2)

    在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本 ...

  6. JDBC操作数据库的学习(1)

    单单对数据库的操作,比如说MySQL,我们可以在命令行窗口中执行,但是一般是应用程序要操作数据库,因此我们应该在程序中的代码上体现对数据库的操作,那么使用程序应用如何操作数据库呢?那就要使用到数据库的 ...

  7. 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷

    原文:通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEcl ...

  8. JDBC操作数据库的三种方式比较

    JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...

  9. Spark Streaming通过JDBC操作数据库

    本文记录了学习使用Spark Streaming通过JDBC操作数据库的过程,源数据从Kafka中读取. Kafka从0.10版本提供了一种新的消费者API,和0.8不同,因此Spark Stream ...

随机推荐

  1. 存储引擎(Mysql)

    最常使用的2种存储引擎:1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam.每个MyISAM在磁盘上存储成三个文件.文件名都和表名相同, ...

  2. POJ2942:Knights of the Round Table——题解

    http://poj.org/problem?id=2942 所写的tarjan练习题最难的一道. 说白了难在考得不是纯tarjan. 首先我们把仇恨关系处理成非仇恨关系的图,然后找双连通分量,在双连 ...

  3. BZOJ5322:[JXOI2018]排序问题——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5322 https://loj.ac/problem/2543 <-可以看数据,要没有这数据我 ...

  4. BZOJ3926:[ZJOI2015]诸神眷顾的幻想乡——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 https://www.luogu.org/problemnew/show/P3346 幽香 ...

  5. BZOJ2761 不重复的数字 【treap】

    2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 5517  Solved: 2087 [Submit][S ...

  6. jQuery考试

    No1: 分析:首先A答案是正确的jQuery中删除元素的方法有a,c,d所以排除B,另外c是清空,d虽然能删除但是不能删除元素所绑定的事件等等. No2: 分析:A是正确的通过get(index)的 ...

  7. 史上最全Linux提权后获取敏感信息方法

    http://www.freebuf.com/articles/system/23993.html 在本文开始之前,我想指出我不是专家.据我所知,在这个庞大的区域,没有一个“神奇”的答案.分享,共享( ...

  8. mysql 集群+主从同步

    SQL节点: 给上层应用层提供sql访问. 管理节点(MGM):  管理整个集群. 启动,关闭集群. 通过ndb_mgmd命令启动集群 存储/数据节点: 保存cluster中的数据.  数据节点,可以 ...

  9. EurekaServer集群配置

    一.程序配置 1.pom添加依赖: <dependency> <groupId>org.springframework.cloud</groupId> <ar ...

  10. 如何使用Navicat连接Oracle

    1.Navicat连接Oracle,需要使用OCI库.因此先要安装Oracle提供的客户端instantclient-basic, 请注意,32位的Navicat需要下载配置32位的instantcl ...