• JDBC学习笔记一


    JDBC学习笔记一

    JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API。

    ODBC全称 Open Database Connectivity,即开放数据库连接,其允许应用程序可以通过一组通用的API访问不同的数据库管理系统。

    这两个都需要数据库厂商提供相应的数据库驱动

    1.JDBC驱动

    数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动负责将JDBC调用映射成特定的数据库调用。

    四种类型JDBC驱动:

    1. JDBC-ODBC桥,最早实现的JDBC驱动程序,将JDBC API映射为ODBC API(单线程)。
    2. 直接将JDBC API映射成数据库特定的客户端API
    3. 支持三层结构的JDBC访问方式,主要用于Applet阶段,通过Applet访问数据库
    4. 纯JAVA的,直接与数据库实例交互,这种驱动是职能的,他知道数据库的底层协议,目前最常用

    2.JDBC常用接口类

    2.1.DriverManeger

    用于管理JDBC驱动的服务类,程序中该类的主要功能是获取Connection对象

    以下方法获得url对应的数据库连接

    public static synchronized Connection getConnection(String url, String user, String pass)
        throws SQLException{
        ...
    }
    

    2.2.Connection

    代表数据库连接对象,每个Connection代表一个物理连接对话,要想访问数据库,必须先获得数据库连接。

    该接口常用方法:

    //返回一个Statement对象
    Statement createStatement() throws SQLException  
    //返回预编译的Statement对象
    PreparedStatement prepareStatement(String sql) throws SQLException 
    //返回存储过程CallableStatement对象
    CallableStatement prepareCall(String sql) throws SQLException
    //控制事务的方法:
    Savepoint setSavePoint() //创建一个保存点
    Savepoint setSavePoint(String name) //以指定名字创建一个保存点
    void setTransactionIsolation(int level) //设置事务隔离级别
    void rollback() //回滚事务
    void rollback(Savepoint savepoint) //将事务回滚到指定的保存点
    void setAutoCommit(boolean autoCommit) //关闭自动提交,打开事务
    void commit() //提交事务
    

    2.3.Statement

    用于执行SQL语句的工具接口。可以执行DDL,DCL,DML和DQL语句

    常用方法:

    //执行sql查询语句,并将查询结果返回到ResultSet对象,该方法只能执行查询语句
    ResultSet executeQuery(String sql) throws SQLException
    //执行DML语句,并返回受影响行数,也可以执行DDL语句,返回值为0
    int executeUpdate(String sql) throws SQLException
    //执行任何sql语句,如果执行后第一个结果为Result对象,则返回true
    //如果返回的是受影响的行数或者没有任何结果则返回false
    boolean execute(String sql) throws SQLException
    

    2.4.PreparedStatement

    预编译的Statement对象,是Statement的子接口,它允许数据库预编译SQL语句,以后每次只改变SQL命令的参数,避免数据库每次都需要编译SQL语句

    给占位符赋值的方法:

    void setXXX(int parameterIndex, XXX value)  //XXX为赋值的数据类型
    

    2.5.ResultSet

    结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获得列数据。

    常用方法:

    //释放ResultSet对象
    void close() throws SQLException
    //将结果集移动到第row行, 如果是负数则移动到倒数第low行,如果移动后的记录指针指向一条有效记录,则返回true
    boolean absolute(int row)
    //将记录指针定位到首行之前,这是记录指针的初始状态
    void beforeFisrt()
    //将记录指针定位到首行,如果移动后的记录指针指向一条有效记录,则返回true
    boolean first()
    //将记录指针定位到上一行,如果移动后的记录指针指向一条有效记录,则返回true
    boolean previous()
    //将记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则返回true
    boolean next()
    ////将记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则返回true
    boolean last()
    //将记录指针定位到最后一行以后
    void afterLast()
    

    3.JDBC使用步骤

    3.1.加载驱动

    通常使用Class.for(driverClass)来加载驱动

    Class.forName(DriverClass);
    //加载Mysql驱动:
    Class.forname("com.mysql.jdbc.Driver");
    //加载Oracle驱动:
    Class.forname("oracle.jdbc.driver.OracleDriver");
    

    3.2.获取数据库连接

    Connection connection = DriverManager.getConnection(String url, String user, String pass)
    

    其中user是数据库用户名,pass是数据库密码

    url遵循以下写写法:

    jdbc:subprotocol:other stuff
    

    其中jdbc是固定的,subprotocol指定连接到特定数据库的驱动程序,后面的other和stuff也不是固定的,不同的url写法也不同,下面是mysql和oracle的写法:

    jdbc:mysql://hostname:port/databasename
    jdbc:oracle:thin:@hostname:prot:databasename
    

    3.3.获得Statement对象

    Connection创建Statement的方法:

    createStatement() //创建基本的Statement对象
    prepareStatement(String sql) //根据传入的SQL语句创建预编译的Statement对象
    prepareStatement(String sql)  //根据传入的SQL语句创建CallableStatement对象
    

    3.4.使用Statement执行SQL语句

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

    executeUpdate: 主要用于执行DML和DDL语句,执行DML语句返回收SQL语句影响的行数

    executeQuery: 只能执行查询语句,执行后返回代表查询结果的ResultSet对象

    3.5.操作结果集

    主要包含两类方法:

    1. 移动指针记录的方法

      主要包含next, previous, first, last, beforeFirst, afterLast, absolute等

    2. 获取记录指针指向行,列特定的值。

      主要是getXxx方法,该方法既可以用列索引作为参数,也可以用列名作为参数,前者性能好,后者可读性好

    3.6.回收数据库资源

    ResultSet rs;
    Statement stmt;
    Connection conn;
    //以上获取对象过程省略,关闭时是按照栈的原则进行关闭
    if(rs != null)
        rs.close();
    if(stmt != null)
        stmt.close();
    if(conn != null)
        conn.close();
    

    3.7.简单示例

    数据库:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class JDBC {
        public static void main(String[] args) throws Exception{
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //使用DriverManager获取数据库连接
            Connection conn = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/jdbc",
                            "root", "root");
            //使用Connection来创建Statement对象
            Statement stmt = conn.createStatement();
            //执行SQL语句,这里只展示三种方法中的查询
            ResultSet rs = stmt.executeQuery("select * from test");
            //操作结果集
            while(rs.next()){
                System.out.println(rs.getInt(1)+ " "
                        + rs.getString(2) + " "
                        + rs.getString(3));
            }
            //关闭数据库连接
            if(rs != null)
                rs.close();
            if(stmt != null)
                stmt.close();
            if(conn != null)
                conn.close();
        }
    
    }
    
    

    出现警告的原因:

    public class Driver extends com.mysql.cj.jdbc.Driver {
        public Driver() throws SQLException {
        }
    
        static {
            System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.");
        }
    }
    

    这个是加载驱动时静态代码块中的内容,百度翻译过之后意思是:

    ​ 这已被弃用。新的驱动程序类是'com.mysql.cj.jdbc.driver'。驱动程序通过SPI自动注册,通常不需要手动加载 驱动程序类。

    也就是说当使用较新的mysql-connectorjar包时,可以不再加载驱动

    改进封装版

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.sql.*;
    import java.util.Properties;
    
    public class JDBC2 {
    
        //获得连接对象
        public static Connection getConnection(){
            Properties prop = new Properties();
            Connection conn = null;
            try {
                //加载配置文件
                prop.load(new FileInputStream("src/main/resources/datasource.properties"));
                 //低版本jar包需要下面这句话来加载驱动
           	     //Class.forName(prop.getProperty("driver"));
                //通过DriverManager获取Connection连接
                conn = DriverManager
                        .getConnection(prop.getProperty("url"), prop.getProperty("username"),
                                prop.getProperty("password"));
            } catch (IOException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return conn;
        }
    
        //关闭连接
       public static void close(Connection conn, Statement stmt, ResultSet rs){
            try{
                if(rs != null)
                    rs.close();
                if(stmt != null)
                    stmt.close();
                if(conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    //测试类
    class Test{
        public static void main(String[] args) {
           Connection conn =  JDBC2.getConnection();
            try {
                //通过Connection创建Statement对象
                Statement stmt = conn.createStatement();
                //执行SQL语句
                ResultSet rs = stmt.executeQuery("select * from test");
                while (rs.next()){
                    System.out.println(rs.getInt(1) + " "
                    + rs.getString(2) + " " + rs.getString(3));
                }
                //关闭连接
                JDBC2.close(conn, stmt, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    

    配置文件:

    driver=com.mysql.jdbc.driver
    url=jdbc:mysql://localhost:3306/jdbc
    username=root
    password=root
    
  • 相关阅读:
    hdu 4707 Pet
    hdu 3584 Cube (三维树状数组)
    poj 2155 Matrix (树状数组)
    poj 1195 Mobile phones (树状数组)
    工厂方法模式
    简单工厂模式
    关于设计模式
    UML类图
    UML
    【转载】UML用例图
  • 原文地址:https://www.cnblogs.com/ys1109/p/11439464.html
Copyright © 2020-2023  润新知