【JavaWeb】JDBC!虽然很少用,但基础必须学

388 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


一、概述

  • JDBC:Java DataBase Connectivity,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一的访问。
  • JDBC本身是Java连接数据的一个标准,是进行数据库连接的抽象层,由Java编写的一组类和接口组成,接口的实现由数据厂商完成。

二、基本操作

JDBC 的基本操作可以分为五个步骤:(简单五个字:贾琏欲执事)

  • 加载驱动
    • Class.forName();
    • 当驱动类被加载到内存时,会自动进行注册驱动
  • 获取连接对象
    • DriverManager.getConnection(url, username, password);
    • url:当使用本地数据库并且端口号为3306时,可以省略localhost:3306
  • 获取预编译语句对象
    • preparedStatement(sql);
  • 执行SQL语句
    • executeUpdate()
    • executeQuery()
  • 释放资源
    • close()
@Test 
public void test() throws Exception { 
    String sql = "INSERT INTO student(name, email, age) VALUES('xiaoyi', 'xiaoyi@', 20)"; 
    // 1 加载注册驱动 
    Class.forName("com.mysql.jdbc.Driver"); 
    // 2 获取连接对象 
    Connection conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "admin"); 
    // 3 获取语句对象 
    Statement st = conn.createStatement(); 
    // 4 执⾏语句 
    st.executeUpdate(sql); 
    // 5 释放资源 
    st.close(); 
    conn.close(); 
}

三、事务

  1. 事务(transaction,简写tx):事务是一组完整的逻辑单元,由多条DML语句组成,这些语句要么同时成功,要么同时失败。比如张三向李四转账100元,那么要从张三账户减少100,从李四账户增加100,这两个步骤只能同时成功或同时失败。

  2. 事务的属性(ACID)

    • 原子性:事务是一个独立的工作单元,是不可分割的
    • 一致性:在同一个事务中,所有操作必须同时成功,或者同时失败,必须保证事务的一致性
    • 隔离性:一个事务的执行不会被其它事务干扰,事务之间是相互隔离的
    • 持久性:一个事务一旦提交,对该数据库的操作就会被持久地保存到数据库中,即使发生故障也不会丢失这些操作
  3. 使用事务的步骤

    • 开启事务:将自动提交事务改为手动提交
    • 对数据库进行DML操作
    • 若没有问题则提交事务(commit)
    • 否则,进行回滚(rollback),数据库管理系统将放弃开启事务之后的所有操作
      • rollback()不仅是回滚,也是释放连接上的锁
  4. 注意事项

    • 默认情况下,事务在DML操作之后是自动提交的,因此,使用事务时,需改为手动提交(setAutoCommit())
    • 虽然查询操作不需要事务,但一般都将查询操作写在事务当中
    • 代码正确,没有异常,数据库数据不变,可能是因为没有提交事务
    • 在MySQL中,只有InnoDB存储引擎支持事务和外键,MyISAM都不支持
  5. 模板

    try {
        Class.forName("com.mysql.jdbc.Driver"); 
        Connection conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "admin"); 
        // 将事务的提交机制设置为手动提交
        conn.setAutoCommit(false);
        // 操作...
        // 手动提交事务
        conn.commit();
    } cathc (Exception e) {
        // 回滚事务
        conn.rollback();
    }
    

四、连接池

  1. 采用之前的获取连接方式,每一次连接都需要进行一些验证,并且用完之后就直接 close 了,这不仅耗费很多时间,也造成了资源浪费,因此就出现了连接池,连接池能够充分地利用连接对象

  2. 连接池的属性

    属性说明
    driverClassName数据库驱动名称
    url连接数据库的url
    username连接数据库的用户名
    password连接数据库的密码
    initialSize初始化连接池连接对象个数
    maxActive最大连接池个数(8)
  3. 在Java中,连接池使用 javax.sql.DataSource 接口表示,由数据库厂商进行实现

  4. 常见连接池

    • DBCP
    • Druid
  5. Druid连接池使用步骤

    • 创建连接池对象
    • 设置连接池连接数据库的属性
    • 初始化创建连接个数
    • 获取连接
@Test 
public void test() throws Exception { 
    // 1.创建⼀个连接池对象 
    DruidDataSource ds = new DruidDataSource(); 
    // 2.设置链接数据库的四个属性 
    ds.setDriverClassName("com.mysql.jdbc.Driver"); 
    ds.setUrl("jdbc:mysql://localhost:3306/jdbcdemo"); 
    ds.setUsername("root"); 
    ds.setPassword("admin"); 
    // 3.初始化创建连接的个数 
    ds.setInitialSize(5); 
    // 4.从连接池中获取⼀个链接对象 
    Connection conn = ds.getConnection();
}