一、JDBC定义
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
数据库驱动:数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。
二、常用接口
- Driver接口
表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。
// mysql driver 实现的源码
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver()); // 类加载的时候就注册了,所以如果用注册方法注册驱动的话,其实是注册了两次。
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
- connect(url, properties): 连接数据库的方法。
URL语法: jdbc协议:数据库子协议://主机:端口/数据库
user: 数据库的用户名
password: 数据库用户密码
String url = "jdbc:mysql://localhost:3306/xxx";
Driver driver = new com.mysql.jdbc.Driver();
Properties prop = new Properties();
prop.setProperty("user",username);
prop.setProperty("password",password);
Connection connect = driver.connect(url,prop);
// DriverManager.getConnection方法对上面的东西进行了封装,所以通常用这个
- 推荐使用装载驱动方法
装载MySql驱动:Class.forName(“com.mysql.jdbc.Driver”);
装载Oracle驱动:Class.forName(“oracle.jdbc.driver.OracleDriver”);
- DriverManager类
驱动管理器类,用于管理所有注册的驱动程序
- registerDriver(driver) : 注册驱动类对象
- Connection getConnection(url,user,password); 获取连接对象
// getConnection 方法的源码
public static Connection getConnection(String url,
String user, String password) throws SQLException {
java.util.Properties info = new java.util.Properties();
if (user != null) {
info.put("user", user);
}
if (password != null) {
info.put("password", password);
}
return (getConnection(url, info, Reflection.getCallerClass()));
}
- Connection接口
- Statement createStatement() : 创建Statement对象
- PreparedStatement prepareStatement(String sql): 创建PreparedStatement对象
- CallableStatement prepareCall(String sql): 创建执行存储过程的CallableStatement对象
- setAutoCommit(boolean autoCommit):设置事务是否自动提交
- commit() :在链接上提交事务
- rollback() :在此链接上回滚事务
- Statement接口
用于执行静态的sql语句
- Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
|- int executeUpdate(String sql) : 执行静态的更新sql语句(DDL,DML)
|- ResultSet executeQuery(String sql) :执行的静态的查询sql语句(DQL) - PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
|- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)
|-ResultSet executeQuery() : 执行预编译的查询sql语句(DQL) - CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程
|-ResultSet executeQuery() : 调用存储过程的方法
- ResultSet接口
用于封装查询出来的数据
- getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
- getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
- getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
- getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
- getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据
- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动resultSet的最前面。
- afterLast() :移动到resultSet的最后面。
- 资源回收
ResultSet → Statement → Connection
三、例子
- 执行查询
String sql = "select * from tb_sx_partner";
// 判断是否有resultset返回
boolean execute = statement.execute(sql);
// 执行查询
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
resultSet.getString("id");
}
- 使用PreparedStatement执行sql语句
// 使用PreparedStatement执行sql语句
String sql = "INSERT INTO student(NAME,gender) VALUES(?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sqlPre);
preparedStatement.setString(1,"小明");preparedStatement.setString(2,"男");
int count = preparedStatement.executeUpdate();
四、事务
1.概念
事务使指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚
2. 特性
- 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 - 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 - 隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 - 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
- 事务的使用
// 设置开启手动事务,默认是自动的
connection.setAutoCommit(false);
// 处理语句 ...
// 提交
connection.commit();
// 回滚
connection.rollback();