一、首先什么是JDBC
- JDBC接口(API)包括两个层次:
- 面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
- 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。
JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。
不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。 ————面向接口编程
- 二、编写JDBC程序的步骤(六个步骤)
- 加载并注册驱动
- 创建Connection对象来获取连接
- 获取数据库的操作对象
- 执行sql语句
- 返回结果集
- 关闭资源
1.注册驱动
首先我们要new出Driver类,Driver接口在java.sql.Driver()中,Driver接口实现类在com.mysql.jdbc.Driver()中,两者包名不同但名字相同,注意正确地导包
1 | //方式一: |
2.获取连接
获取连接要有三个重要参数:url,username,password三个参数
·url:统一资源定位符,网络中某个资源的绝对路径,url包含四个部分:协议,IP,端口号,资源名其中注意如果mysql版本高于8.0需要在url后加?&useSSL=false&serverTimezone=UTC参数
3.获取数据库操作对象
4.执行sql语句
利用数据库sql语言作为参数传入到指定的方法中,jdbc的sql语句结尾不需要加分号,加了会报错
·executeupdate()专门执行DML语言(insert,delete,update)返回值为执行成功的条数
5.处理查询结果集
一般如果是使用上述的executeUpdate()方法不需要处理结果集,如果是查询操作将要处理返回的结果集
6.关闭资源
为了保证资源一定释放,在finally语句块中关闭资源,并且遵循从小到大的关闭顺序,同时close()方法抛出异常,需要分别try-catch
接下来是初步的代码实现
1 | public class Test02 { |
三、将数据库连接的所有信息配置到配置文件中
创建文本文档,一般命名为jdbc.properties,将上述文件中的String型参数写入到配置文件中
1 | driver=com.mysql.cj.jdbc.Driver |
接下来把上述代码中的参数都利用文件流来输入
1 | public static void main(String[] args) { |
四、处理结果集
1 | //1.创建收集结果集的ResultSet对象 |
五、以用idea配置JDBC
在项目结构中->libraries->+找到mysql-connector-java-8.0.12包导入即可
六、利用JDBC模拟一个简单的用户登录界面
1 | public class UserLogin { |
但上述代码会出现一个经典问题,sql注入的问题
导致SQL注入的根本原因一些关键字参与sql语句的编译过程,导致语义扭曲,那么如何解决sql注入的问题呢?
七、解决sql注入问题,我们使用PrepareStatement接口
那么原理是什么呢?预先对SQL语句的框架进行编译,然后再给SQL语句传值
其中代码有所改变
1 | //1.注册驱动 |
那么我们来对比以下Statement和PreparedStatement
- Statement存在sql注入问题,PreparedStatement解决了sql诸如问题
- Statement是编译一次执行一次,PreparedStatement是编译一次执行n此,效率比较高
- PreparedStatem会在编译阶段做类型的安全检查
一般我们都是采用PrepareStatement,但如果要求我们进行sql语句的拼接,那么我们只能使用Statement
八、JDBC的事务
JDBC事务的机制:
JDBC中的事务时自动提交的,什么是自动提交?只要执行一条DML语句,则自动提交一次,这是JDBC默认的事务行为。但是我们在实际的业务当中,通常都是N条DML语句共同联合才能完成的,必修保证他们这些DML语句在同一个事务中同时成功或者同时失败
如何利用代买来实现JDBC事务机制
·conn.setAutoCommint(false);
·conn.commit();
·conn.rollback();
设置事务手动提交,手动提交事务,如果出现异常回归事务
1 | public static void main(String[] args) { |