【JDBC】JDBC&&连接池

目录

JDBC概述

JDBC的实现步骤

JDBC中相关API介绍

    DriverManager:驱动管理对象

    Connection:数据库连接对象

    Statement:执行SQL对象

    ResultSet:结果集对象

    PreparedStatement:执行SQL对象

Druid连接池

硬编码方式:

扫描二维码关注公众号,回复: 11994276 查看本文章

抽取工具类,利用配置文件创建连接池


JDBC概述

    JDBC:Java数据库连接(Java  DataBase  Connectivity) . 其作用是通过java于洋操作数据库, 本质上是定义了一套操作所有关系型数据库的规则(接口),然后各个数据库的厂商去实现这套接口,提供数据库驱动jar包,然后我们使用这个接口(JDBC)编程,驱动jar包中的实现类

JDBC的实现步骤

    在进行JDBC的实现之前首先需要导入(mysql-connection-java-5.1.37-bin)jar包,然后开始开始执行JDBC的六步操作.

jar包链接:

链接:https://pan.baidu.com/s/1LsyTxuoDGrOh2cqNt9UfaQ 
提取码:nfn8

  • 注册驱动
  • 获取数据库连接对象,connection
  • 定义SQL
  • 获取执行SQL语句的对象,statement
  • 执行sql,接收返回结果
  • 处理结果
  • 释放资源 

案例代码:

public void testSave() throws Exception {
        //1.注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://localhost:3306/student";
        String username = "root";
        String password = "root";
        //2.获得连接
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.获得语句执行者
        Statement st = connection.createStatement();
        //4.执行语句
        String sql = "INSERT INTO tab_account VALUES(NULL , 'rose' , '1000')";
        int count = st.executeUpdate(sql);
        //5.处理结果
        System.out.println(count);
        //6.释放资源
        st.close();
        connection.close();
    }
}

JDBC中相关API介绍

    DriverManager:驱动管理对象

作用:

  • 注册驱动

   static void  registerDriver(Driver driver):

   注册于给定的驱动程序  DriverManager

  写代码使用(动态加载类):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!");
    }
}

MySQL5之后的驱动jar包可以省略注册驱动的步骤

  • 获取数据库的连接
方法:static Connection getConnection(String url,String user,String password)
参数:
    url:指定连接的路径
        语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
        细节:如果连接的是本地的mysql服务器,并且mysql服务器默认端口是3306,则url可以简写:jdbc:mysql://数据库名称
    user:数据库用户名
    password:数据库密码

    Connection:数据库连接对象

作用:

  • 获取执行的SQL对象

statement createStatement()

PreparedStatement prepareStatement(String sql)

  • 管理事务

开启事务:setAutoCommit(boolean  autoCommit)调用该方法设置参数为false,即开启事务

提交事务:commit()

回滚事务:rollback()

    Statement:执行SQL对象

  • boolean execute(String sql):可以执行任意SQL   

  • int  executeUpdate(String sql):执行DML(增删改)语句,返回值是影响的行数,通过这个判断DML语句是否执行成功.

  • ResultSet  executeQuery(String SQL):执行DQL(查询)语句

    ResultSet:结果集对象

  • boolean next():游标向下移动一行,判断当前是否最后一行末尾(是否有数据),如果有,则返回false,否则返回true
  • getXxxx(参数):获取数据
    • Xxx:代表数据类型,,  如getInt(int/String),   getString(int/String)
    • 参数
      • int 代表列的编号,从  1 开始,
      • String:代表列的名称     
  • 注意
    • 使用步骤
      • 游标向下移动一行
      • 判断是否有数据
      • 获取数据

    PreparedStatement:执行SQL对象

