jdbc

jdbc

  • jdbc就是用java操作关系型数据库的一套API

jdbc快速入门

  • 注册驱动

    //mysql8
    Class.forName("com.mysql.cj.jdbc.Driver");
    //mysql5
    Class.forName("com.mysql.jdbc.Driver");
    
  • 获取连接对象

    String url = "jdbc:mysql://127.0.0.1:3306/test";
    String username = "root";
    String password = "123456";
    Connection connection = DriverManager.getConnection(url, username, password);
    
  • 定义sql

    String sql = "";
    
  • 获取执行sql的对象

    Statement statement = connection.createStatement();
    
  • 执行sql

    int count = statement.executeUpdate(sql);
    
  • 处理结果

    System.out.println(count);
    
  • 释放资源

    statement.close();
    connection.close();
    

jdbc API详解

  • DriverManager

    • 注册驱动

      //mysql8
      Class.forName("com.mysql.cj.jdbc.Driver");
      //mysql5
      Class.forName("com.mysql.jdbc.Driver");
      //forName()方法将类加载到内存
      //而java的机制决定了一个类第一次加载到内存中会自动执行静态代码块
      //Driver的静态代码块中完成了驱动的注册
      
      //mysql5之后的驱动,可以省略此行代码,自动加载
      

      Driver类源码

      static {
              try {
                  DriverManager.registerDriver(new Driver());
              } catch (SQLException var1) {
                  throw new RuntimeException("Can't register driver!");
              }
          }
      
    • 获取连接

      public static Connection getConnection(String url, String username, String password)
      

      参数

      • url:连接路径

        语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
        示例:jdbc:mysql://127.0.0.1:3306/test
        如果连接的是本机mysql服务,并且是默认端口3306,则url可简写为:jdbc:mysql:///数据库名称
        可以配置useSSL=false参数,禁用安全连接方式
        
      • username:用户名

      • password:连接密码

  • Connection

    • 获取执行SQL的对象

      • 普通的执行SQL的对象

        Statement createStatement()
        
      • 预编译SQL的执行SQL的对象——防止SQL注入

        PreparedStatement prepareStatement(String sql)
        
      • 执行存储过程的对象

        CallableStatement prepareCall(String sql)
        
    • 事务管理

      • MySQL事务管理

        开启事务: BEGIN;/START TRANSACTION;
        提交事务: COMMIT;
        回滚事务: ROLLBACK;
        
        MySQL默认自动提交事务
        
      • JDBC事务管理:Connection中定义了3个对应的方法

        //开启事务 true为自动提交事务
        void setAutoCommit(boolean autoCommit)
        //提交事务
        void commit()
        //回滚事务
        void rollback()
        
      • 示例

        try {
                // 开启事务
                connection.setAutoCommit(false);
                // 执行sql
                // 处理结果
        
                //提交事务
                connection.commit();
            } catch (Exception e) {
                // 回滚事务
                connection.rollback();
                e.printStackTrace();
            }
        
  • Statement

    执行sql语句

    • 执行DML、DDL语句

      int executeUpdate(String sql)
      //返回值:
      //DML语句影响的行数
      //DDL语句执行后,也可能返回0,一般不出现异常即认为正常完成了执行
      
    • 执行DQL语句

      ResultSet executeQuery(String sql)
      //返回值:Resultset 结果集对象
      
  • ResultSet

    • 封装了DQL查询的结果

    • 获取查询结果

      boolean next()
      //将游标从当前位置向后移动一行,并判断当前行是否有效
      //返回值:true:有效行,当前行有数据;false:无效行,当前行无数据
      
      xxx getXxx(参数)
      //获取数据
      //xxx:数据类型
      //参数:int:列的编号(从1开始);String:列的名称
      
      while (resultSet.next()) {
      	//获取数据
      }
      
  • PreparedStatement

    预编译SQL语句并执行:预防SQL注入问题

    SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码攻击服务器的目的

    • 获取PreparedStatement对象

      //SQL语句中的参数,用?占位符替代
      PreparedStatement preparedStatement = connection.prepareStatement(sql);
      //通过Connection对象获取,并传人对应的sql语句
      ResultSet resultSet = preparedStatement.executeQuery(sql);
      
    • 设置参数值

      PreparedStatement对象:setXxx(参数1, 参数2)	给?赋值
      Xxx:数据类型
      参数1?的位置编号,从1开始
      参数2?的
    • 执行SQL

      //不需要再传入sql
      preparedStatement.executeQuery()
      preparedStatement.executeUpdate()
      

    PreparedStatement优点:

    • 预编译SQL,性能更好

      在获取连接对象的url中加入参数:useServerPrepStmts=true
      
    • 防止SQL注入:将敏感字符进行转义

    PreparedStatement原理:

    • 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译
    • 执行时就不用再执行这些步骤了
    • 如果sql模板一样,则只需要进行一次检查、编译

数据库连接池

  • 数据库连接池简介

    数据库连接池是个容器,负责分配、管理数据库连接

    他允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

    释放一个空闲时间超过最大空闲时间的数据库连接,从而避免因为没有释放数据库连接引起的数据库连接遗漏

    优点:

    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏
  • 数据库连接池实现

    标准接口:DataSource

    官方(SUN)提供的数据库连接池标准接口

    常见的数据库连接池:

    • DBCP
    • C3P0
    • Druid
  • Druid使用步骤

    • 定义配置文件

      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/test?useServerPrepStmts=true
      username: root
      password: 123456
      # 初始化连接数量
      initialSize: 5
      # 最大连接数
      maxActive: 10
      # 最大等待时间(ms)
      maxWait: 3000
      
    • 导入配置文件

    • 获取数据库连接池对象

    • 获取连接

    // 定义配置文件、加载配置文件
    Properties properties = new Properties();
    properties.load(new FileInputStream("src/main/resources/druid.yml"));
    //获取连接池对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    //获取数据库连接
    Connection connection = dataSource.getConnection();
    
    • 详细配置

      配置 缺省值 说明
      name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this)
      jdbcUrl 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
      username 连接数据库的用户名
      password 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/使用ConfigFilter
      driverClassName 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下)
      initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
      maxActive 8 最大连接池数量
      maxIdle 8 已经不再使用,配置了也没效果
      minIdle 最小连接池数量
      maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
      poolPreparedStatements false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
      maxOpenPreparedStatements -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
      validationQuery 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
      testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
      testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      timeBetweenEvictionRunsMillis 有两个含义: 1) Destroy线程会检测连接的间隔时间2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
      numTestsPerEvictionRun 不再使用,一个DruidDataSource只支持一个EvictionRun
      minEvictableIdleTimeMillis
      connectionInitSqls 物理连接初始化的时候执行的sql
      exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接
      filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
      proxyFilters 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系
posted @   Lerjiu  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示