JDBC(java database connectivity): sun公司为了简化和统一java连接数据库,定义的一套规范(API,接口).
JDBC和驱动的关系
接口(JDBC)与实现(驱动jar包)的关系
Jdbc 规范(大量接口,少量的类)
驱动 实现
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
public class Test {
public static void main(String[] args) throws Exception{
// 需求:查询所有的用户, 输出到控制台
// 分析:
// 1.创建项目,拷贝驱动jar包到模块下,并添加到classpath路径中
// 2.注册驱动
//DriverManager.registerDriver(new Driver()); //5版本注册2次
Class.forName("com.mysql.jdbc.Driver");
// 3.获得连接
String url = "jdbc:mysql://localhost:3306/day20_1";
String username = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url,username,password);
// 4.创建执行sql的对象
Statement statement = connection.createStatement();
// 5.执行sql语句,处理结果
String sql = "select * from user";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
// 取出来
//System.out.print(resultSet.getObject("id")+" ");
//System.out.print(resultSet.getObject("username")+" ");
//System.out.print(resultSet.getObject("password")+" ");
//System.out.println(resultSet.getObject("nickname"));
System.out.print(resultSet.getObject(1)+" ");
System.out.print(resultSet.getObject(2)+" ");
System.out.print(resultSet.getObject(3)+" ");
System.out.println(resultSet.getObject(4));
System.out.println("------------------------------------------------");
}
// 6.释放资源
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
}
}
DriverManager 类
用于管理一组JDBC驱动程序的基本服务
注意:JDBC 2.0 API中新增的javax.sql.DataSource接口提供了另一种连接数据源的方式。使用DataSource对象是连接到数据源的首选方法。
DriverManager 常用方法
//注册驱动
public static synchronized void registerDriver(java.sql.Driver driver)
5版本 翻阅源码发现,通过API的方式注册驱动,Driver会new两次,所有推荐这种写法:
Class.forName(“com.mysql.jdbc.Driver”); //当前就理解成 可以让com.mysql.jdbc.Driver里面的静态代码块执行
//与数据库建立连接
public static Connection getConnection(String url, String user, String password)
Connection 接口
与特定数据库的连接(会话)。在连接的上下文中执行SQL语句并返回结果
Connection 常用方法
//创建一个Statement对象,用于向数据库发送SQL语句。
//不带参数的SQL语句通常使用Statement对象执行。如果多次执行同一SQL语句,则
//使用PreparedStatement对象可能更有效
Statement createStatement() throws SQLException
//创建一个PreparedStatement对象,用于将参数化的SQL语句发送到数据库。(防止SQL注入)
PreparedStatement prepareStatement(String sql)
throws SQLException
//参数是true或false 如果设置为false,
//表示关闭自动提交,相当于开启事务; 类似sql里面的 start transaction;
void setAutoCommit(boolean autoCommit)
//提交事务; 类似sql里面的 commit;
void commit()
//回滚事务; 类似sql里面的 rollback;
void rollback()
接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的
Statement 接口
用于执行静态SQL语句并返回其生成的结果的对象。
Statement 常用方法
//根据查询语句返回结果集。只能执行**select**语句。
ResultSet executeQuery(String sql)
//根据执行的DML(insert update delete)语句,返回受影响的行数。
int executeUpdate(String sql)
//此方法可以执行任意sql语句。返回boolean值. 【了解】
true: 执行select有查询的结果
false: 执行insert, delete,update, 执行select没有查询的结果
boolean execute(String sql)
ResultSet 接口
表示数据库结果集的数据表,通常是通过执行查询数据库的语句生成的。
ResultSet对象维护一个指向当前数据行的游标。最初,游标定位在第一行之前。next() 方法将光标移动到下一行,因为当ResultSet对象中没有更多的行时,它返回false,所以可以在while循环中使用它来遍历结果集。
1、Object getObject(int columnIndex) //根据列索引获取 从1开始
Object getObject(String columnLabel) //根据列名获取
//1、将光标从当前位置向前移动一行
//2、当调用next方法返回false时,游标被定位在最后一行之后。此后,ResultSet//方法(除了next方法)调用都将导致抛出SQLException异常。如果结果集类型是TYPE_FORWARD_ONLY,
//则由供应商指定它们的JDBC驱动程序实现是返回false还是在后续调用next时抛出SQLException。
2、boolean next()
int getInt(int colIndex) //以int形式获取ResultSet结果集当前行指定列号值
int getInt(String colLabel) //以int形式获取ResultSet结果集当前行指定列名值**
float getFloat(int colIndex) //以float形式获取ResultSet结果集当前行指定列号值
float getFloat(String colLabel) //以float形式获取ResultSet结果集当前行指定列名值**
String getString(int colIndex) //以String 形式获取ResultSet结果集当前行指定列号值
String getString(String colLabel) //以String形式获取ResultSet结果集当前行指定列名值**
Date getDate(int columnIndex); //以Date 形式获取ResultSet结果集当前行指定列号值
Date getDate(String columnName); //以Date形式获取ResultSet结果集当前行指定列名值**
void close() //关闭ResultSet 对象
一般根据列名获取
preparedStatement 接口
表示预编译SQL语句的对象,是Statemen 接口的子接口。
SQL语句被预编译并存储在PreparedStatement对象中。然后可以使用该对象多次有效地执行该语句。
特点:
- 性能要比Statement高
- 会把sql语句先编译,格式固定好,
- sql语句中的参数会发生变化,过滤掉用户输入的关键字(eg: or)
preparedStatement 常用方法
1 通过 Connection 对象创建
Connection 方法:
//创建prepareStatement对象
//sql表示预编译的sql语句,如果sql语句有参数通过?来占位
PreparedStatement prepareStatement(String sql)
SELECT * FROM user WHERE username = ? AND password = ?
2 设置参数
//将指定的参数设置为给定的Java字符串值。当它发送到数据库时,驱动程序将其转换//为SQL VARCHAR或LONGVARCHAR值(取决于参数的大小相对于驱动程序对VARCHAR值的限制)
// parameterIndex 第一个参数是1,第二个是2,
void setString(int parameterIndex, String x)
//参数1 i 指的就是问号的索引(指第几个问号,从1开始),参数2就是值
void set类型(int i,Object obj);
eg: prepareStatement.setString(1,“zs”);
prepareStatement.setString(2,“123456”);
3 执行
//在这个PreparedStatement对象中执行SQL查询,并返回由查询生成的ResultSet对象
ResultSet executeQuery()
//执行这个PreparedStatement对象中的SQL语句,该语句必须是SQL数据操作语言
//(DML)语句,例如INSERT、UPDATE或DELETE;或者不返回任何内容的SQL语句,例如DDL语句
//返回SQL数据操作语言(DML)语句的行数,不返回任何内容的SQL语句为0
int executeUpdate();执行增删改语句
步骤:
- 注册驱动
- 获得连接
- 创建预编译SQL语句对象
- 设置参数
- 执行sql语句
- 释放资源