JDBC

一、相关概念
1、 什么是JDBC
JDBC (Java Data Base Connectivity,java 数据库连接)是一种用于执行sql语句的java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成。
2、 JDBC架构
JDBC API支持两层和三层处理模型进行数据库访问,但一般的JDBC体系结构由两层组成:
JDBC API : 提供了应用程序对JDBC的管理连接
JDBC Driver API: 支持JDBC管理到驱动连接

3、数据库驱动

   安装好数据库之后,我们的应用程序并不能直接使用数据库,必须通过相应的数据库驱动程序,t通过数据库驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口的实现,即对Connection等接口的实现类的jar文件。

在这里插入图片描述

二、常用接口
1、Driver接口
Driver接口由数据库厂商提供,作为java开发人员,之需要使用Driver接口就可以了。在编程中要连接数据库必须先安装特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。
装载Mysql驱动:Class.forName(“com.mysql.jdbc.Driver”)
装载Oracle驱动:Class.forName(“oracle.jabc.driver.OracleDriver”)

2、DriverManager
这个类管理数据库驱动程序的列表。确定内容是否符合从java 应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC子啊一定子协议的第一个取定程序将别用来简历数据库连接。
3、Connection 接口
Connection 与特定数据库的连接(会话),在上下文中执行sql语句并返回结果。此接口有接触数据库的所有方法,连接对象便是通信上下文,即,与数据库中所有的通信都是通过此唯一的连接对象。

 DriverManager.getConnection(url,user,password) 方法来建立url 中定义的数据库来连接

 连接Mysql 数据库:Connection connection = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");
 其他数据库类似

 常用的方法:
             createStatement(): 创建向数据库发送sql的statement对象。
              prepareStatement(sql):创建相数据库发送预编译sql的PrepredStatement对象。
             prepareCall(sql) : 创建执行存储过程的callableStatement对象。
             setAutoCommit(boolean autoCommit) : 设置事务是否自动提交。
             commit() :在连接上提交事务
             rollback():在此连接上回滚事务

4、 Statement 接口
用于执行静态sql语句并返回它所生成结果的对象
三种Statement 类:
Statement 由createStatement创建,用于发送简单的sql语句(不带参数)
PreparedStatement 继承自Statement 接口,由prepareStatement(sql)创建,用于发送含有一个或者多个参数的sql语句。
PreparedStatement对象采用预编译,比Statement对象效率更高。并且可以防止sql注入。
CallableStatement: 继承自PreparedStatement接口,由方法prepareCall()创建,用于存储调用过程。
常用的Statement方法:
execute(String sql) 运行语句,返回是否有结果集
executeQuery(String sql) 运行select语句,返回ResulySet结果集
executeUpdate(String sql) 运行insert/delete/update 操作,返回更新的 行数。
addBatch(String sql) 把多条sql语句放到一个批处理中
executeBatch() 想数据库发送一批sql语句执行
5、ResultSet接口
查询结果集,提供了检索不同类型字段的方法,常用的有:
getString(int index) / getString(String columnName) 获得在数据库里是varchar ,char 类型的数据对象
getFloat
getDate
getBoolean
getObjejct
ResultSet还提供了对结果集进行滚动的方法:
next() 移动到下一行
previous() 移动到前一行
absolute(int row) 移动到指定行
beforeFirst()移动到ResultSet 的最前面
afterLast()移动到ResultSet 的最后面
使用后依次关闭对象及连接:ResultSet -> Statement ->Connection

三、使用JDBC步骤
加载JDBC驱动程序 -->建立数据库连接Connection --> 创建执行sql的语句Statement --> 处理执行结果 ResultSet --> 释放资源

  1. 注册驱动(一次即可)
    方式一:Class.forName(“com.Mysql.jdbc.Driver”);
    推荐使用该方式,不会对具体的驱动列产生依赖。
    方式二: DriverManager.registerDriver(com.mysql.jdbc.Driver);
    会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖
    2.建立连接
    Connection con = DriverManager.getConnection(url,uesr,password);

  2. 创建执行sql语句的Statement

//Statement
String id = “5”;
String sql = “delete from table where id=” + id;
Statement st = conn.createStatement();
st.executeQuery(sql);
//存在sql注入的危险
//如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录

//PreparedStatement 有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1’也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)
String sql = “insert into user (name,pwd) values(?,?)”;
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, “col_value”); //占位符顺序从1开始
ps.setString(2, “123456”); //也可以使用setObject
ps.executeQuery();

  1. 处理结果集ResultSet
    ResultSet rs = ps.executeQuery();
    while(rs.next()){
    rs.getString(“col_name”);
    rs.getInt(2);

}

5.释放资源

//数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
//都要加try catch 以防前面关闭出错,后面的就不执行了
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

四、 事务(ACID特点,隔离级别,提交,回滚)

事务的基本概念
一组要么同时成功,要么同时失败的sql语句,是数据库操作的一个基本执行单元。
事务开始于:
连接到数据库上,并执行一条DML语句(Insert/delete/update)。
前一个事务结束后,有输入了另外一条DML语句。
事务结束于:
执行commit或rollback 语句。
执行一条DCL语句,例如create table 语句,在次此情况下,会自动执行commit语句
执行一条DCL语句,例如grant语句,在此情况下,会自动自行commit语句
断开与数据库的连接
执行了一条DML语句,该语句失败了,在此情况下,会为这个无效的DML语句执行rollback。

事务的四大特点
–atomicity 原子性
表示一个事务内的所有操作是一个整体,要么全成功,哟啊么全失败
–consistency 一致性
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态
–isolation 隔离性
事务 查看数据时数据所处的状态,要么时另一个并发事务修改它之前的状态,要么是另一事物修改它之后的状态,事务不会查看中间状态的数据。
–durability 持久性
持久性事务完成之后,它对于系统的影响是永久性的
事务的隔离级别
–读取未提交数据
–读取已提交数据
–可重复读
–序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值