java 笔记(javaWeb阶段) - JDBC

一、JDBC 简介

image.png

二、JDBC 使用步骤

image.png

代码:

package cn.test.jdbc;

import java.sql.*;

/*
当前mysql版本是 5.5.28
jdbc快速入门
*/
public class jdbcDemo1 {
    public static void main(String[] args) throws SQLException {
        // 1.导入驱动jar包右键选择Add as Library
        // 2.注册驱动
        //Class.forName("com.mysql.jdbc.Driver"); // MySQL 5 之后的驱动包可以省略,会自动加载

        // 3.获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db1", "root", "root");
        // 4.定义sql语句
        String sql = "update student set age=20 where id=1";
        // 5.获取执行sql对象的 statement
        Statement statement = connection.createStatement();
        // 6.执行sql
        int resultSet = statement.executeUpdate(sql); // 返回的实际受影响行数
        // 7.处理结果
        System.out.println(resultSet);
        // 8.释放资源
        statement.close(); // 先释放statement
        connection.close();
    }
}

注意:需要先下载并导入mysql的驱动包

三、JDBC API 详解

1.DriverManager

  • 注册驱动 DriverManager.registerDriver

上面 Class.forName("com.mysql.jdbc.Driver") 里面可以看到源码里面是静态代码块里面调用了 registerDriver 方法来注册驱动

  • 获取数据库连接对象 DriverManager.getConnection
image.png

2.Connection

  • 获取执行 SQL 的对象
image.png
  • 管理事务
image.png
package cn.test.jdbc;

import java.sql.*;

/*
当前mysql版本是 5.5.28
jdbc快速入门
*/
public class jdbcDemo1 {
    public static void main(String[] args) throws SQLException {
        shiWu();
    }

    // jdbc 事务处理
    public static void shiWu() throws SQLException {
        // 获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db1", "root", "root");

        //获取执行sql对象的 statement
        Statement statement = connection.createStatement();

        try {
            // 开启事务
            connection.setAutoCommit(false);

            // 定义sql语句
            String sql1 = "update student set age=20 where id=1";
            String sql2 = "update student set age=20 where id=2";

            // 执行sql
            int result1 = statement.executeUpdate(sql1);
            System.out.println(result1);

            int result2 = statement.executeUpdate(sql2);
            System.out.println(result2);

            // 提交事务
            connection.commit();

        } catch (Exception e) {
            e.printStackTrace();
            // 回滚事务
            connection.rollback();
        }

        // 8.释放资源
        statement.close(); // 先释放statement
        connection.close();
    }
}

3.Statement (基本不用了,因为有SQL注入问题)

因为 Statement 会造成sql注入问题,因此后面使用 PreparedStatement 替代 Statement

Statement 作用:执行SQL语句

image.png

4.ResultSet

image.png
package cn.test.jdbc;

import java.sql.*;

public class jdbcDemo2 {
    public static void main(String[] args) throws SQLException {
        fn_DQL();
    }

    // DQL(查询语句)
    private static void fn_DQL() throws SQLException {
        // 2.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        // 3.获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
        // 4.获取执行sql对象的 statement
        Statement statement = connection.createStatement();
        // 5.定义sql语句
        String sql = "select * from student";
        // 6.执行sql
        ResultSet resultSet = statement.executeQuery(sql);
        // 7.处理结果

        // 游标下移
        while (resultSet.next()) {
            // 获取每行数据中指定列---有点麻烦,每列需要用不同的get方法获取
            int id = resultSet.getInt(1); // 根据列index获取,index从1开始
            String name = resultSet.getString("name");// 或者根据列名获取
            int age = resultSet.getInt("age");
            Date birthday = resultSet.getDate("birthday");

            System.out.println(id + "---" + name + "---" + age + "---" + birthday);
        }

        // 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
    
}

5.PreparedStatement - (常用)

因为 Statement 会造成sql注入问题,因此后面使用 PreparedStatement 替代 Statement

image.png

image.png
package cn.test.jdbc;

import java.sql.*;

/*
当前mysql版本是 5.5.28
jdbc快速入门
*/
public class jdbcDemo1 {

    public static void main(String[] args) throws SQLException {
        prepareStatementUse();
    }

    // PreparedStatement 的使用
    private static void prepareStatementUse() throws SQLException {
        // 模拟登录
        String name = "张三";
        String password = "123123";

        // 获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db1", "root", "root");

        String sql1 = "SELECT * FROM user WHERE name = ? && password=?";

        //获取执行sql对象的 PreparedStatement
        PreparedStatement pst = connection.prepareStatement(sql1);

        // 设置sql 语句中 ?占位符对应的值
        pst.setString(1, name);
        pst.setString(2, password);

        // 执行sql
        ResultSet res = pst.executeQuery();

        if(res.next()) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

        // 8.释放资源
        res.close();
        pst.close(); // 先释放statement
        connection.close();
    }

}

image.png

四、数据库连接池

和线程池类似,都是为了复用,省去创建和释放的时间。


image.png

image.png

五、Druid (德鲁伊)数据库连接池的使用

druid jar 包下载地址

image.png

定义 druid.properties 配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db2
username=root
password=root
# 初始连接数量
initialSize=5
# 最大连接数量
maxActive=10
# 最大等待时间
maxWait=3000

代码

package cn.test;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class Druid_Demo {
    public static void main(String[] args) throws Exception {
        // 1 导入jar包
        // 2.定义配置文件
        // 3.加载配置文件
        Properties pro = new Properties();
        InputStream is = Druid_Demo.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);

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

        // 5.获取连接
        Connection connection = dataSource.getConnection();

        System.out.println(connection);
        // 6.归还连接
        connection.close();
    }
}


参考:黑马javaWeb教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。