JDBC的本地连接及其初步封装

jdbc

Java语言数据库连接技术

类型1

JDBC-ODBC桥
这种类型的驱动把所有JDBC的调用传递给ODBC,再让后者调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)。

类型2

本地API驱动
这种类型的驱动通过客户端加载数据库厂商提供的本地代码库(C/C++等来访问数据库,而在驱动程序中则包含了Java代码。

类型3

网络协议驱动
这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC[驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。

类型4

本地协议驱动
这种类型的驱动使用Socket,直接在客户端和数据库间通信。

JDBC API位于JDK中 java.sql 包下,扩展内容位于 javax.sql 下,主要包括:
DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)
Connection:数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特Connection环境中进行的。可以产生用以执行SQL的Statement。
Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。

本地的API驱动方式:

步骤分析:

1、使用DriverManager加载数据库驱动Driver
2、通过Driver驱动加载,获得Collection连接对象
3、通过Collection连接对象获取到 Statement
4、利用Statement对象进行sql查询或更新操作
5、查询执行完,一定会得到一个结果
6、关闭流(保证资源安全)

DriverManager ---------类,主要负责驱动的加载和管理,以及获取连接
Driver 接口,具体实现由数据库厂商提供
Collection接口,负责Java与数据库的链接

package com.day01.exer1;/*
 * 作用:jdbc测试
 *
 *@author hby_gd@163.com
 *@date 1/7/2020 下午4:35
 */
//


import java.sql.*;

public class test1 {
    //        1、使用DriverManager加载数据库驱动Driver
    //        2、通过Driver驱动加载,获得Collection连接对象
    //        3、通过Collection连接对象获取到 Statement
    //        4、利用Statement对象进行sql查询或更新操作
    //        5、查询执行完,一定会得到一个结果
    //        6、关闭流(保证资源安全)
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1、加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        
        //2、通过驱动获取 collection 连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo1", "root", "9999");
        
        //3、获取 statement 对象
        Statement statement = connection.createStatement();

        //4、进行查询
        ResultSet resultSet = statement.executeQuery("select * from tb1");

        //5、输出结果
        while (resultSet.next()){
            //System.out.println(resultSet.getString(1)+":"+ resultSet.getString(2)+":"+ resultSet.getString(3));
            System.out.println(resultSet.getString("username")+":"+ resultSet.getString("age")+":"+ resultSet.getString("salary"));
        }
        //6、关闭资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

JDBCUtils初步封装

package com.openlab.utils;/*
 * 作用:JDBCUtils封装
 *
 *@author hby_gd@163.com
 *@date 22/7/2020 下午12:56
 */


import java.sql.*;
import java.util.List;

public abstract class JDBCUtius {
    //加载数据库驱动
    private String driver = "com.mysql.jdbc.Driver";

    //数据库路径
    private static String url = "jdbc:mysql://localhost:3306/demo1";

    private static String userName = "root";
    private static String password = "9999";
    private Connection conn = null;
    private Statement statement = null;
    private ResultSet resultSet = null;

    //加载驱动要在程序启动时被加载,且只执行一次
    //所以选择使用静态代码块,或静态方法

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接对象
     * @return
     * @throws SQLException
     */
    public static Connection getConection() throws SQLException {
        return DriverManager.getConnection(url,userName,password);
    }

    /**
     * 查询一条记录
     * @param sql
     */
    public Object queryOne(String sql){
        Object obj = null;
        try {
            conn = getConection();
            statement = conn.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
            obj = toObj(resultSet);

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcClose(conn,statement);
        }
        return obj;
    }

    /**
     * 查询多条记录
     * @param sql
     * @return
     */
    public List queryAll(String sql){
        List list = null;
        try {
            conn = getConection();
            statement = conn.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
            list = toList(resultSet);

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcClose(conn,statement);
        }
        return list;
    }

    /**
     * 添加、修改、删除
     */
    public void update(String sql){
        try {
            conn = getConection();
            statement = conn.createStatement();
            int i = statement.executeUpdate(sql);
            System.out.println(i);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcClose(conn,statement);
        }
    }



    /**
     * 关闭流
     * mysql的连接资源是比较珍惜的资源
     * 尽晚地获取链接,尽早地释放资源,减少对资源地占用时间
     * @param conn
     * @param statement
     * @param resultSet
     */
    public static void jdbcClose(Connection conn,Statement statement,ResultSet resultSet){
        try {
            resultSet.close();
            if(resultSet != null){
                resultSet = null;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcClose(conn,statement);
        }

    }


    /**
     * JDBC更新 关闭资源
     * @param conn
     * @param statement
     */
    public static void jdbcClose(Connection conn,Statement statement){

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

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                conn.close();
                if(conn!=null){
                    conn = null;
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public abstract Object toObj(ResultSet resultSet);
    public abstract List toList(ResultSet resultSet);

}

封装后测试:

package com.day01.exer1;/*
 * 作用:JDBCUtils封装测试
 *
 *@author hby_gd@163.com
 *@date 22/7/2020 下午2:46
 */

import com.openlab.utils.JDBCUtius;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtilTest {

    public static void main(String[] args) {
        Connection conection = null;
        Statement st = null;
        ResultSet resultSet = null;

        try {
            conection = JDBCUtius.getConection();
            st = conection.createStatement();
            resultSet = st.executeQuery("SELECT * FROM tb1");

            while (resultSet.next()){
                System.out.println(resultSet.getString("user_name")+":"+ resultSet.getString("age")+":"+ resultSet.getString("salary"));
            }


        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtius.jdbcClose(conection,st,resultSet);
        }

        String sql3 = "alter table tb1 drop password";
        new JDBCUtius().update(sql3);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值