JDBC

98 阅读2分钟

序言

JDBC就是使用Java语言操作关系型数据库的一套API

一共就7行:

1.注册驱动
Class.forName("com.mysql.jdbc.Driver");

2.获取连接对象
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);

3.定义SQL语句
String sql = "update account set money = 2000 where id = 1";

4.获取执行sql的对象
Statement stmt = conn.createStatement();

5.执行sql
int count = stmt.executeUpdate(sql);

6.处理结果集
...

7.释放资源
stmt.close();
conn.close();

JDBC简介

JDBC是一套Java代码,可以用来操作不同的关系型数据库,比如MySql、Oracle、DB2。

JDBC只提供接口,具体的实现类由不同的数据库提供,他们提供的实现类也就是:驱动

图片.png

JDBC快速入门

  1. 创建工程,导入驱动jar包

  2. 注册驱动

驱动是导入了,但是代码不识别驱动呀,所以需要我们注册一下

Class.forName("com.mysql.jdbc.Driver")

  1. 获取连接 Connection conn = DriverManager.getConnection(url,username,password)

  2. 定义SQL语句 String sql = "update..."

  3. 获取执行SQL对象 Statement stmt = conn.createStatement()

  4. 执行SQL

其实就是把执行语句发送给mysql,让mysql数据库执行语句,然后将结果返回过来。

stmt.executeUpdate(sql)

  1. 处理返回结果

  2. 释放资源

JDBC API详解

  1. DriverManager

1.注册驱动

我们通过Class.forName("com.mysql.jdbc.Driver")的时候,本质上是通过DriverManager来实现注册驱动的,随着Driver类的加载,自动执行DriverManager

图片.png

在mysql5之后(jar包在5版本上),就可以不用写Class.forName。在jar包的META-INF中帮我们书写好了。

图片.png

2.获取数据库连接

图片.png

图片.png

  1. Connection

1.获取执行SQL对象

图片.png

2.事务管理

图片.png

在执行sql之前,开启事务。
并在执行完sql后,提交事务。
如果出现异常,就需要回滚事务。

图片.png

  1. Statement

执行SQL语句:DDL:对表、库进行操作。DML:对数据的增删改操作。DQL:数据的查询操作

图片.png

  1. ResultSet(对查询结果进行封装)

封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql)

获取到的查询结果会被封装起来,封装后的查询结果集会有一个游标,游标从0开始,所以第一个数据是下标1.

图片.png

Connection conn = DriverManager.getConnection(url,username,password)

String sql = "select * from account"

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql)

while(rs.next()){
    //获取数据,列的下标是从1开始的
    //我数据库中就3列数据,所以用三个类型
    int id = rs.getInt(1);
    String name = rs.getString(2);
    double money = rs.getDouble(3);
}

//也可以通过列名称获取
while(rs.next()){
    int id = rs.getInt("id")
    String name = rs.getString("name")
    double money = rs.getDouble("money")
}

将数据封装到Account对象实体类中

List<Account> list = new ArrayList<>();
while(rs.next()){
    Account account = new Account();
    
    int id = rs.getInt("id");
    String name = rs.getString("name");
    double money = rs.getDouble("money");
    
    account.setId(id);
    account.setName(name);
    account.setMoney(money);
    
    //存入集合
    list.add(account)
}
  1. PreparedStatement(Statement增强版)

图片.png

图片.png

用 ? 占位符来

String name = "zhangsan"
String pwd = "abc"

定义sql
String sql = "select * from tb_user where username = ? and password = ?"

获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql)

设置占位符?的值
前面是索引,对这个索引进行赋值是上方的name
pstmt.setString(1,name)
pstmt.setString(2,pwd)

//执行sql
ResultSet rs = pstmt.executeQuery()'
if(rs.next()){
    System.out.println()
}else{
    System.out.println()
}

释放资源
rs.close()
pstmt.close()
conn.close()

图片.png

数据库连接池

图片.png

数据库连接池实现

图片.png

不再通过DriverManager.getConnection,而是通过DataSource.getConnection

快速获取当前所在的文件路径:System.out.println(System.getProperty("user.dir"))

  1. 导入jar包

  2. 定义配置文件

图片.png

  1. 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("项目名称/src/druid.properties"))
  1. 获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  1. 获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);