JDBC2(防止sql注入,数据库连接池)

防止SQL注入

sql注入:利用sql语句的语法特点,应用层输入特殊格式,让原有的sql语句失效

创建表结构 并加入数据

create table login(lid int primary key auto_increment,lname varchar(20),lpwd varchar(20),lsex varchar(2),laddr varchar(50)
);
insert into login(lname,lpwd,lsex,laddr)
values('zhangsan','123456','男','西安北大街');

正常写法:

public static void main(String[] args) throws ClassNotFoundException, SQLException {Scanner input = new Scanner(System.in);// 1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT","root", "123456");System.out.println("请输入账号");String uname = input.next();System.out.println("请输入密码");String upwd = input.next();// 3.sqlString sql = "select * from login where lname ='" + uname + "' and lpwd=' " + upwd + "'";Statement statement = conn.createStatement();// 不能防止sql注入ResultSet rs = statement.executeQuery(sql);// 4.执行sql语句if (rs.next()) {int lid = rs.getInt("lid");String lname = rs.getString("lname");String lpwd = rs.getString("lpwd");String lsex = rs.getString("lsex");String laddr = rs.getString("laddr");System.out.println(lid + lname + lpwd + lsex + laddr);} else {System.out.println("登录失败");}}

防止sql注入:

public static void main(String[] args) throws ClassNotFoundException, SQLException {Scanner input = new Scanner(System.in);// 1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT","root", "123456");System.out.println("请输入账号");String uname = input.next();System.out.println("请输入密码");String upwd = input.next();//		// 3.sql
//		String sql = "select * from login where lname ='" + uname + "' and lpwd=' " + upwd + "'";
//		Statement statement = conn.createStatement();// 不能防止sql注入
//		ResultSet rs = statement.executeQuery(sql);// 防止sql注入 -- 利用sql语句的语法特点,应用层输入特殊格式,让原有的sql语句失效// 1.sql语句要变 -- 参数位置要使用 ?占位String sql = "select * from login where lname =? and lpwd =?";// 2. 执行对象要变 -- 预处理sql语句PreparedStatement prepareStatement = conn.prepareStatement(sql);// 3.给sql语句传参prepareStatement.setObject(1, uname);prepareStatement.setObject(2, upwd);ResultSet rs = prepareStatement.executeQuery();// 4.执行sql语句if (rs.next()) {int lid = rs.getInt("lid");String lname = rs.getString("lname");String lpwd = rs.getString("lpwd");String lsex = rs.getString("lsex");String laddr = rs.getString("laddr");System.out.println(lid + lname + lpwd + lsex + laddr);} else {System.out.println("登录失败");}}

使用PreparedStatement的优点:

  • 安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。
  • 语法不同:PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql
  • 效率不同:对于更改参数的同一SQL语句,PreparedStatement可以使用sql缓存区,效率比Statment高

数据库连接池

其实就是一个容器(集合),存放数据库连接的容器。

当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

优点:

    节约资源用户访问高效

实现:

  1. 标准接口:DataSource javax.sql包下的

    方法:
    

获取连接:getConnection()

归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接。

  1. 一般我们不去实现它,有数据库厂商来实现
  • C3P0:数据库连接池技术
  • Druid:数据库连接池实现技术,由阿里巴巴提供的

C3P0数据库连接池技术

  1. *导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
    **** 不要忘记导入数据库驱动jar包

  1. 定义配置文件

名称: c3p0.properties 或者 c3p0-config.xml文件名称不可以修改

路径:直接将文件放在src目录下即可,路径不可修改

<c3p0-config><!-- 使用默认的配置读取连接池对象 --><default-config><!-- 连接参数 --><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://127.0.0.1/db6?serverTimezone=GMT</property><property name="user">root</property><property name="password">12345678</property><!-- 连接池参数 --><!-- 初始化连接数 --><property name="initialPoolSize">5</property><!-- 最大连接数 --><property name="maxPoolSize">10</property><!-- 超时时间:当连接池耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --><property name="checkoutTimeout">3000</property></default-config><named-config name="otherc3p0"><!-- 连接参数 --><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://127.0.0.1/db5?serverTimezone=GMT</property><property name="user">root</property><property name="password">12345678</property><!--   连接池参数 --><!-- 初始化连接数 --><property name="initialPoolSize">5</property><!-- 最大连接数 --><property name="maxPoolSize">8</property><!-- 超时时间:当连接池耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --><property name="checkoutTimeout">3000</property></named-config>
</c3p0-config>
  1. 创建核心对象 数据库连接池对象 ComboPooledDataSource
  2. 获取连接: getConnection
package c3p0_conn_pool;import java.sql.Connection;
import java.sql.SQLException;import com.mchange.v2.c3p0.ComboPooledDataSource;public class Test01 {// c3p0数据库连接池对象static ComboPooledDataSource datasource = null;public static void main(String[] args) throws SQLException {// 创建连接池对象datasource = new ComboPooledDataSource();// 基础参数配置datasource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/db6?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8");datasource.setUser("root");datasource.setPassword("12345678");// 设置连接池的配置参数datasource.setInitialPoolSize(3);// 初始化连接对象
//		datasource.setMinPoolSize(2);// 最小连接数量datasource.setMaxPoolSize(10);// 最大连接池数量datasource.setCheckoutTimeout(3000);// 等待时间(单位:毫秒)for (int i = 1; i <= 11; i++) {Connection connection = datasource.getConnection();System.out.println(connection);if (i == 5) {connection.close();// 将连接对象归还给连接池,进行复用}}}
}

package c3p0_conn_pool;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;public class Test02 {static DataSource dataSource = null;public static void main(String[] args) throws SQLException {// 1.创建连接池对象dataSource = new ComboPooledDataSource();
//		for (int i = 1; i <= 11; i++) {// 2.获取连接对象
//			Connection connection = dataSource.getConnection();
//			System.out.println(connection);
//			if (i == 5) {
//				connection.close();// 将连接对象归还给连接池,进行复用
//			}
//		}// 2.获取连接对象Connection conn = dataSource.getConnection();System.out.println(conn);PreparedStatement pre = conn.prepareStatement("select * from emp");ResultSet resultSet = pre.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getInt(1));}}
}
package c3p0_conn_pool;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;public class Test03 {static DataSource dataSource = null;public static void main(String[] args) throws SQLException {// 1.创建连接池对象dataSource = new ComboPooledDataSource("otherc3p0");// 2.获取连接对象Connection conn = dataSource.getConnection();System.out.println(conn);PreparedStatement pre = conn.prepareStatement("select * from emp");ResultSet resultSet = pre.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getInt(1));}}
}

Druid:数据库连接池实现技术,由阿里巴巴提供的

  1. 导入jar包 druid-1.0.9.jar

  1. 定义配置文件

是properties形式的

可以叫任意名称,可以放在任意目录下

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db6?serverTimezone=GMT
username=root
password=12345678
initialSize=5
maxActive=10
maxWait=3000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
  1. 加载配置文件。Properties
  2. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
  3. 获取连接:getConnection
package druid_conn_pool;import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid.pool.DruidDataSourceFactory;public class Test01 {public static void main(String[] args) throws Exception {//1.导入jar包//2.定义配置文件//3.加载配置文件Properties properties = new Properties();properties.load(Test01.class.getResourceAsStream("/druid.properties"));//4.获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);//5.获取数据库连接ConnectionConnection connection = dataSource.getConnection();System.out.println(connection);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot多线程

永线程池就不会内存泄漏&#xff0c;否则一直创建线程了&#xff08;如果业务量大很危险了&#xff0c;中断报警…&#xff1f;&#xff09; 【EnableAsync实现异步任务&#xff0c;简单用法】-CSDN博客 两种方法: 1、在启动类上加EnableAsync注解(Async默认的线程池是Simpl…

Linux——五种IO模型

目录 一IO基本理解 二五种IO模型 1五种IO模型示意图 2同步IO和异步IO 二非阻塞IO 1fcntl 2实现非阻塞IO 三多路复用 1select 1.1定位和作用 1.2介绍参数 1.3编写多路复用代码 1.4优缺点 2poll 2.1作用和定位 2.2介绍参数 2.3修改select代码 3epoll 3.1介绍…

[论文阅读]SimCSE: Simple Contrastive Learning of Sentence Embeddings

SimCSE&#xff1a;句子嵌入的简单对比学习 SimCSE: Simple Contrastive Learning of Sentence Embeddings http://arxiv.org/abs/2104.08821 EMNLP 2021 文章介绍了SimCSE&#xff0c;这是一种简单的对比学习框架&#xff0c;采用了自监督来提升模型的句子表示能力 而自监…

【网络原理】——图解HTTPS如何加密(通俗简单易懂)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;HTTP为什么不安全 二&#xff1a;HTTPS加密过程 1&#xff1a;密码学中的概念 &…

apt的编译安装(古老通讯)

Ubuntu系统的防火墙关闭&#xff1a; ufw disable 第一步&#xff1a;Ubuntu 安装依赖环境 apt -y install libpcre3-dev zlib1g-dev libssl-dev build-essential 如果出现无法下载则在末尾处假如 --fix missing如下图所示 出现下图则为安装成功 第二步&#xff1a; useradd…

上市公司企业数字金融认知数据集(2001-2023年)

一、测算方式&#xff1a;参考C刊《经济学家》王诗卉&#xff08;2021&#xff09;老师的做法&#xff0c;数字金融认知使用每万字年报描述中包含的对数字金融相关关键词的提及次数&#xff0c;关键词为&#xff1a;互联网、数字化、智能、大数据、电子银行、金融科技、科技金融…

LivePortrait——生成可拼接和重定向控制的高效肖像动画翻译

文章目录 原文翻译Abstract1. Introduction2. Related Work2.1. Non-diffusion-based Portrait Animation2.2. Diffusion-based Portrait Animation 3. Methodology3.1. Preliminary of Face Vid2vid3.2. Stage I: Base Model Training3.3. Stage II: Stitching and Retargetin…

快来免费参加交通领域重量级会议:第十三届交通运输研究(上海)论坛

一、会议简介 交通运输研究&#xff08;上海&#xff09;论坛&#xff08;简称为TRF&#xff09;是按照国际会议的组织原则&#xff0c;为综合交通运输领域学者们构建的良好 合作交流平台。交通运输研究&#xff08;上海&#xff09;论坛已经成功举办了十二届&#xff0c;凝聚了…

zabbix 6.0 监控clickhouse(单机)

zabbix 6.0 LTS已经包含了clickhouse的监控模板&#xff0c;所以我们可以直接使用自带的模板来监控clickhouse了。 0.前置条件 clickhouse 已经安装&#xff0c;我安装的是24.3.5.47zabbix-agent 已经安装并配置。系统是ubuntu 2204 server 1. 新建监控用户 使用xml的方式为…

RabbitMQ替换默认端口

前提&#xff1a;客户通过漏洞扫描&#xff0c;发现rabbitmq中的erlang是默认端口4369&#xff0c;出于安全的考虑&#xff0c;需要将erlang的端口修改为其他的端口。 1.查看默认erlang的默认端口 netstat -plnt | grep 4369 2.关闭rabbitmq rabbitmqctl stop&#xff08;注…

Linux上配置NFS服务

架设一台NFS服务器&#xff0c;并按照以下要求配置&#xff1a; 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料&#xff1a; 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c;并将所有用户及所属的组映射为nfs-upload,其UID和…

MySQL数据库MHA高可用

目录 一、MHA简述 二、MHA 的组成 三、MHA 的特点 四、MHA工作原理 五、MHA部署步骤 六、搭建 MySQL MHA MHA一主两从高可用集群示意图 实验环境 1. Master、Slave1、Slave2 节点上安装 mysql5.7 2. 关闭防火墙 3. 修改 Master、Slave1、Slave2 节点的主机名 4. 修…

docker build cache 占用磁盘空间很高

一、查看docker 构建缓存占用空间 二、清理 三、查看

优选算法专题一 ——双指针算法

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

敢为人先 创世富尔是如何引领磁性元件磁集成技术风向的

【哔哥哔特导读】2021年便已实现车载OBC磁集成产品的量产&#xff0c;创世富尔将如何通过磁集成技术改变电源行业生态&#xff0c;并确立自身的领先优势&#xff1f; 自2023年新能源汽车厂商开启价格战以来&#xff0c;这波内卷逐渐蔓延至所有终端领域&#xff0c;加上上游材料…

Google如何做医疗大模型(Med-Gemini)

1. 前言 开发垂直领域模型的方法有好几种&#xff0c;其中医疗、法律等专业是比较能体现模型垂直行业能力的&#xff0c;因此也深受各大厂商的重视。 五一小长假的第一天&#xff0c;Google在Arxiv上发布了《Capabilities of Gemini Models in Medicine 》 ( https://arxiv.o…

虚拟光驱软件 PowerISO v8.7.0 中文激活版

PowerISO 是一款虚拟光驱工具及强大的光盘映像文件制作工具。支持创建、编辑、提取、压缩、加密和转换ISO/BIN图像文件。同时自带DISM工具&#xff0c;支持ESD/ISO/WIM/ESD格式转换&#xff0c;制作镜像文件制作U盘启动&#xff0c;支持ISO/BIN/IMG/DAA/WIM等各种常见文件类型。…

【简历】25届湖南某专升本JAVA简历:项目名称不要过份搞笑!!

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 另外&#xff1a;我们出这一系列校招简历指导的原因&#xff0c;就是看很多学生被忽悠&#xff0c;没有先定位大厂、中厂还是小公司&#xff0c;导…

目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8

目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8 1、.NET Reactor V6.9.8 功能简介2、官方下载 1、.NET Reactor V6.9.8 功能简介 业界领先的源代码保护 .NET Reactor通过多种方法来防止反编译&#xff0c;这些方法会将 .NET 程序集转换为任何现有工具都无法反编译的进程。…

Android Activity 属性 TaskAffiity、allowTaskReparenting

Activity未设置taskAffinity属性 页面跳转顺序 MainActivity -> StandardActivity -> SingleTopActivity-> SingleTaskActivity-> SingleInstanceActivity-> SingleInstancePerTaskActivity MainActivity 标准启动模式 StandardActivity 标准启动模式 SingleTo…