JDBC

271 阅读7分钟

JDBC

JDBC概念
  1. JDBC就是使用Java语言操作关系型数据库的一套API
  2. 全称:(Java DateBase Connectivity)Java数据库连接
JDBC本质
  1. 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
  2. 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  3. 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
JDBC好处:
  1. 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发。
  2. 可随时替换底层数据库,访问数据库的Java代码基本不变。

JDBC快速入门

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Arrays;

/*JDBC快速入门*/
public class JDBCDemo {
    public static void main(String[] args) throws Exception{
//        1.注释驱动
        Class.forName("com.mysql.jdbc.Driver");
//        2.获取连接
        String url="jdbc:mysql://127.0.0.1:3306/study";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);

//        3.定义SQL
        String sql="update emp set age =20 where id=6";

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

//        5.执行SQL
        int count=stmt.executeUpdate(sql);//返回值是受影响的行数

//       6. 处理数据
        System.out.println(count);

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

    }

}

JDBC API详解

DriverManager

1.DriverManager(驱动管理类)作用:

  • 注册驱动
  • 获取数据库连接

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

如果在连接数据库时报错,提示

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
`com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and 
manual loading of the driver class is generally unnecessary.

大概意思就是之前的com.mysql.jdbc.Driver 已经过时了,现在得用com.mysql.cj.jdbc.Driver加载驱动,而且驱动程序已经自动加载好了。之前看到过在Mysql5之后的驱动包都会自动加载驱动。

  • 查看Driver类源码
static{
    try{
        DriverManager.registerDriver(new Driver());
    }catch(SQLException var1){
        throw new RuntimeException("Can't register driver!");
    }   
}

提示

  • MySQL5之后的驱动包,可以省略注册驱动的步骤
  • 自动加载jar包中的META-INF/services/java.sql.Driver文件中的驱动类

3. 获取连接
static Connection          getConnection(string url,string user, string password)

  • 参数
  1. url: 连接路径

语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对18参数键值对2..
示例: jdbc:mysql://127.0.0.1:3306/db1
细节:

  • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则ur可以简写为: jdbc:mysql://数据库名称?参数键值对。
  • 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
    Sun Nov 20 12:56:09 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    这是在建议用安全性更高的SSL,但是如果没有配置的话可以设置useSSL=false
  1. user:用户名
  2. password:密码

则变成

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/*JDBC API 详解 DriverManager*/
public class JDBCDemo2_DriverManager {
    public static void main(String[] args) throws Exception{
//        1.注释驱动
//        Class.forName("com.mysql.jdbc.Driver");
//        2.获取连接:如果连接的是本机,并且端口是默认的3306,可以简化书写
        String url="jdbc:mysql:///study?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);

//        3.定义SQL
        String sql="update emp set age =20 where id=6";

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

//        5.执行SQL
        int count=stmt.executeUpdate(sql);//返回值是受影响的行数

//       6. 处理数据
        System.out.println(count);

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

1. Connection(数据库连接对象)作用

  1. 获取执行SQL的对象
  • 普通执行SQL对象
    Statement createStatement()
  • 预编译SQL的执行SQL对象: 防止SQL注入
    PreparedStatement prepareStatement (sql)
  • 执行存储过程的对象
    CallableStatement prepareCall (sql)
  1. 管理事务
  • MySQL事务管理

开启事务: BEGIN;/START TRANSACTION;
提交事务: COMMIT;
回滚事务: ROLLBACK;
MySQL默认自动提交事务

  • JDBC事务管理:Connection接口中定义了3个对应的方法

开启事务: setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动提交事务,即为开启事务
提交事务: commit()
回滚事务: rollback()

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/*JDBC API 详解 Connection*/
public class JDBCDemo3_Connection {
    public static void main(String[] args) throws Exception{
//        1.注释驱动
//        Class.forName("com.mysql.jdbc.Driver");
//        2.获取连接:如果连接的是本机,并且端口是默认的3306,可以简化书写
        String url="jdbc:mysql:///study?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);

//        3.定义SQL
        String sql2="update emp set age =20 where id=6";
        String sql1="update emp set age =20 where id=3";

//        4.获取执行SQL的对象statement
        Statement stmt =conn.createStatement();
        try {
//      开启事务
            conn.setAutoCommit(false);
//        5.执行SQL
            int count1=stmt.executeUpdate(sql1);//返回值是受影响的行数
//       6. 处理数据
            System.out.println(count1);
//        5.执行SQL
            int count2=stmt.executeUpdate(sql2);//返回值是受影响的行数
//       6. 处理数据
            System.out.println(count2);
//           提交事务
            conn.commit();
        } catch (Exception throwables) {
//            回滚事务
            conn.rollback();
            throwables.printStackTrace();
        }
//        7.释放资源
        stmt.close();
        conn.close();
    }
}
Statement
  • Statement作用:
  1. 执行SQL语句
  • 执行SQL语句

int     executeUpdate(sql): 执行DML、DDL语句
返回值: (1) DML语句影响的行数(2) DDL语句执行后,执行成功也可能返回0

ResultSet     executeQuery(sql): 执行DQL 语句
返回值: ResultSet 结果集对象

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/*JDBC API 详解 Statement*/
public class JDBCDemo4_Statement {
    /*
    * 执行DML语句
    * @throws Exception
    */
    @Test
    public void testDML() throws Exception{
        //        1.注释驱动
//        Class.forName("com.mysql.jdbc.Driver");
//        2.获取连接:如果连接的是本机,并且端口是默认的3306,可以简化书写
        String url="jdbc:mysql://127.0.0.1:3306/study";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);

//        3.定义SQL
        String sql="update emp set age =29 where id=6";

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

//        5.执行SQL
        int count=stmt.executeUpdate(sql);//执行玩DML语句后,返回值是受影响的行数

//       6. 处理数据
//        System.out.println(count);
        if(count>0){
            System.out.println("修改成功");
        }else{
            System.out.println("修改失败");
        }

//        7.释放资源
        stmt.close();
        conn.close();
    }
}
ResulSet
  • ResultSet(结果集对象)作用:
    1.封装了DQL查询语句的结果
    ResultSet stmt.executeQuery(sal): 执行DQL 语句,返回 ResultSet 对象
  • 获取查询结果
    boolean    next():
    (1)将光标从当前位置向前移动一行
    (2)判断当前行是否为有效行
    返回值:
    • true: 有效行,当前行有数据
    • false: 无效行,当前行没有数据
      XXX     getXxx(参数): 获取数据
      xxx: 数据类型;如: int getlnt(参数);String getString(参数)
      参数:
    • int: 列的编号,从1开始
    • String:列的名称
  • 使用步骤:
  1. 游标向下移动一行,并判断该行否有数据: next()
  2. 获取数据:getXxx(参数)
//循环判断游标是否是最后一行末尾  
 while(rs.next(){  
 //获取数据  
 rs.getXxx(参数);  
 }

数据库连接池

数据库连接池简介
  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接溃漏
  • 好处:
    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏
数据库连接池实现
  • 标准接口: DataSource
    • 官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
    • 功能:获取连接
      Connection getConnection()
  • 常见的数据库连接池:
    • DBCP
    • C3PO
    • Druid
  • Druid(德鲁伊)
    • Druid连接池是阿里巴巴开源的数据库连接池项目
    • 功能强大,性能优秀,是Java语言最好的数据库连接池之一
Driud使用步骤
  1. 导入jar包 druid-1.1.12.jar
  2. 定义配置文件
  3. 加载配置文件
  4. 获取数据库连接池对象
  5. 获取连接
Druid数据库连接池
package com.itheima.jdbc.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

/*
* Druid数据库连接池演示
* */
public class DruidDemo {
    public static void main(String[] args) throws Exception{
//        1.导入jar包
//        2.定义配置文件

//        3.加载配置文件
        Properties prop=new Properties();
        prop.load(new FileInputStream("D:/project/jdbc/jdbc-demo/src/druid.properties"));
//        4.获取连接池对象
       DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);

//        5.获取数据库连接Connection
        Connection connection=dataSource.getConnection();
        System.out.println(connection);
    }
}

配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///study?useSSL=false&useServerPrepStmts=true   /*study:所访问的数据库*/
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

数据库连接池.png

导入jar包步骤

  1. 复制jar包
  2. 粘贴至src
  3. 选中jar包,右键选中添加BOM,再选中模块