JDBC工具类

JDBCUtils

目的:简化书写

分析:

  1. 注册驱动

  2. 抽取一个方法获取连接对象

    需求:不想传递参数(麻烦),还得保证工具类的通用性。

    解决:配置文件(jdbc.properties)

     url =
    
     user =
    
     password  =
    
     driver = 
    
  3. 抽取一个方法释放资源

代码实现
package cn.itcast.util;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/*
* JDBC工具类
* */
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.加载文件
            //2.1获取src路劲下的文件的方式 --->ClassLoader 类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            //2.2获取资源
            URL resource = classLoader.getResource("jdbc.properties");
            //2.3获取字符串路劲
            String path = resource.getPath();
            //加载
            //properties.load(new FileReader("src/jdbc.properties"));//错误
            //properties.load(new FileReader("D:\\IDEA\\jdbc\\src\\jdbc.properties"));//绝对路径
            properties.load(new FileReader(path));
            //3.获取数据,赋值
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            driver = properties.getProperty("driver");
            //4.注册驱动
            Class.forName(driver);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接Connection
     * @return 连接对象
     */
    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 释放资源
     * @param statement
     * @param connection
     */
    public static void close(Statement statement,Connection connection){
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 释放资源
     * @param resultSet
     * @param statement
     * @param connection
     */
    public static void close(ResultSet resultSet,Statement statement, Connection connection){
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
练习

需求:

  1. 通过键盘输入录入用户和密码
  2. 判断用户是否登录成功

步骤:

  1. 创建数据库和表 user

    CREATE DATABASE simulate_login;-- 创建数据库
    
    CREATE TABLE USER(
    	userID INT PRIMARY KEY AUTO_INCREMENT,
    	userName VARCHAR(32),
    	PASSWORD VARCHAR(32)
    );-- 创建一个user表
    
  2. 添加点数据

    INSERT INTO USER VALUE(NULL,'zhangsan','123');
    INSERT INTO USER VALUE(NULL,'lisi','456');
    
  3. 编写jdbcLogin

    package cn.itcast.jdbc;
    
    import cn.itcast.util.JDBCUtils;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Scanner;
    
    /**
     * #### 练习
     * <p>
     * 需求:
     * <p>
     * 1. 通过键盘输入录入用户和密码
     * 2. 判断用户是否登录成功
     */
    public class jdbcLogin {
    
        public static void main(String[] args) {
            //1.键盘录入,接收用户名和密码
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String userName = scanner.nextLine();
            System.out.println("请输入密码:");
            String password = scanner.next();
            //2.调用方法
            boolean flag = new jdbcLogin().login(userName, password);
            //3.判断结果,输出不同语句
            if (flag == true){
                System.out.println("登陆成功");
            }else{
                System.out.println("用户名或密码错误");
            }
        }
    
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
    
        /**
         * 登录方法
         */
    
        public boolean login(String userName, String password) {
            if (userName == null || password == null) {
                return false;
            }
            try {
                //连接数据库,判断是否登录成功
    
                //1.获取连接
                connection = JDBCUtils.getConnection();
                //2.定义sql
                String sql = "select * from user where userName = '" + userName + "' and password = '" + password + "'";
                //3.获取执行sql的对象
                statement = connection.createStatement();
                //4.执行sql
                resultSet = statement.executeQuery(sql);
                //5.判断
                /*if (resultSet.next()) {//如果有下一行,则返回true
                    return true;
                } else {
                    return false;
                }*/
                return resultSet.next();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                JDBCUtils.close(resultSet,statement,connection);
            }
            //
            return false;
        }
    }
    
    
    JDBC控制事务
    1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这个事务要么同时成功,要么同时失败。

    2. 操作:

      1. 开启事务
      2. 提交事务
      3. 回滚事务
    3. 使用Connection对象来管理事务

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

      在执行sql之前开启事务

      提交事务:void commit()

        在所有sql都执行完后提交事务
      

      回滚事务:void rollback()

        在catch中回滚事务
      
    事务案例
    package cn.itcast.jdbc;
    
    import cn.itcast.util.JDBCUtils;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    /**
     * 事务操作
     */
    public class jdbcTransaction {
        public static void main(String[] args) {
            Connection connection = null;
            PreparedStatement preparedStatement1 = null;
            PreparedStatement preparedStatement2 = null;
            try {
                //1.获取连接
                connection = JDBCUtils.getConnection();
                //开启事务
                connection.setAutoCommit(false);
    
                //2.定义sql
                String sql1 = "update account set balance = balance - ? where name = ?";
                String sql2 = "update account set balance = balance + ? where name = ?";
                //3.获取执行sql对象
                preparedStatement1 = connection.prepareStatement(sql1);
                preparedStatement2 = connection.prepareStatement(sql2);
                //4.设置参数
                preparedStatement1.setDouble(1, 500);
                preparedStatement1.setString(2, "zhangsan");
                preparedStatement2.setDouble(1, 500);
                preparedStatement2.setString(2, "lisi");
                //5.执行sql
                preparedStatement1.executeUpdate();
                //手动制造点异常
                int i = 3 / 0;
                preparedStatement2.executeUpdate();
    
                //提交事务
                connection.commit();
            } catch (SQLException e) {
                //事务回滚
                try {
                    if (connection != null) connection.rollback();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
                e.printStackTrace();
            } finally {
                //6.释放资源
                JDBCUtils.close(preparedStatement1, connection);
                JDBCUtils.close(preparedStatement2, null);
            }
        }
    }
    

数据库连接池

概念:其实就时一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

好处:

  1. 节约资源
  2. 用户访问高效

实现:

  1. 标准接口:DataSource javax.sql包下的

    方法:

     	获取连接:getConnection()
    
     	归还连接:如果连接对象Connection时从连接池中获取的,那么调用Connection.close(),则不会								关闭连接了,而是归还连接
    
  2. 一般我们不去实现它,有数据库厂商来实现

    1. C3P0:数据库连接池技术

      步骤:

      1. 导入jar包 (两个)c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar

        **不要忘记导入数据库驱动jar包
      2. 定义配置文件:

        名称:c3p0.properties或者c3p0-config.xml

        路劲:直接将文件放在src目录下即可。

      3. 创建核心对象,数据库连接池对象CombopooledDataSource

      4. 获取连接:getConnection

    2. Druid:数据库连接池实现技术,由阿里巴巴提供

      步骤:

      1. 导入jar包 druid-1.0.9.jar

        **不要忘记导入数据库驱动jar包

      2. 定义配置文件:

        是properties形式的

        可以叫任意名称,可以放在任意目录下

      3. 加载配置文件:properties

      4. 获取数据库连接对象:通过工厂类来获取 DruidDataSourceFactory

      5. 获取连接:getConnection

定义连接池工具类
  1. 定义一个类 JDBCConnectionPoolUtils

  2. 提供静态代码块加载配置文件。初始化连接池对象

  3. 提供方法

    获取连接池方法:通过数据库连接池获取连接

    释放资源

    获取连接池的方法

实现代码
package cn.itcast.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

/**
 * Druid连接池工具类
 */
public class JDBCConnectionPoolUtils {
    //1.定义成员变量
    private static DataSource dataSource;

    //静态代码块进行一次 初始化赋值
    static{
        try {
            //1.加载配置文件
            Properties properties = new Properties();
            properties.load(JDBCConnectionPoolUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.获取DataSource
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取链接
     */
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    /**
     * 释放资源
     */
    public static void close(Statement statement,Connection connection){
        /*if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }*/
        close(null,statement,connection);
    }

    /**
     * 释放资源
     * @param resultSet
     * @param statement
     * @param connection
     */
    public static void close(ResultSet resultSet, Statement statement, Connection connection){
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取连接池方法
     */
    public static DataSource getDataSource(){
        return dataSource;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

负数系

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值