{防止SQL注入      效率更高}
  • sql注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接,会造成安全性问题
  • 解决SQL的注入问题,使用PreparedStatemet对象来解决
  • 预编译SQL:参数使用?作为占位符
  • 步骤
    • 导入驱动jar包,mysql-connector-java-5.1.37-bin.jar
    • 注册驱动
    • 获取数据库连接对象 Connection
    • 定义SQL
      • 注意:SQL的参数使用?作为占位符,---->select * from user where username=? and password=?
    • 给?赋值
      • 方法--->setXxx(参数1,参数2)
        • 参数1:?位置的编码  从1开始
        • 参数2:?的值
    • 执行SQL,接收返回结果,不需要传递参数
    • 处理结果
    • 释放资源

JDBC初封装案例代码:

配置文件:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///student
username=root
password=root
package com.james.Utils;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    static{
        //读取资源文件获取值
        try {
            //1 创建Properties集合类
            Properties properties = new Properties();
            //2 获取src路径下的文件的方式----->classLoader  类加载器
            ClassLoader classLoader=JDBCUtils.class.getClassLoader();
            URL res=classLoader.getResource("jdbc.properties");
            // 获取配置文件路径
            String path=res.getPath();
            //3 加载文件
            properties.load(new FileReader(path));
            //4 获取数据
            url=properties.getProperty("url");
            user=properties.getProperty("user");
         password=properties.getProperty("password");
            //5 注册驱动
         driver=properties.getProperty("driver");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*
     * 获取连接对象的方法
     * */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

Druid连接池

    连接池就是一个存放数据库容器,当系统初始化好之后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器.

优点:

  • 节约资源,减轻服务器压力
  • 提高连接复用性,用户访问高效

硬编码方式:

  • 导入jar包链接:

https://pan.baidu.com/s/1lHnZJ-uPbEVwOuodV8poHA 

提取码:n04c

  • 创建对象
  • 配置数据库连接的四个基本参数(驱动,url,username,password)
  • 设置其他的参数(最大连接的数量,最小连接空闲数量,获取连接最大等待时间)
  • 通过连接池对象获取连接
  • 使用连接
  • 调用连接,close()可以归还连接
public class DRUIDDemo {
    @Test
    //硬编码,所有的配置都写到java代码中
    public void test1() throws SQLException {
        //1. 创建对象
        DruidDataSource ds = new DruidDataSource();

        //2. 设置数据库连接的4个基本参数(驱动,url,username,password)
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql:///student");
        ds.setUsername("root");
        ds.setPassword("1234");

        //3. 设置其他的参数(最大连接的数量,最小连接空闲数量,获取连接最大等待时间)
        ds.setMaxActive(10);
        ds.setMinIdle(2);
        ds.setMaxWait(2000);

        //获取11个连接 ,会出现重复的连接
        for (int i = 1; i <12 ; i++) {
            //4. 通过连接池对象获取连接
            Connection conn = ds.getConnection();
            //5. 使用连接
            System.out.println(conn);

            if (i%7==0){
                //6. 调用连接close()就可以归还连接
                conn.close();
            }
        }
    }
}

抽取工具类,利用配置文件创建连接池

工具类:

package com.james.b_utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 连接池的工具类
 * 1.获得连接
 * 2.释放资源(归还连接)
 */
public class DruidUtils {
    //1.准备数据源
    private static DataSource dataSource = null ;

    //2.static静态代码块初始化连接池
    static {
        try {
            //加载流
            InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("db.properties");
            //创建properties
            Properties properties = new Properties();
            //加载数据
            properties.load(is);
            //实例化连接池
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 从池中获得连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

xml配置文件(src文件夹下):

#此处的properties 的key不能瞎写
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///student
username=root
password=root
initialSize=3
maxActive=10
maxWait=3000
package com.james.b_utils;
import java.sql.Connection;
import java.sql.SQLException;
public class TestDemo {
    public static void main(String[] args) throws SQLException {
        for(int i = 1 ; i <= 11 ; i++ ){
            Connection connection = DruidUtils.getConnection();
            System.out.println(i+"@@"+connection);
            if(i==5){
                //归还第五个连接
                connection.close();//连接池对close方法都进行重写了
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43267344/article/details/108795662