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

目录
相关文章
|
4天前
|
SQL Java 数据库连接
java使用jdbc操作数据库
java使用jdbc操作数据库
|
4天前
|
SQL Java 数据库连接
Java一分钟之-JDBC:Java数据库连接基础
【5月更文挑战第14天】JDBC是Java与关系数据库交互的API,常见问题包括资源管理、SQL注入和性能优化。易错点涉及驱动加载、空指针异常和事务管理。避免这些问题的方法有使用try-with-resources自动关闭资源、预编译PreparedStatement以防止SQL注入,以及正确管理事务。示例代码展示了基本的JDBC连接和查询。在实际开发中,推荐使用ORM框架如Hibernate或JPA来简化数据库操作。
13 1
|
4天前
|
SQL Java 关系型数据库
零基础轻松入门Java数据库连接(JDBC)
零基础轻松入门Java数据库连接(JDBC)
13 0
|
4天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
12 0
|
4天前
|
Java 关系型数据库 MySQL
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
|
4天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
4天前
|
SQL Java 数据库连接
使用JDBC进行数据库操作:Java Web开发的数据库连接
【4月更文挑战第3天】Java Web开发中,JDBC是与数据库交互的关键,提供统一访问关系型数据库的规范。核心组件包括DriverManager、Connection、Statement和ResultSet。使用流程涉及加载驱动、建立连接、创建Statement、执行SQL及处理结果,最后关闭资源。最佳实践包括使用try-with-resources、PreparedStatement、事务管理等。在Web开发中,JDBC用于用户认证、数据持久化、检索和事务管理。虽然有ORM工具,但掌握JDBC基础仍然重要。
|
4天前
|
SQL Java 数据库连接
Java的JDBC编程
Java的JDBC编程
|
4天前
|
SQL Java 关系型数据库
Java学习—JDBC
Java学习—JDBC
|
4天前
|
druid Java 数据库连接
最新Java基础系列课程--Day16-JDBC编程(三)
最新Java基础系列课程--Day16-JDBC编程