ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:423.14KB ,
资源ID:16316972      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-16316972.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(day9JDBC深入理解.docx)为本站会员(b****7)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

day9JDBC深入理解.docx

1、day9JDBC深入理解JDBC深入1 课程介绍 1.预编译语句对象 2.SQL注入问题 3.用户登录 4.事务 5.连接池 6.获得主键问题2 预编译语句对象2.1 回顾Statement执行SQL语句2.1.1 操作流程i. 加载驱动ii. 获得连接iii. 准备sql语句以及Statement对象iv. 执行sql语句v. 释放资源2.1.2 带来的问题i. 拼接sql语句容易出错,麻烦;ii. 存在sql注入问题;2.1.3 sql注入问题1. 使用Statement模拟sql注入问题2. 使用PreparedStatement解决sql注入问题3. 为什么PreparedStatem

2、ent就解决了sql注入问题呢?使用PrepareStatement它的语句相当是一个模板,这个模板的基本结构我们是不能够进行更改的(不能拚接字符串),于是,它很好的解决了sql注入的问题2.2 使用PreparedStatement执行SQL语句2.2.1 概念PreparedStatement:Statement的子接口,表示预编译SQL语句对象. 什么是预编译SQL语句?预编译语句PreparedStatement是java.sql中的一个接口,它是Statement的子接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给数据库,由数据库首先进行编译后再执行。预编译语

3、句和Statement不同,在创建PreparedStatement对象时就指定了SQL语句,该语句立即发送给数据库进行编译。当该编译语句被执行时,数据库直接运行编译后的SQL语句,而不需要像其他SQL语句那样首先将其编译,再执行。2.2.2 PreparedStatement使用Api示例:使用PreparedStatement的操作流程-完成update方法2.2.3 注意事项i. 库连错了,表指定错了,列名指定错了,sql语句拼错了;ii. 上面的sql语句中的 ? 代表就是一个任意类型的值,不需加 iii. PreparedStatement中是一个模板,而不是拼接字符串iv. 调用e

4、xecuteUpdate方法的时候不需要传入sql参数了,模板中已经有了;v. set方法指定的列编号是从1开始2.2.4 PreparedStatement特点i. 代码可读性/维护性更高.ii. PreparedStatement的执行性能更高.iii. 安全性更高,防止SQL注入问题.2.2.5 Statement和PreparedStatement区别(面试题)第一:数据库在执行sql语句的时候如果使用PreparedStatement语句会有一点优势:因为数据库会preparedStatement语句进行预编译,预编译的sql可以复用下次执行相同的sql语句时,数据库端不会再进行预编

5、译了,而直接用数据库的缓冲区,提高数据访问的效率(尽量采用使用?号的方式传递参数).第二:极大地提高了安全性,防止sql注入。 第三: 增加代码的可读性和可维护性最后:在JDBC应用中,如果是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement3 用户登录功能登录界面有如下几种登录方式:-1. 第一种i. 在外面的DAO层应该有这样的一条sql:select * from student where username=? and password=?ii. 劣势:不能够独立判断出是用户名还是密码错误iii. 优

6、势:简单安全性更高,思考为什么?2. 第二种i. 在外面的DAO层应该有这样的一条sql:select * from student where username=?ii. 如何判断重复的?1. 先使用户名从数据库中获得数据a) 如果没有返回东西,提示用户名错误b) 如果得到结果了,从结果中获得密码和前台传入的密码进行比较c) 如果相等登陆成功d) 如果不相等,提示密码错误iii. 劣势:麻烦一点iv. 优势:可以单独判断是用户名还是密码错误用户体验更好,安全性没那么好,因为直接告诉了用户是用户名错误还是密码错误4 事务4.1 银行转账案例分析1. 需求:王麻子准备把1000元转给女朋友小花2

7、. 数据准备-账户表account(id,name,balance)3. 步骤1) 查询王麻子的账户余额是否大于等于1000块钱. SELECT * FROM account WHERE name = 王麻子 AND balance = 1000;1 余额小于1000: 系统提示:亲,您的余额不足,把钱赚够了再转吧!2 余额大于等于1000: 继续后面的操作2) 从王麻子的账户上减少1000块钱.UPDATE account SET balance = balance - 1000 WHERE name = 王麻子;3) 在小花的账户上增加1000块钱.UPDATE account SET b

8、alance = balance + 1000 WHERE name = 小花;4) 那么问题来了:若在第二步和第三步操作之间,突然停电!-程序中断(使用异常模拟.)5) 模拟代码:4.2 事务概述和处理4.2.1 什么是事务把多个操作单元看成是一个整体,全部的操作单元成功都才视为成功(commit),若有一个操作单元失败则,视为整个过程失败(rollback)。为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当每个逻辑操作单元全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。4.2.2 事务

9、的ACID属性(面试可能问到)1. 原子性(Atomicity)指整个事务是不可以分割的工作单元。只有事务中所有的操作执行成功,才算整个事务成功,事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该回到执行事务前的状态。2. 一致性(Consistency)指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对于银行转账事务,不管事务成功还是失败,应该保证事务结束后两个转账账户的存款总额是与转账前一致的。3. 隔离性(Isolation):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。即一个事务内部的操作及

