JDBC以及数据库连接池的使用

JDBC以及数据库连接池的使用,第1张

文章目录
      • JDBC
          • 步骤
      • 数据库连接池
          • 1.概念
          • 2.接口规范方法
          • 3.第三方数据库连接池技术
            • C3p0
            • Druid:由阿里提供
        • Druid工具类

JDBC

概念

​ JDBC是sun公司提供的一套用于数据库 *** 作的接口,java程序员只需要面向这套接口编程即可,不同的数据库厂商对这套接口有不同的实现

步骤
  • 首先jdbc只是一个接口规范,所以第一导入对应厂商的jar包

  • 加载并将驱动类注册进内存区

    //注册驱动的代码是在jar包已经定义好了
    static {
            try {
                DriverManager.registerDriver(new Driver());
            } catch (SQLException var1) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    //所以下面两步可以做可以不做
    new Driver()//第一种
    class.forname("地址")//第二种
    //都是把类加载进内存,用反射符合开闭原则
    
  • 创建连接对象

    不论你是用jdbc还是用数据库软件,首先都会和数据库建立连接,而java将连接视为一个对象,万物皆对象

  • 创建执行对象statement执行SQL

❓ 用statement接口的弊端:

1需要拼接字符串,出现sql注入的问题:拼接or 1 = 1

解决办法: 使用perparestatement预编译statement

🌓步骤:1.定义一个sql语句,动态值用sql占位

​ 2.perparedstatement预编译sql

​ 3.调用perparedstatement的实例对象填充sql语句

​ 4.执行

  • 使用ResultSet对象(查询)

    如果你是查询语句,会根据条件得到一系列结果,java

    将之封装为结果集对象

  • 关闭statement,connection对象

  Class.forName("com.mysql.jdbc.Driver");
        //Driver dr = new Driver();
        Properties pass = new Properties();
        InputStream re = son.class.getClassLoader().getResourceAsStream("./res/user.properties");
        pass.load(re);

        String username = pass.getProperty("username");
        System.out.println(username);
        String passw = pass.getProperty("password");
        System.out.println("棉麻"+passw);
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/zf1", username, passw);
        String sql = "SELECT * FROM user";
        Statement stmt = con.createStatement();
        ResultSet resultSet = stmt.executeQuery(sql);
        System.out.println(resultSet);
        while (resultSet.next()){
            String user = resultSet.getString("user");
            int password = resultSet.getInt("password");
            System.out.println(user+""+password);
        }
        con.close();
        stmt.close();
    }
数据库连接池 1.概念

​ 相当于一个容器集合,用于存放数据库连接对象的容器,当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库的时候,从容器中获取连接对象,用户访问完之后不销毁而是归还给容器

DataSource(数据源)是一个接口规范

❓一个连接到这个DataSource对象所代表的物理数据源的工厂。 DriverManager设备的DriverManagerDataSource对象是获取连接的首选方法。 实现DataSource接口的对象通常将基于Java“命名和目录(JNDI)API”的命名服务注册。 接口由驱动程序供应商实现

2.接口规范方法
Connection getConnection() 
尝试建立与此 DataSource对象所代表的数据源的连接。  
Connection getConnection(String username, String password) 
尝试建立与该 DataSource对象所代表的数据源的连接。  

3.第三方数据库连接池技术 C3p0
  • 导入jar包
  • 定义配置文件包括一些数据库账号密码,最大连接数量等等
Druid:由阿里提供
  • 导入jar包

    <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>druidartifactId>
                <version>1.0.9version>
      dependency>
    
  • 定义配置文件*.properties放在任意目录手动加载

    driverClassName=com.mysql.cj.jdbc.Driver
    #URL连接数据库的URL,其中travel(以下面例子来说)为连接的数据库,后面的参数可不改但不删
    url=jdbc:mysql://localhost:3306/travel?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    characterEncoding=utf-8
    #安装mysql时候设置的用户与密码
    username=root
    password=root
    #初始化物理连接的个数
    initialSize=5
    #最大连接池数量
    maxActive=10
    #获取连接时最大等待时间
    maxWait=3000
    #用来检测连接是否有效的sql
    validationQuery=SELECT 1
    #保证安全性!
    testWhileIdle=true
    
    
  • 获取不是创建数据库连接池对象,通过DruidDataSourceFactory

    DruidDataSourceFactory.createDateSource(properties对象:需要手动加载文件流)
    
  • 获取连接

Druid工具类
public class JDBCUtils {
    //1定义成员变量DataSource
    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 getConnetion() 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();
            }
        }

        //close(null,stmt,conn);
    }

    //释放资源重载
    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 getDs(){
        return ds;
    }

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/727959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存