Java JDBC简介

​ 数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用,使用Java JDBC API进行编程,可以为多种关系数据库提供统一访问。

jdbc的驱动通常有四种类型

  1. JDBC-ODPC桥: 它将JDBC API映射到ODPC API。再让JDBC-ODPC调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)

  2. 本地API驱动 直接将JDBC API映射成数据库特定的客户端API,即通过客户端加载数据库厂商提供的本地代码库(

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

  4. 本地协议驱动 这种类型的驱动使用Socket,直接在客户端和数据库间通信。它是一种直接与数据库实例交互的JDBC 这种驱动是智能的,它知道数据库使用的底层协议,也是目前最主流使用的JDBC驱动。
     

    JDBC编程(连接数据库)步骤

    1.加载数据库驱动

    ​ 使用Class类的forName()静态方法来加载驱动(由各个数据库厂商自己实现)

    ​ 对于oracle数据库而言数据库驱动类对应的字符串:oracle.jdbc.driver.OracleDriver

    Class.forName("oracle.jdbc.driver.OracleDriver");

    ​ 对于mysql数据库而言数据库驱动类对应的字符串:com.mysql.jdbc.Driver

    Class.forName("com.mysql.jdbc.Driver");

    2.获取Connection对象

    ​ DriverManager类提供getConnection(String url, String user, String pass);

    ​ url: 数据库连接字符串

    ​ user: 用户名

    ​ pass: 密码

    ​ Mysql:

    ​ url: jdbc:mysql://hostname:port/databasename

    ​ oracle

    ​ url: jdbc:oracle:thin:@hostname:port:databasename

    3.通过Connection对象创建Statement对象

    ​ Connection创建Statement对象的常用方法有如下2个

    ​ createStatement(String sql):创建基本的Statement对象

    ​ prepareStatement(String sql): 根据传入的SQL语句创建预编译的Statement对象

    4.使用Statement执行SQL语句

    ​ execute(): 可以执行任何SQL语句,但比较麻烦

    ​ executeUpdate(): 主要用于执行DML和DDL语句。执行DML语句返回受SQL影响的行数,执行DDL语句返回

    ​ executeQuery(): 只能执行查询语句,执行后返回代表查询结果的ResultSet对象,该对象里保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象来取出查询结果。

    ​ ResultSet对象主要提供了如 下方法

    ​ 移动记录指针的方法

    ​ next()

    ​ previous()

    ​ first()

    ​ last()

    ​ 获取指针指向的某行的"特定的列值"

    ​ getInt()

    ​ getString()     

    ​ getObject()

    ​ ...

    ​ 该方法既可以使用列索引作为参数,也可以使用列名作为参数

    5.回收数据库资源 包括关闭ResultSet、Statement、Connection等资源
     

    下面以oracle为理,写一个jdbc增加删除修改的工具类

    连接数据库的工具类

        ```
        `package net.wanhe.util;
    
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.IOException;
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.util.Properties;
    
        /**
    
        - 数据的连接以及关闭
    
        - 
    
        - @author Administrator
          *
           */
          public class JDBCUtil {
          private static String driverName;
          private static String url;
          private static String user;
          private static String password;
          /**
    
          - 静态初始化,初始化一次
            */
            static {
            try {
                Properties p = new Properties();
                // 配置文件放置在工程的下面
                p.load(new FileInputStream("jdbc.properties"));
    
            ```
             driverName = p.getProperty("driverName");
             url = p.getProperty("url");
             user = p.getProperty("user");
             password = p.getProperty("password");
            // 加载驱动
            Class.forName(driverName);
            ```
    
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
            /**
    
          - 获取数据库的连接对象(Connection对象)
            */
            public static Connection getConnection(){
            Connection conn=null;
            try {
                conn=DriverManager.getConnection(url, user, password);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return conn;
            }
            /**
    
          - 关闭数据库
            */
            public static void close(Connection conn,PreparedStatement ps,ResultSet rs){
            try {
                if(rs!=null){
                    rs.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                if(ps!=null){
                    ps.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
    
        }`
        ```
    
        映射的接口
    
        ```
        `package net.wanhe.jdbc;
    
        import java.sql.ResultSet;
    
        public interface RowMapper {
            /**
             * 数据库中表的一条数据对应的一个对象
             */
            T rowMapper(ResultSet rs);
        }`
        ```
    
        BaseDao的工具类
    
        ```
        package net.wanhe.jdbc;
    
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.ResultSetMetaData;
        import java.sql.SQLException;
        import java.util.ArrayList;
        import java.util.List;
    
        import org.apache.commons.beanutils.BeanUtils;
    
        public class BaseDao {
    
        Class clazz;
    
            /**
             * 获取泛型信息
             */
            public BaseDao(){
                 try {
                    clazz=ReflectionUtil.getGenericSuper(this.getClass());
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            /**
             * 增加,删除,修改
             */
            public void update(String sql,Object...parameterValues){
                //建立连接
                Connection conn=JDBCUtil.getConnection();
                PreparedStatement ps=null;
                try {
                    //获取预处理对象
                    ps=conn.prepareStatement(sql);
                    //给占位符赋值
                    setParameters(ps, parameterValues);
                    //执行sql语句
                    ps.executeUpdate();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally{
                    JDBCUtil.close(conn, ps,null);
                }
    
            }
    
            /**
    
        - 给占位符赋值
        - @param ps
        - @param parameterValues
        - @throws SQLException
          */
          private void setParameters(PreparedStatement ps, Object... parameterValues) throws SQLException {
          for(int i=0;i query(String sql,RowMapper rm,Object...parameterValues){
          List list=new ArrayList();
          Connection conn=null;
          PreparedStatement ps=null;
          ResultSet rs=null;
          try {
            conn=JDBCUtil.getConnection();
            ps=conn.prepareStatement(sql);
            setParameters(ps, parameterValues);
            rs=ps.executeQuery();
            while(rs.next()){
                T t=(T) rm.rowMapper(rs);
                list.add(t);
            }
          } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }finally{
            JDBCUtil.close(conn, ps, rs);
          }
           return list;
          }
    
        }   
        ```
    
        ​