five, mySQL ,JDBC 连接池

JDBC连接池

一 preparedStatement
1.1回顾上一篇的登录案例
我可以不输入密码就可以登录
Select * from user where username=’tom’#’and password=’’;
输入参数与字符串连接,发送给数据先编译后执行,改变了sql 原有的意义,这个现象我们称之为sql注入
在这里插入图片描述
1.2解决方案
想要解决sql注入的问题就不能用户输入的实际参数与sql字符串进行了拼接,使用PreparedStatement【预编译】
在这里插入图片描述
1.3api介绍
SQL语句已预编译并存储在一个PreparedStatement对象中。 然后可以使用该对象多次有效地执行此语句。
通过Connection对象进行创建预编译语句执行者
使用?占位符代替sql实际参数
String sql = “select * from user where username = ? and password = ?”;
给问号设置实际参数PreparementStatement.SetXxx(int 问号的位置,object 实际参数); 例如 int double String object 执行sql语句
//执行sql
了解Public boolean execute();
//执行dml
Public int executeUpdate();
//执行dql
Public ResultSet executeQuery();
1.4修复上一篇的登录案例
在这里插入图片描述
1.5优点可以防止sql注入,提高安全性
实际参数与sql字符串分离,提高的代码的阅读性Sql仅仅编写一次,提高速率1.6使用预编译对象实现增删改查步骤分析
//获取连接
//编写sql语句【? 是占位符】
//创建预编译对象
//设置sql的实际参数
//执行sql并返回结果
//处理结果
关闭资源
增加
insert into user (id , username , password) values (null,?,?);
在这里插入图片描述
修改
update user set username = ? and password = ? ;
在这里插入图片描述
删除
delete from user where id = ?;
在这里插入图片描述
查询
select * from user ;
在这里插入图片描述

二 连接池

2.1概述
我们在使用jdbc操作数据库的时候,每次都要创建连接,关闭连接这样很消耗资源和消耗时间,性能不好.这样我们需要用连接池来进行优化,在获得连接的时在连接池里面进行获取,使用完毕再返还连接池,这样提高了代码的复用性,减轻服务器压力.
dataSource ;是java对数据库连接池提供的一套规范(接口),只需要学习接口的方法即可,实现类有连接池厂商提供(jar);
在这里插入图片描述
2.2.1常用配置文件参数解释
常用的配置参数;
在这里插入图片描述
初始连接数;刚创建好连接池的时候准备的连接数量;
最大连接数;连接池中最多可以放多少个连接
最大等待时机;连接池中没有连接时最长等待时间
最大空闲回收时间;连接池中的空闲连接多久没有使用就会回收
完整参数;
在这里插入图片描述
2.2.2 c3p0他是一个开源连接池
,目前hibarnate【JDBC】等框架推荐使用
a) 硬编码【了解】
步骤分析
1导入jar包2编写代码
//创建连接池对象
//设置参数
//获取连接
//归还连接池
代码片段
在这里插入图片描述
b)配置文件
步骤分析
1 导入jar包
2定义一个配置文件【由连接池提供】
要求文件名必须为;
c3p0-config.xml【不需要修改】
文件位置必须在;src根目录下
3编写代码
//创建连接池对象
//获取连接
//归还到连接池
代码片段
在这里插入图片描述
2.2.3好处
可以连接不同的数据库;db1
可以使用不同的连接池参数;maxPoolSize
可以连接不用厂商的数据库;Oracle或mySQL
2.3 druidDruid(德鲁伊),
它是阿里巴巴旗下开源产品,
它号称目标最好的连接池没有之一,支持日志监控目前主要的互联网网站
,都在使用druid作为第三方连接池
在这里插入图片描述
配置文件【推荐】
在这里插入图片描述
1 导入jar包
2 定义一个配置文件【由连接池提供】
建议:名称为;druid.properties【简明知意】
位置在;src根目录下
3 编写代码
// 创建连接
// 获取连接
// 归还到连接池
代码片段
在这里插入图片描述
2.4 连接池工具类【web期间都用它】
连接池是一个 重量级 的对象,连接创建非常消耗时间和浪费资源的,开发项目只有一个连接池,并且 初始化一次 , 提取到工具类放入静态代码块,简化代码,提高效率
在这里插入图片描述
在这里插入图片描述

3.1 增强

1 继承
针对于目标对象,创建一个子类,重写父类的方法缺点;Java是单继承,多实现,如果说我们只为了增强其中一个一个方法,就要浪费一个继承位
2 动态代理代理模式
张嫂 听歌 – 李四 唱歌
张嫂 听歌 – 王二 收费 – 李四 唱歌
调用者-- 代理对象 增强 – 目标对象 唱歌
在这里插入图片描述
动态代理
在程序运行期间【反射】,由jvm虚拟机来创建代理对象,其目标对象方法增强
动态代理技术
JDK,【GCLIB,JAVA ASSIST】spring框架
JDK动态代理
JDK根据接口规范来创建代理对象,目标对象也需要实现此接口

3.2 案例;

动态代理需求
张嫂 听歌 – 李四 唱歌
张嫂 听歌 – 王二 收费 – 李四 唱歌
需求分析
针对唱歌的方法进行增强,使用JDK的动态代理,目标对象是由接口,根据接口规范创建代理对象
步骤分析
//1 创建接口 singer 听歌 吃饭
//2 创建目标类 李四 实现singer 接口
//唱歌 单身情歌
//吃饭 珍珠翡翠白玉汤
3 针对目标对象进行增强【王二】Jdk提供了一个工具类Proxy专门创建代理对象比如connection 将 连接 归还给连接池, 本来是关闭连接的, 动态创建出代理对象
接口;
在这里插入图片描述
实现类
在这里插入图片描述
测试类
版本一
在这里插入图片描述
在这里插入图片描述
版本二
在这里插入图片描述
动态代理
在程序运行的过程中,动态创建出代理对象 , 我们可以对代理对象进行控制 , 对其方法进行增强
静态代理
程序员创建代理类,在对其编译,在程序运行期间,代理类的.class文件就存在
A 到(静态代理) B 之间还就是已经存在了动态代理?A到 C(这就是动态代理) 到 B , 是不是 A 到C 之间就已经存在了静态代理了, 这个就不对了, 推翻了(我自己想的)
什么是代理类. A 到 B 之间没有代理类A 到 C 在 到B 则C 就可以称作代理类, 在java中 在创建C 的时候就默认存在 静态代理, 这时 C 有要求 ,就从静态代理变成了动态代理, 这样说的话 对其封装的话 是不是之间就存在 静态代理动态代理类相应的API

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值