javaweb实训第四天下午——JDBC深入理解(1)https://developer.aliyun.com/article/1414846
2.5.3 防SQL注入
直接使用登录功能来演示防此sql注入,登录功能一般怎么做?
代码实现:
测试代码:
这个就是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
3.2 登录方式二实现
测试:
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= ‘过儿’
完成示例:
事物的案例:
分析:①建表
②模拟问题出现
出现问题,怎么来完成事务–同时提交或者同时失败
③ setAutoCommit(boolean autoCommint) 将此链接的自动提交模式设置为给定状态,(设置自动提交事务,true的时候,自动启动,为false的时候,禁止自动启动)
在我们JDBC中,一直有事务存在,但是这个事务默认是自动提交(conn.getAutoCommit()等于true),当它是自动提交的时候,每执行一条sql,就提交事务,而刚两条sql,说明不是在一个事务里面,所以出问题了;
如何解决?–我们的事务一般来说,要设置成执行几条SQL(完成一个整体的功能,在进行提交),因此我们需要事务的自动提交修改false ,(不让它执行完一条sql,就自动提交) conn.setAutoCommint(false) --将自动提交关闭,设置手动提交
当我们把自动提交关闭,那sql就不是提交执行,于是我们一定要记住,当我们一个整体功能完成之后,自己要手动进行提交;-- conn.commit 但是失败之后,要记住数据回滚
conn.rollback()
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