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,一经查实,立即删除!

相关文章

【TS】TypeScript 类型定义之联合类型(union types)和交叉类型(intersection types)

你提供的代码是 TypeScript 中的一种类型定义&#xff0c;它使用了联合类型&#xff08;union types&#xff09;和交叉类型&#xff08;intersection types&#xff09;。让我们逐步解析这个定义&#xff1a; 基础类型 首先&#xff0c;假设你已经定义了一个基础类型 baseSe…

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的方式为…

机架式服务器:

外观&#xff1a;机架式服务器按照统一标准设计&#xff0c;通常安装在机柜中。 规格&#xff1a;机架式服务器有不同的规格&#xff0c;如1U&#xff08;高度约4.45厘米&#xff09;、2U、4U、6U、8U等。 应用范围&#xff1a;适用于数据中心、企业级应用和大规模部署

【JVM第1课】Java 跨平台原理

无痛快速学习JVM&#xff0c;欢迎订阅本免费专栏 JVM Java的特性就是程序员一次编写&#xff0c;到处运行&#xff0c;意思是我们只需要写一份代码&#xff0c;就可以在不同的操作系统&#xff08;windows、Linux、Mac OS等&#xff09;中运行。但是不同的操作系统能看懂的指令…

RabbitMQ替换默认端口

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

【MySQL】 运维篇—备份与恢复:使用mysqldump进行数据库备份与恢复

无论是企业应用、电子商务平台还是社交媒体&#xff0c;数据的安全性和完整性都是至关重要的。数据库备份是一种保护措施&#xff0c;确保在数据丢失、损坏或系统故障时&#xff0c;可以快速恢复数据&#xff0c;保持业务的连续性和稳定性。 应用场景 意外数据丢失&#xff1a…

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. 修…

【http作业】

1.关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld #关闭防火墙 [rootlocalhost ~]# setenforce 0 2.下载nginx包 [rootlocalhost ~]# mount /dev/sr0 /mnt #挂载目录 [rootlocalhost ~]# yum install nginx -y #下载nginx包 3.增加多条端口 [rootlocalhost ~]# n…

docker build cache 占用磁盘空间很高

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

PostgreSQL 删除重复数据

我们常常会遇到这样的问题&#xff0c;就是数据重复。然后我们需要对重复数据进行删除。保留最大还是最小则根据具体业务来判断。 假设有表 vbi1 在设计表的时候由于 vbi01 没有被设置为主键&#xff0c;这个时候业务发现 vbi01 重复了&#xff0c;我们需要根据字段 vbi01 来删…

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

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