欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC知识点

程序员文章站 2022-05-29 15:58:48
...

JDBC

  • 概念:Java DataBase Connectivity ( Java 数据库连接 ) --> Java语言操作数据库
  • 本质:是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动 jar 包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类

快速入门

  • 步骤
    1. 导入驱动 jar 包
      1. 复制 mysql-connector-java.jar 到项目的 libs 目录下
      2. 右键 libs --> add as Library
    2. 注册驱动
    3. 获取数据库连接对象 Connection
    4. 定义 sql
    5. 获取执行 sql 语句的对象 Statement
    6. 执行 sql,接收返回结果
    7. 处理结果
    8. 释放资源
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");

//2.获取数据库对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root1901");

//3.定义 sql 语句
String sql = "update laptop set speed = 130 where model = 2001";

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

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

//6.处理结果
System.out.println(count);

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

各个对象详解

DriverManager(驱动管理对象)

  1. 注册驱动:告诉程序该使用哪一个数据库驱动 jar
    • static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager
    • 使用方法:Class.forName("com.mysql.jdbc.Driver");
    • 注意:mysql 5 之后的 jar 包可以省略注册驱动的步骤
  2. 获取数据库连接
    • 方法:static Connection getConnection(String url,String user,String password);
    • 参数
      • Url:指定连接的路径
        • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
        • 例子:jdbc:mysql://localhost:3306:db1
        • 细节:如果连接的是本机的 mysql 服务器,并且 mysql 服务端默认端口是 3306,则 url 可以简写为 jdbc:mysql:///数据库名称
      • user:用户名
      • password:密码
      • 实例:Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");

Connection(数据库连接对象)

  1. 功能
    1. 获取执行 sql 的对象
      • Statement createStatement()
      • PreparedStatement prepareStatement(String sql)
    2. 管理事务
      • 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为 false,即开启事务
      • 提交事务:commit()
      • 回滚事务:rollback()

Statement(执行 sql 的对象)

  1. 执行 sql
    1. boolean execute(String sql):可以执行任意的 sql (了解即可)
    2. int executeUpdate(String sql):执行 DML(insert、update、delete) 语句、DDL(create、alter、drop) 语句
    3. ResultSet executeQuery(String sql):执行 DQL(select) 语句

ResultSet(结果集对象,封装查询结果)

  • next():游标向下移动一行(mysql数据库的下一行),判断当前行是否是最后一行末尾(如果是返回false,如果不是返回true)
  • getXxx(参数):获取数据
    • Xxx:代表数据类型
      • 如:int getInt(), String getString()
    • 参数:
      • Int:代表列的编号,从1开始。如:getString(1)
      • String:代表列的名称。如:getDouble(“salary”);

PrepareStatement(执行 sql 的对象)

  1. SQL注入问题:在拼接 sql 时,有一些 sql 的特殊关键字参与字符串的拼接。会造成安全性问题
  2. 解决 sql 注入问题:使用 PrepareStatement 对象来解决
  3. 预编译的 SQL:参数使用 ? 作为占位符
  4. 步骤
    1. 导入驱动 jar 包
    2. 注册驱动
    3. 获取数据库连接对象 Connection
    4. 定义 sql
      • 注意:sql的参数使用 ? 作为占位符。如:select * from user where username = ? and password = ?;
    5. 获取执行 sql 语句的对象 PrepareStatement Connection.prepareStatement(String sql)
    6. 给 ? 赋值
      • 方法:setXxx(参数1,参数2)
      • 参数1:? 的位置,编号从1开始
      • 参数2:? 的值
    7. 执行 sql,接收返回结果
    8. 处理结果
    9. 释放资源
  • 注意:后期都会使用 PrepareStatement 来完成增删改查的所有操作
    • 可以防止 SQL 注入
    • 效率更高

抽取JDBC工具类:JDBCUtils

JDBC控制事务

  • 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
  • 使用 Connection 对象来管理事务
    • 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为 false,即开启事务
      • 在执行 sql 之前开启事务
    • 提交事务:commit()
      • 当所有 sql 都执行完提交事务
    • 回滚事务:rollback()
      • 在 catch 中回滚事务

