连接池-课堂笔记
一、预编译对象
- SQL注入漏洞
- 用户输入一些特殊的值,在拼接SQL字符串的时候,导致SQL的语法结构发生变化,从而绕过了SQL的条件。形成的安全问题,叫SQL注入漏洞。
- 如何避免SQL注入漏洞:使用预编译对象PreparedStatement
- 什么是预编译对象
- 预编译对象:java.sql.PreparedStatement,是Statement的子接口,功能更强;是另外一种SQL执行平台对象,能够解决SQL注入漏洞;
- 怎样使用预编译对象
//1.注册驱动
//2.获取连接//3.创建SQL执行平台:预编译对象PreparedStatement //3.1 改造SQL语句:使用?代替SQL里的参数值 //3.2 预编译SQL语句,得到预编译对象 //3.3 设置SQL语句里的参数值 //4.执行SQL语句 //5.处理结果 //6.释放资源
2.1 SQL语句的改造
- SQL语句里,所有的参数值,都要使用?代替掉
2.2 预编译SQL,得到预编译对象
- PreparedStatement pstmt = connection.prepareStatement(sql)
2.3 设置SQL的参数值
- SQL里有几个?,就要设置几个值
- 设置参数值的方法:pstmt.setXXX(参数序号, 参数值)
2.4 执行SQL语句
- 执行DQL语句:pstmt.executeQuery()
- 执行DML语句:pstmt.executeUpdate()
- 执行任意语句:pstmt.execute()
注意:预编译对象执行SQL的所有方法,都是无参方法
- 预编译对象的原理和好处
- 原理:见图
- 好处:
- 能够解决SQL注入漏洞
- 效率高:SQL编译一次,执行多次
- 可读性高:SQL语句结构清晰易读
二、自定义连接池
- 目的:1. 通过自定义连接池,了解连接池的原理; 2. 代表自定义连接池,讲一个知识点:对某个对象的方法进行功能增强
- 什么是连接池
- 连接池:存储了一批连接对象的容器。如果需要操作数据库,不用再创建Connection对象,而是从连接池里取出一个使用;使用完成之后,把连接对象归还到连接池。
- 好处:
- 性能高:拿出一个使用,比创建一个速度快
- 连接对象循环使用,连接数就少了:
- 不会导致数据库所有可用连接,都被占用
- 不会Connection对象过多,导致内存溢出
- 自定义连接池
2.1 功能增强的方式
- 继承父类,重写父类方法
- 代理模式:调用代理对象,让代理对象调用目标对象。代理对象里可以写一些代码,进行功能增强(基于反射技术)
- 装饰者模式:
- 装饰者模式
《设计模式之禅》<