JDBC(数据库连接规范)

本文详细介绍了JDBC(Java Database Connectivity),包括概述、入门案例、相关API详解,如DriverManager、Connection、Statement和ResultSet。还讨论了增删改查操作、SQL注入攻击、PreparedStatement的使用以及连接池的原理和实践,如C3P0和Druid。最后,文章探讨了自定义连接池的实现,涉及设计模式和动态代理。
摘要由CSDN通过智能技术生成

JDBC

1. 概述

  • 概念
    • JDBC(Java DataBase Connectivity java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的
  • 本质
    • 其实就是java官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接
  • 驱动
    • 就是各个数据库厂商针对JDBC提供的实现类
  • 使用
    • 使用肯定是使用的实现类,也就是驱动,但学习的是接口

2. 入门案例

  • 导入jar包
    • mysql-connector-java-5.1.37-bin.jar
  • 注册驱动
    • Class.forName("com.mysql.jdbc.Driver");
  • 获取数据库连接
    • Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称","root","root");
  • 获取执行者对象
    • Statement stat = conn.createStatement();
  • 执行sql语句并返回结果
    • ResultSet rs = stat.executeQuery(sql语句);
    • ResultSet rs = stat.executeUpdate(sql语句);
  • 处理结果
    • while(rs.next){rs.getInt|getString("字段名")}
  • 释放资源
    • conn.close(); stat.close(); rs.close();

3. 相关API详解

3.1 DriverManager
  • DriverManager驱动管理对象
    • 注册驱动
      • 注册给定的驱动程序:static void registerDriver(Driver driver);
      • 写代码使用:Class.forName("com.mysql.jdbc.Driver");
      • 在com.mysql.jdbc.Driver类中存在静态代码块
        static{
                 
            try{
                 
                java.sql.DriverManager.registerDriver(new Driver());
            }catch (SQLException E){
                 
                throw new RuntimeException("Can't register driver!");
            }
        }
        

        注意

        • 我们不需要通过DriverManager调用静态方法registerDriver(),因为只要Driver类被使用,则会执行其静态代码块完成注册驱动
        • mysql5之后可以省略注册驱动的步骤,在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver
    • 获取数据库连接
      • 获取数据库连接对象:static Connection getConnection(String url,String user,String password);
      • 返回值:Connection数据库连接对象
      • 参数:url:协议://IP地址:端口号/数据库名称;user:账号;passsword:密码
3.2 Connection
  • Connection数据库连接对象
    • 获取执行者对象
      • 获取普通执行者对象:Statement createStatement();
      • 获取预编译执行者对象:PreparedStatement prepareStatement(String sql);
    • 管理事务
      • 开启事务:setAutoCommit(boolean autoCommit);参数为false,则开启事务
      • 提交事务:commit();
      • 回滚事务:rollback();
    • 释放资源
      • 立即将数据库连接对象释放:void close();
3.3 Statement
  • Statement执行sql语句的对象
    • 执行DML语句:int executeUpdate(String sql);
      • 返回值int:返回影响的行数
      • 参数sql:可以执行insert、update、delete语句。
    • 执行DQL语句:ResultSet executeQuery(String sql);
      • 返回值ResultSet:封装查询的结果
      • 参数sql:可以执行select语句
    • 释放资源
      • 立即将数据库连接对象释放:void close();
3.4 ResultSet
  • ResultSet结果集对象
    • 判断结果集中是否还有数据:boolean next();
      • 有数据返回值true,并将索引向下移动一行
      • 没有数据返回false
    • 获取结果集中的数据:XXX getXxx("列名");
      • XXX代表数据类型(要获取某列数据,这一列的数据类型)
    • 释放资源
      • 立即将数据库连接对象释放:void close();

4. 增删改查练习

4.1 项目结构

4.2 查询所有
@Test
    public void testFindAll() throws Exception {
   
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db5", "root", "root");
        //3,获取sql语句执行对象
        Statement stat = conn.createStatement();
        //4,定义sql语句
        String sql = "select * from stu";

        //5,执行sql语句
        ResultSet rs = stat.executeQuery(sql);

        //6,处理结果集
        while(rs.next()) {
   
            System.out.println(rs.getInt("id") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getString("address"));
        }

        //7,释放资源
        rs.close();
        stat.close();
        conn.close();
    }
4.3 根据id查询
@Test
 public void testFindById() throws Exception {
   
     //1,注册驱动
     Class.forName("com.mysql.jdbc.Driver");
     //2,获取连接对象
     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db5", "root", "root");
     //3,获取sql语句执行对象
     Statement stat = conn.createStatement();
     //4,定义sql语句
     String sql = "select id,name,age,address addr from stu where id = 1";
     //5,执行sql语句
     ResultSet rs = stat.executeQuery(sql);

     while(rs.next()) {
   
         //6,处理结果
         System.out.println(rs.getInt("id") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getString("addr"));
     }
     //7,释放资源
     rs.close();
     stat.close();
     conn.close();
 }
4.4 添加数据
@Test
public void testInsert()  throws Exception {
   
    //1,注册驱动
    Class.forName(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值