javaweb实训第四天下午——JDBC深入理解(2)

简介: 2.5.3 防SQL注入直接使用登录功能来演示防此sql注入,登录功能一般怎么做?

javaweb实训第四天下午——JDBC深入理解(1)https://developer.aliyun.com/article/1414846

2.5.3 防SQL注入

直接使用登录功能来演示防此sql注入,登录功能一般怎么做?

20210602100602472.png

代码实现:

2021060210060618.png

测试代码:

20210602100610234.png

这个就是sql注入;

分析:

String name = " ' or 1=1 or ' ";
当我们的name是上面的内容的时候,用Statement我们会去拚接字符串,就会出现下面一句sql:
select * from student where name='' 
  or 1=1 
  or ' ' and password='werwer'
那么就肯定能查询到数据

PrepareStatement 不是拼接字符串,它是模板-- 格式是固定好的

但是使用PrepareStatement 它的语句相当是一个模板,这个模板的基本结构我们是不能够进行更改的(不能拚接字符串),于是,它很好的解决了sql注入的问题

2.6小结

1.PreparedStatement是什么

  指的时候预编译语句对象 创建对象 就传入sql进行编译 在执行 不需要传入sql 直接运行

2.PreparedStatement实现

3.PreparedStatement和Statement区别

 ①PreparedStatement 不需要拼接字符串,结构清晰

 ②PreparedStatement效率比Statement高一点

 ③PreparedStatement可以防止sql注入

3.完成登录功能

3.1 登录方式比较

完成简单登录功能:

传入的用户名和密码,然后拼接查询用户的SQL

Select * from 用户表 where name = ? and password = ?

如果用户名和密码同时存在,能查询到数据,然后我们就把这个数据封装成相应的对象,再把这个对象返回,如果用户名和密码错误,没有数据,直接返回null

20210602100734918.png

20210602100744997.png

3.2 登录方式二实现

测试:

2021060210075023.png

3.3小结

1.登录方式实现

①select * from user where username = ? and password=?

②select * from user where username=? 建议用

③select count(*) from user where username=? and password=?

4.细节功能

4.1事务

4.1.1事务使用

什么是事务?

事务: 程序里面的一组操作,要么都成功,要么都失败;

ACID


事务示例:

银行转帐功能: bank / money

过儿和姑姑:

过儿 : 10000块钱 姑姑 : 0块钱


转账:过儿要给姑姑转1000块钱

分析:转钱需要提供两条sql,但是程序员也会出错,比较代码写错了.


①update bank set money = money +1000 where name = ‘姑姑’

②代码出错

③update bank set money = money -1000 where name= ‘过儿’


完成示例:


事物的案例:

分析:①建表

20210602100854804.png

②模拟问题出现

20210602100904681.png

出现问题,怎么来完成事务–同时提交或者同时失败

③ setAutoCommit(boolean autoCommint) 将此链接的自动提交模式设置为给定状态,(设置自动提交事务,true的时候,自动启动,为false的时候,禁止自动启动)

在我们JDBC中,一直有事务存在,但是这个事务默认是自动提交(conn.getAutoCommit()等于true),当它是自动提交的时候,每执行一条sql,就提交事务,而刚两条sql,说明不是在一个事务里面,所以出问题了;


如何解决?–我们的事务一般来说,要设置成执行几条SQL(完成一个整体的功能,在进行提交),因此我们需要事务的自动提交修改false ,(不让它执行完一条sql,就自动提交) conn.setAutoCommint(false) --将自动提交关闭,设置手动提交


当我们把自动提交关闭,那sql就不是提交执行,于是我们一定要记住,当我们一个整体功能完成之后,自己要手动进行提交;-- conn.commit 但是失败之后,要记住数据回滚

conn.rollback()

20210602100942856.png

2021060210094822.png

4.1.2 事务认识

事务(Transaction,简写为tx):

在数据库中,>所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。

为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:

  当每个逻辑操作单元全部完成时,数据的一致性可以保持,

  而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。


事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(commit),这些修改就永久地保存下来,如果回退(rollback),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。

