JDBC应用

第四天 JDBC应用

第一节 封装工具类

DBUtils类功能:1.注册驱动。2.获取连接。3.释放资源

1.1 重用性方案:

package DB.www;

import java.sql.*;

/**
 * @author liu
 * @create 2020-12-27-11:44
 */
public class DBUtils {
    //定义连接字符串内容
    private static String url = "jdbc:mysql://localhost:3306/schools?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true";
    private static String user = "root";
    private static String password = "root";
    private static Connection connection = null;
    //1.注册驱动
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //2.获得连接
    public static Connection getConnection(){
        try {
            connection = DriverManager.getConnection(url, user,password);
            return connection;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    //3.释放资源
    public static void closeAll(ResultSet resultSet, Statement statement,Connection connection){
        try {
            if (resultSet != null){
                resultSet.close();
            }

            if (statement != null){
                statement.close();
            }

            if (connection != null){
                connection.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

1.2 跨平台方案:

db.properties配置文件:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/schools?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
user=root
password=root
package DB.www.utils;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * @author liu
 * @create 2020-12-29-11:09
 */
public class DBUtils2 {
    //定义连接字符串内容
    private static String url ;
    private static String user ;
    private static String password ;
    private static String driver ;
    private static Connection connection = null;
    //1.注册驱动
    static {
        try {
            //通过流读取文件
            //InputStream inputStream = new FileInputStream("src\\db.properties");
            InputStream is = DBUtils2.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(is);
            //为各个属性赋初值
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");

            //注册驱动
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //2.获得连接
    public static Connection getConnection(){
        try {
            connection = DriverManager.getConnection(url, user,password);
            return connection;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    //3.释放资源
    public static void closeAll(ResultSet resultSet, Statement statement, Connection connection){
        try {
            if (resultSet != null){
                resultSet.close();
            }

            if (statement != null){
                statement.close();
            }

            if (connection != null){
                connection.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

package test;

import DB.www.utils.DBUtils2;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @author liu
 * @create 2020-12-29-11:36
 */
public class TestJDBCForDQL2 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            connection = DBUtils2.getConnection();
            String sql = "select * from dept";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();

            while (resultSet.next()) {
                int deptno = resultSet.getInt(1);
                String dname = resultSet.getString("dname");
                String ioc = resultSet.getString("ioc");
                System.out.println(deptno+":" + dname + ":" + ioc);
            }
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }finally {
            DBUtils2.closeAll(resultSet,preparedStatement,connection);
        }

    }
}


第二节 ResultSet查询封装

ORM(Object Relational Mapping)实体类(Entity):零散数据的载体

在应用开发中,从数据库查询出的结果集(ResultSet)一般都需要取得(get)其中的数据然后存放到(set)实体对象(entity)中,以便进一步处理。常用也最易理解的方式是从ResultSet中取得(get)向应的字段值然后调用实体对象的set方法,把值保存在实体对象中。

实体类

package entity;

import java.io.Serializable;

/**
 * @author liu
 * @create 2020-12-27-16:18
 */
public class Dept implements Serializable {
    private int deptno;
    private String dname;
    private String ioc;

    @Override
    public String toString() {
        return "Dept{" +
                "deptno=" + deptno +
                ", dname='" + dname + '\'' +
                ", ioc='" + ioc + '\'' +
                '}';
    }

    public Dept() {
        this.deptno = deptno;
        this.dname = dname;
        this.ioc = ioc;
    }

    public int getDeptno() {
        return deptno;
    }

    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getIoc() {
        return ioc;
    }

    public void setIoc(String ioc) {
        this.ioc = ioc;
    }
}

总结:

  1. 将一行中多个零散数据进行整理
  2. 通过Entity的规则将表中的数据进行对象的封装
  3. 表名=类名;列名=属性名;提供各属性的get,set方法
  4. 提供无参构造方法(视情况添加有参构造方法)

第三节 DAO模式

3.1 工具类封装

案例:实现emp表的查询、添加、修改、删除

3.1.1 封装DButils

由于多处都需要使用数据库连接和释放,所以把功能封装到工具类中DButils

四个功能:1.注册驱动。2.获取连接。3.释放资源

package DB.www;

import java.sql.*;

/**
 * @author liu
 * @create 2020-12-27-11:44
 */
public class DBUtils {
    //定义连接字符串内容
    private static String url = "jdbc:mysql://localhost:3306/schools?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true";
    private static String user = "root";
    private static String password = "root";
    private static Connection connection = null;
    //1.注册驱动
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //2.获得连接
    public static Connection getConnection(){
        try {
            connection = DriverManager.getConnection(url, user,password);
            return connection;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    //3.释放资源
    public static void closeAll(ResultSet resultSet, Statement statement,Connection connection){
        try {
            if (resultSet != null){
                resultSet.close();
            }

            if (statement != null){
                statement.close();
            }

            if (connection != null){
                connection.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

3.2 DAO设计模式

DAO(Database Access Object 数据库访问对象)

为了降低耦合,提出了DAO封装数据库操作的设计模式。

它可以实现业务逻辑与数据库访问相分离。相对来说,数据库是比较稳定的,其中DAO组件依赖与数据库系统,提供数据库访问的接口,隔离了不同的数据库实现。

DAO模式的组成部分

1.DAO接口(主要包含添加、修改、删除方法)

2.DAO实现类

3.实体类(domain,beans,entity,pojo,model)

–作用:用在数据访问代码和业务逻辑代码之间通过实体类来传输数据

–实体类特征:

  • 属性一般使用private修饰
  • 提供public修饰的getter/settrt方法
  • 实体类提供无参构造方法,根据业务提供有参构造
  • 实现java.io.Serializable接口,支持序列化机制

4.数据库连接和关闭工具类

设计的包名

domain存放实体类

utils存放工具类

dao存放接口

dao.impl存放实现类

使用DAO设计模式实现emp表的查询、添加、删除、修改

第四节 Druid连接池

4.1 为什么使用连接池

用户每次请求都需要向数据库获取连接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库资源,并且极易造成数据库服务器内存溢出、宕机。
现流行的有:DBCP,C3P0,Druid等。
Druid是目前比较流行的高性能的,分布式列储存的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
一、亚秒级查询
    druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二、实时数据注入
    druid支持数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三、可扩展的PB级存储
    druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即使在加大数据规模的情况下,也能保证其实效性
四、多环境部署
    druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop.spark,kafka,storm和samza等
五、丰富的社区
    druid拥有丰富的社区

4.2 使用步骤

配置文件database.properties:

#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=
uaername=root
password=root
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位 60000毫秒/1000毫秒等于60秒
maxWait=5000

4.2.1 导入jar包

druid-1.1.5.jar

mysql驱动包

4.2.2 编写工具类

package com.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author liu
 * @create 2020-12-30-20:15
 */
public class DruidUtils {
    //创建连接池对象
    private static DruidDataSource dataSource;
    private static Connection connection;
    static {
        //创建连接池
        Properties properties = new Properties();
        InputStream inputStream = DruidUtils.class.getClassLoader().getResourceAsStream("database.properties");
        try {
            properties.load(inputStream);
            //通过德鲁伊连接池工厂创建一个连接池,自动解析properties文件里的键值对
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //获得一个连接池
    public static DruidDataSource getDataSource(){
        return dataSource;
    }

    public static Connection getConnection(){

        try {
            connection = dataSource.getConnection();
            return connection;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    public static void closeAll(ResultSet resultSet, Statement statement,Connection connection){
        try {
            if (resultSet != null){
                resultSet.close();
            }
            if (statement != null){
                statement.close();
            }
            if (connection != null){
                connection.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值