JDBC
JDBC,java database connectivity 的简称,是一套java程序连接数据库的技术规范(API)。首先了解为什么要有这一套规范呢?因为我们有时候是需要连接不同的数据库,比如MySQL,Oracle等,而不同的数据库底层实现是不同的,那我们就需要写不同的连接程序,这样在维护起来非常的麻烦。而有了JDBC技术,我们就不需要关注具体是如何连接到数据库的,数据库厂商提供对应的数据库驱动就行了。
开发 JDBC需要java.sql和javax.sql包的支持,在javase中就有,因此不需要导包;例外还需要对应数据库驱动程序包,例如我需要连接mysql数据库,就需要导入mysql驱动包,可以到MySQL官网下载。开发一般有以下操作步骤:
1.加载驱动
2.建立连接
3.通过连接对象创建发送sql语句的执行对象
4.处理返回的结果集
5.关闭资源,这里有个原则:先创建的后关闭,后创建的先关闭
代码实现:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo1 {
private String url = "jdbc:mysql://localhost:3306/test";
private String user = "root";
private String password = "root";
public static void main(String[] args) throws Exception {
new Demo1().test();
}
public void test() throws Exception{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//根据URL得到连接对象
Connection connection = DriverManager.getConnection(url, user, password);
//获取发送sql语句的statement对象
Statement statement = connection.createStatement();
//执行
ResultSet resultset = statement.executeQuery("select *from user");
//处理结果集
while(resultset.next()){
String name = resultset.getString("name");
String password = resultset.getString("password");
System.out.println(name+":"+password);
}
//关闭资源
resultset.close();
statement.close();
connection.close();
}
}
可以查询到数据库:
JDBC核心API
|- Driver接口: 表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。
|- connect(url, properties): 连接数据库的方法。
url: 连接数据库的URL
URL语法: jdbc协议:数据库子协议://主机:端口/数据库
user: 数据库的用户名
password: 数据库用户密码
|- DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序
|-registerDriver(driver) : 注册驱动类对象
|-Connection getConnection(url,user,password); 获取连接对象
|- Connection接口: 表示java程序和数据库的连接对象。
|- Statement createStatement() : 创建Statement对象
|- PreparedStatement prepareStatement(String sql) 创建PreparedStatement对象
|- CallableStatement prepareCall(String sql) 创建CallableStatement对象
|- Statement接口: 用于执行静态的sql语句
|- int executeUpdate(String sql) : 执行静态的更新sql语句(DDL,DML)
|- ResultSet executeQuery(String sql) :执行的静态的查询sql语句(DQL)
|-PreparedStatement接口:用于执行预编译sql语句
|- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)
|-ResultSet executeQuery() : 执行预编译的查询sql语句(DQL)
|-CallableStatement接口:用于执行存储过程的sql语句(call xxx)
|-ResultSet executeQuery() : 调用存储过程的方法
|- ResultSet接口:用于封装查询出来的数据
|- boolean next() : 将光标移动到下一行
|-getXX() : 获取列的值
PreparedStatement用法:
public void test1(){
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, user, password);
//通过占位符预编译
PreparedStatement preparedStatement = connection.prepareStatement("insert into user values(?,?)");
//设置参数
preparedStatement.setString(1, "狗蛋");
preparedStatement.setString(2, "34");
//发送
int result = preparedStatement.executeUpdate();
if(result>0){
System.out.println("成功插入数据到user表");
}
} catch (Exception e) {
e.printStackTrace();
}
}
还可以通过CallableStatement调用数据库的存储过程:
public void test2(){
Connection connection = null;
CallableStatement callableStatement = null;
ResultSet resultset = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url, user, password);
//获取CallableStatement对象
callableStatement = connection.prepareCall("Call search");
//调用存储过程
resultset = callableStatement.executeQuery();
while(resultset.next()){
System.out.println(resultset.getString("name")+":"+resultset.getString("password"));
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
resultset.close();
callableStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
JDBC批处理
有时候需要向数据库发送大量的sql语句,应避免一条一条的发送,这样效率很低,我们可以使用批处理提高效率。
- 通过statement对象进行批处理,可以执行不同的sql语句:
addBatch(String sql) :添加sql
clearBatch(): 清空sql
executeBatch() :执行批处理
//1.使用Statement对象批处理
statement.addBatch("insert into user values('蛋蛋','1234')");
statement.addBatch("update user set name='池子' where name='张三'");
statement.executeBatch();
- 通过PreparedStatement对象可以发送参数不同的sql语句
JDBC事务管理
事务的概念:事务是指一组最小逻辑操作单元,由多个操作组成。
事务具有四个特性:
- 原子性:指事务是一个不可分割的操作单元,里面的操作要么全部发生,要么全部发生。
- 一致性:事务必须是数据库从一个一致性状态转换到另一个一致性状态。
- 持久性:指事务一旦提交,那么对数据库的影响是永久的
- 隔离性:事务之间是隔离的
我们在获取连接对象时是默认开启自动提交事务的,可以通过connection对象操作:
setAutoCommit(Boolean false):false表示设置手动提交事务,true表示自动提交事务
commit(): 提交事务
rollback() : 回滚事务
setPoint() :设置事务回滚到指定点