事务:一组操作在事务空间,要么都成功,要么都失败;


==事务的ACID属性==: 。。。。 ==原子性==:指整个事务是不可以分割的工作单元。只有事务中所有的操作执行成功,才算整个事务成功,事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该回到执行事务前的状态。

一致性:指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对于银行转账事务,不管事务成功还是失败,应该保证事务结束后两个转账账户的存款总额是与转账前一致的。


隔离性:指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。(Hibernate在讲) JPA 框架


持久性:指的是只要事务成功结束它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。


事务:是用户定义的一组操作。这组操作要么都做(都成功),要么都不做;

事务处理:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),要么整个事务回滚(rollback)到最初状态

处理事务的两个动作:

提交:commit: 当整个事务中,所有的逻辑单元都正常执行成功. ---->提交事务.—数据已经提交,不能更改.

回滚rollback: 当整个事务中,有一个逻辑单元执行失败, ---->回滚事务.

撤销该事务中的所有操作—>恢复到最初的状态.


如何在代码中去处理事务:

1.在JDBC中,事务是默认提交的. 必须先设置事务为手动提交.

 connection对象.setAutoCommit(false);//设置事务为手动提交.

2.手动的提交事务.

 connection对象.commit();

3.若出现异常必须回滚事务:

 不回滚事务,总余额依然是正确的. 若不回滚事务,不会释放数据库资源.

 connection对象.rollback();

1.在JDBC在事务是默认提交的,那是在什么时候提交的.

 在执行一个DML/DDL操作的时候,就已经提交事务了.

2.针对于CRUD操作. 只有DML操作才有事务,查询操作没有事务.

 但是,我们一般会把查询也放在事务里面.—>Spring的事务管理的时候再讲.

3.以后,凡是发现自己编写的代码是正确的,测试也通过,但是就是数据库表中的数据不变----->事务没提交的问题. 等我们学习MyBatis开始就会遇到这个问题了

4.MySQL中,InnoDB支持外键.支持事务,MyISAM不支持外键,不支持事务.


至于事务的管理,在Hibernate,MyBatis,Spring还要再讲.

事务管理器:TransactionManager.

javaweb实训第四天下午——JDBC深入理解(3)https://developer.aliyun.com/article/1414848?spm=a2c6h.13148508.setting.41.6e1a4f0eQzpjQW

目录
相关文章
|
19天前
|
Java 关系型数据库 MySQL
【Java】已解决com.mysql.cj.jdbc.exceptions.CommunicationsException异常
【Java】已解决com.mysql.cj.jdbc.exceptions.CommunicationsException异常
29 1
|
22天前
|
SQL Java 关系型数据库
Java中的JDBC编程详解
Java中的JDBC编程详解
|
23天前
|
SQL Java 关系型数据库
Java中的JDBC编程详解
Java中的JDBC编程详解
|
16天前
|
SQL 安全 Java
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
19 0
|
16天前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
27 0
|
19天前
|
SQL Java 关系型数据库
【Java】已解决Java中的com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常
【Java】已解决Java中的com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常
11 0
|
19天前
|
Java 关系型数据库 MySQL
【Java】已解决com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException异常
【Java】已解决com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException异常
27 0
|
1月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
【6月更文挑战第24天】Java的JDBC是连接数据库的标准,提供统一API访问多种数据库。本文涵盖JDBC的基本概念、核心组件(如DriverManager、Connection、Statement、PreparedStatement和ResultSet)和最佳实践。示例展示了如何用JDBC连接MySQL,执行查询并处理结果。最佳实践包括使用PreparedStatement防SQL注入,妥善管理资源,处理异常,使用事务以及优化性能。了解和掌握JDBC能提升数据库操作的效率和安全性。
|
1月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
【6月更文挑战第24天】Java的JDBC是连接Java和数据库的标准,提供统一的API访问各种数据库。核心组件包括DriverManager(加载驱动和创建连接)、Connection(表示数据库连接)、Statement(执行SQL)和PreparedStatement(参数化查询,防止SQL注入)。
|
1月前
|
SQL Java 关系型数据库
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
23 0