数据库连接池

  • 概念:其实就是一个容器(集合),存放数据库连接的容器
    • 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
  • 好处
    • 节约资源
    • 用户访问高效
  • 实现
    • 标准接口:DataSource javax.sql包下的
      • 方法:获取连接:getConnection()
      • 归还连接:如果连接对象 Connection 是从连接池中获取的,那么调用 Connection.close()方法,则不会再关闭连接了,而是归还连接
    • 一般我们不去实现它,由数据库厂商实现
      • C3P0:数据库连接池技术
      • Druid:数据库连接池实现技术,由阿里巴巴提供

C3P0:数据库连接池技术

  • 步骤
    1. 导入 jar 包(两个):c3p0.jar 和 machange-commons-java.jar(不要忘记导入数据库驱动 jar 包)
    2. 定义配置文件:
      • 名称:c3p0.properties 或者 c3p0-config.xml
      • 路径:直接将文件放在 src 目录下即可
    3. 创建核心对象:数据库连接池对象 CombpPooledDataSource
    4. 获取连接:getConnection
//1.创建数据库连接池对象(使用默认配置)
DataSource ds = new ComboPooledDataSource();
//1.1创建数据库连接池对象(使用指定配置)
DataSource ds1 = new ComboPooledDataSource("otherc3p0");

//2.获取连接对象
Connection conn = ds.getConnection();

Druid:数据库连接池实现技术

  • 步骤
    1. 导入 jar 包:druid.jar
    2. 定义配置文件
      • 是 properties 形式的
      • 可以叫任意名称,可以放在任意目录下
    3. 获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
//1.导入 jar 包
//2.定义配置文件
//3.加载配置文件
Properties pro = new Properties();
InputStream is =DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);

//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);

//5.获取连接
Connection conn = ds.getConnection();
  • 定义工具类
    • 定义一个类 JDBCUtils
    • 提供静态代码块加载配置文件,初始化连接池对象
    • 提供方法
      • 获取连接方法:通过数据库连接池获取连接
      • 释放资源
      • 获取连接池的方法
public class JDBCUtils {
  private static DataSource ds;
  
  static {
    try{
      //1.加载配置文件
      Properties pro = new Properties();
      pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
      //2.获取 DataSource
      ds = DruidDataSourceFactory.createDataSource(pro);
    } catch (IOException e){
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  
  //获取连接
  public static Connection getConnection() throws SQLException {
    return ds.getConnection();
  }
  
  //释放资源
  public static void close(Statement stmt,Connection conn){
    if(stmt != null){
      try{
        stmt.close();
      } catch (SQLException e){
        e.printStackTrace();
      }
    }
    if(conn != null){
      try{
        conn.close(); //归还连接
      } catch (SQLException e){
        e.printStackTrace();
      }
    }
  }
  
  public static void close(ResultSet rs, Statement stmt,Connection conn){
    if(rs != null){
      try{
        rs.close();
      } catch (SQLException e){
        e.printStackTrace();
      }
    }
    if(stmt != null){
      try{
        stmt.close();
      } catch (SQLException e){
        e.printStackTrace();
      }
    }
    if(conn != null){
      try{
        conn.close(); //归还连接
      } catch (SQLException e){
        e.printStackTrace();
      }
    }
  }
  
  //获取连接池的方法
  public static DataSource getDataSource(){
    return ds;
  }
}

Spring JDBC

  • Spring 框架对 JDBC 的简单封装。提供了一个 JDBCTemplate 对象简化 JDBC 的开发
  • 步骤
    1. 导入 jar 包
    2. 创建 JdbcTemplate 对象。依赖于数据源 DataSource
      • JdbcTemplate template = new JdbcTemplate(ds);
    3. 调用 JdbcTemplate 的方法来完成 CRUD 操作
      • update():执行DML语句:增、删、改、查语句
      • queryForMap():查询结果将结果集封装为 map 集合(将列名作为key,将值作为value,只能将一条记录封装为一个map集合)
        • 注意:这个方法查询的结果集长度只能是1
      • queryForList():查询结果将结果集封装为 list 集合
        • 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
      • query():查询结果,将结果封装为 JavaBean 对象
        • query的参数:RowMapper
          • 一般我们使用 BeanPropertyRowMapper 实现类。可以完成数据到 JavaBean 的自动封装
          • new BeanPropertyRowMapper<类型>(类型.class)
      • queryForObject():查询结果,将结果封装为对象
        • 一般用于聚合函数的查询
相关标签: 操作手册 jdbc