10、使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。4. 持久性(Durability)指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。4.2.3 事务的处理机制try /开启事务,设置为的手动提交操作1操作2操作3 . /提交事务:catch(Exception e) /回滚事务4.2.4 JDBC事务细节1. 在JDBC中事务是默认自动提交的. 在执行DML语句的时候就已经提交事务了.2. 事务只对DML语句有效,对于DQL(查询)没效果,查询不会涉及到修改数据. 但是,以后在

11、Spring设置的时候,往往把查询也放到事务中. 注意:以后做开发,方式代码没有报错,但是数据插入/修改/删除不成功,首先判断事务是否提交.3. 回滚事务之后再释放资源,释放锁机制(InnoDB:行锁).4. 在MySQL中,MyISAM不支持外键,不支持事务,InnoDB都支持. 在开发中,外键可以不要,但是事务必须得要.在Spring中有专门的事务管理器(TransactionManager):5 获得主键问题(了解)5.1 获得主键的场景分析新增一个产品和产品库存1. 从前台网页中录入数据的时候a) 录入产品b) 录入库存2. 后台新增数据到表 product 和product_stoc

12、ka) 先新增一条产品数据,数据库生成一个主键idb) 再新增库存记录(product_stock引用了product表的外键)需要获得新增的product的id,应该怎么弄?5.2 Statement拿到主键的方式Statement中有方法:intexecuteUpdate(String sql) 返回的是影响的行数intexecuteUpdate(String sql, intautoGeneratedKeys) 返回还是影响的行数参数:autoGeneratedKeys,表示可以设置是否可以去获得自动生成的主键值:Statement.RETURN_GENERATED_KEYS设置可以获取

13、之后,如何获取?ResultSetgetGeneratedKeys() 获取由于执行此 Statement 对象而创建的所有自动生成的键 注意:分析:1) 表中明明是有id列2) 以前使用executeQuery查询的时候,返回的ResultSet中就是数据库表中的一条一条的数据,就是通过上面的方式来获得3) getGeneratedKeys() 调用完毕之后返回的对象中只有键4) 怎么拿?调用ResultSet中通过索引来获得列数据的方法5.3 PreparedStatement拿到主键的方式Hibernate中可以自动返回,(底层已经封装OK)6 连接池6.1 什么是连接池连接池:就是用来

14、装连接对象connection的容器连接池的技术比较多,java仅仅是提供了DataSource的接口(就是连接池),不提供任何实现.由各大服务器厂商来提供DataSource实现(Tomcat,WebLogic).示例:假设一个场景,火车站排队买票:不管有没有人,都需要留一个两个窗口,-有个初始窗口1. 初始容量(5) 火车站刚开始需要有几个窗口2. 如果人变多的时候,窗口不够怎么办-需要增加窗口,但是这个窗口不是随便增加 当人数比较多的时候,添加窗口; 最大数量(10)3. 如果人变少的时候,只有几个窗口 - 这时候需要最小窗口 最小数量(2)4. 如果有人占着窗口不放,怎么办?一个人如果

15、占着位置又不买票,比如占了3分钟,强制驱离不要占用窗口 最大连接时间(3)5. 票已经卖完的时候,还有人等待怎么办? 如果等待过长,断开连接,请求超时; 请求超时这就是连接池的理解;6.2 为什么使用数据库连接池普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多

16、的系统资源,严重的甚至会造成服务器的崩溃。对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃.使用连接池和不使用连接池在代码上的区别:获取连接:使用连接池之前:使用DriverManager来获取Connection对象.Connection conn = DriverManager.getConnection(url,username,password);使用连接池之后:直接找连接池(DataSource对

17、象),取出Connection即可.如何创建DataSource对象,在创建DataSource的时候,就会设置连接数据库的url,user,password.Connection conn = DataSource对象.getConnection();接下来的代码和以前相同.释放连接:代码:connection对象.close();使用连接池之前:直接和数据库服务器建立连接关系,而断开也是和数据库服务器断开连接.使用连接池之后:直接和连接池建立连接关系,而断开也是把Connection对象还给连接池,供其他客户使用.没有真正的和数据库断开. 如此一来,一个Connection对象就得到了充分

18、的利用!6.3 常用连接池DBCP 连接池C3P0 连接池Druid连接池 : 现在用的最多,是阿里巴巴开源的连接池。排第一Druid排第二 tomcat 里面有个连接池6.4 DBCP连接池实现准备:拷贝jar:commons-dbcp-1.3.jar commons-pool-1.5.6.jar .查阅文档:commons-dbcp-1.3-srcdocBasicDataSourceExample.java- 解决DBCP的硬编码问题:应该把连接信息放到配置文件中去: 配置文件的名词可以任意.- dbcp.properties#连接字符串url=jdbc:mysql:/localhost:

19、3306/jdbcdemo#用户名username=root#密码password=admin#驱动的类路径driverClassName=com.mysql.jdbc.Driver#连接池启动时的初始值initialSize=1#连接池的最大值maxActive=50#连接池的最大空闲数maxIdle=20- 如何把dbcp.properties中的配置信息,设置到程序中去:直接读取资源文件的方式:注意:在db.properties里的属性名称必须和set的属性名字的对应上7 今日要求 掌握PrepareStatement 理解掌握事务是什么,怎么使用 理解并且使用连接池8 作业1) 完成两种登录方法的登录2) 模拟完成一个转账的功能(练习事务)3) 使用 DBCP完成一张表的crud4) PrepareStatement返回主键(选做)

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2