JDBC

本文详细介绍了JDBC的工作原理,包括连接数据库、SQL执行、PreparedStatement防止SQL注入,以及事务的ACID特性与操作步骤。涵盖了关键概念如JDBC驱动、Connection和Statement的使用,以及如何确保数据安全和事务一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC
SQL是直接访问数据,而JDBC是一种用于执行SQL语句的Java的API

JDBC两大类:
面向开发人员:作为是API
面向数据库厂商:是接口

JDBC步骤:
1、导入数据库jar包——1、拷贝jar文件到工程下lib文件夹2、配置BuildPath构建路径
2、加载驱动——告诉驱动管理器,我们要操作的是哪个数据库
Class.forName(’'com.mysql.jdbc.Driver");
3、获取连接——Connection接口
Connection con=DriverManager.gerConection(“jdbc:mysql://127.0.0.1:3306/j172?useUnicode=true&characterEncodion=UTF-8”,用户名,密码)补充知识:URL统一资源定位符
协议://ip地址:端口号/具体资源?参数名1=值1&参数2=值2
4、关闭连接
先关Statement,再关Connection
.close()
5、构建SQL语句
口诀:选中双引号双加号
6、获取语句对象——Statement
Statement state=con.createStatement();
7、让语句对象执行SQL语句——DML语句调用executeUpdate() 返回Int类型 ,DQL语句调用executeQuery()返回结果集(ResultSet)
DQL语句用next()方法来查询如果查到返回true同时可以取该行,没查到返回flase
取数据:get数据类型(列名)若有别名用别名取数据

SQL注入
当SQL语句的部分内容采用字符串拼接的方式执行,那么有可能发生注入的字符串改变原有结构,这被称为SQL注入。
解决方式:
1、SQL语句执行之前,先把SQL的结构交给数据库进行预先编译;这样先让SQL的结构固定下来;然后再通过传参的方式,放入字符串条件值。————关键字PrepareStatement
步骤:
1、SQL语句首先确定结果,需要传的值的位置用?占位符代替
2、交给数据库预编译:con.prepareStatement(sql);返回的是PrepareStatement对象
3、设置值,set数据类型(?的下标,真正的值)
4、执行这个SQL语句,executeUpdate() ;executeQuery()但是可以不用再次传值了

怎么在获取语句对象的时候要求返回生成的主键?
在获取语句对象的时候,传入RETURN_GENERATED_KEYS,要求返回自动生成的主键(PrepareStatement;Statement都有)
步骤:
ResultSet rs=ps.getGeneratedKeys();——完成主键查询
key=rs.getInt———通过结果集获取当条新增记录的主键

事务操作:
在复杂业务当中,我们有可能需要执行多条DML语句,才能完成一个完整的业务操作。而多条DML语句要同时成功才能代表该业务成功;只要有一个失败该业务失败,其他没有失败的也要恢复开始状态。
事务的四大特征(ACID特性):
1、原子性;指代的是业务不可再分的,那么完成这个业务的多条DML语句组成了完成这个业务的基本单位。
2、一致性;业务最终执行的结果要么DML全部成功要么DML全部失败
3、隔离性;该业务的多条SQL必须作为一个整体完成,SQL与SQL之间不能被别的业务插入
4、持久性;指代的是事物重点考虑的是DML语句,这种影响数据持久化的操作

步骤:
1、开启事务;设置自动提交为假(在try块最前面)——con.setAutoCommit(false)
2、所有DML成功,则提交事务;手动提交(在try块最后)——con.commit();
3、只要发生失败,事务回滚;con.rollback();——在catch块中回滚

注意:
事务的多条DML语句,在JDBC实现中,首先要保证它们用的是同一个Connection对象

JDBC小结:
1、JDBC中下标都是从1开始
2、不用滥用PrepareStatement语句的数目最好不用过多,因为数据库预编译以后会存放这些预编译语句,过多会让数据库负担过重;最好使用在需要外部输入的时候使用
3、JDBC中的setDate方法是要求传入sql包中的Date,而我们在Bean的属性设计中用的是util包中的Date,需要做转换——new java.sql.Date(new Date().getTime())

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值