zoukankan      html  css  js  c++  java
  • JDBC获得数据库连接及使用

    1.Connection 

    • Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现
    • 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现
    •  通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例

    @Test
        public void testDBDynamicDriver() throws Exception {
            // 1.读取配置文件
            Properties prop = new Properties();
            InputStream in = null;
            try {
                in = new FileInputStream(new File("jdbc.properties"));
    
                prop.load(in);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            String url = prop.getProperty("db.url");
            String user = prop.getProperty("db.user");
            String password = prop.getProperty("db.password");
            String driverPath = prop.getProperty("db.driver");
    
            // 2.配置properties,Normally at least "user" and "password" properties should be
            // included in the Properties object.
    
            Properties jdbcprop = new Properties();
            jdbcprop.put("user", user);
            jdbcprop.put("password", password);
            Class<?> driverClass = Class.forName(driverPath);
            Driver driver = (Driver) driverClass.newInstance();
    
            Connection conn = driver.connect(url, jdbcprop);
            in.close();
            System.out.println(conn);
        }
    
        @Test
        public void testDBDriverManager() throws Exception {
            // 1.读取配置文件
            Properties prop = new Properties();
            InputStream in = null;
            try {
                in = new FileInputStream(new File("jdbc.properties"));
    
                prop.load(in);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            String url = prop.getProperty("db.url");
            String user = prop.getProperty("db.user");
            String password = prop.getProperty("db.password");
            String driverPath = prop.getProperty("db.driver");
    
            // 2.加载数据库驱动程序
            //实际应该这样写,但是在mysql driver的静态代码块会被执行实例和注册
            DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());
            //Class.forName(driverPath);
            Connection conn = DriverManager.getConnection(url, user, password);
            in.close();
            System.out.println(conn);
        }

     2.Statement 

    • 通过调用 Connection 对象的 createStatement 方法创建该对象
    • 该对象用于执行静态的 SQL 语句,并且返回执行结果
    • Statement 接口中定义了下列方法用于执行 SQL 语句:

      –      ResultSet excuteQuery(String sql)

      –      int excuteUpdate(String sql)

    @Test
        public void testDBStatement() throws Exception {
            // 1.读取配置文件
            Properties prop = new Properties();
            InputStream in = null;
            try {
                in = new FileInputStream(new File("jdbc.properties"));
                prop.load(in);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            String url = prop.getProperty("db.url");
            String user = prop.getProperty("db.user");
            String password = prop.getProperty("db.password");
            String driverPath = prop.getProperty("db.driver");
    
            // 2.加载数据库驱动程序
            // 实际应该这样写,但是在mysql driver的静态代码块会被执行实例和注册
            DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());
            // Class.forName(driverPath);
            Connection conn = DriverManager.getConnection(url, user, password);
            in.close();
            System.out.println(conn);
    
            // 3.获得Statement
            Statement statement = conn.createStatement();
            ResultSet ret = statement.executeQuery("select * from teacher");
            while (ret.next()) {
    
                System.out.println(ret.getString("name"));
            }
    
            statement.executeUpdate("update teacher set name = 'Johnson李' where id = '1'");
            // 先关闭Statement
            statement.close();
            // 再关闭Connection
            conn.close();
        }

    3.ResultSet

    • 通过调用 Statement 对象的 excuteQuery() 方法创建该对象
    • ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现
    • ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行
    • ResultSet 接口的常用方法:

        –      boolean next()

        –      getString()

        –      …

     4.PreparedStatement

    • 可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象
    • PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
    • PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
    public void testDBPreparedStatement() throws Exception {
            // 1.读取配置文件
            Properties prop = new Properties();
            InputStream in = null;
            try {
                in = new FileInputStream(new File("jdbc.properties"));
                prop.load(in);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            String url = prop.getProperty("db.url");
            String user = prop.getProperty("db.user");
            String password = prop.getProperty("db.password");
            String driverPath = prop.getProperty("db.driver");
    
            // 2.加载数据库驱动程序
            // 实际应该这样写,但是在mysql driver的静态代码块会被执行实例和注册
            DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());
            // Class.forName(driverPath);
            Connection conn = DriverManager.getConnection(url, user, password);
            in.close();
            System.out.println(conn);
    
            // 3.获得Statement
            PreparedStatement preparedStatement = conn
                    .prepareStatement("insert into teacher (name,address,year) values(?,?,?)");
            preparedStatement.setString(1, "wiker");
            preparedStatement.setString(2, "海富大厦");
            preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
            int ret = preparedStatement.executeUpdate();
    
            System.out.println(ret);
            // 先关闭Statement
            preparedStatement.close();
            // 再关闭Connection
            conn.close();
        }

     

    5.Oracle LOB 和 Mysql BLOB

    Oracle LOB

    • LOB,即Large Objects(大对象)是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。
    • LOB 分为两种类型:内部LOB和外部LOB。

    –      内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle支持三种类型的内部LOB:

    • BLOB(二进制数据)  
    • CLOB(单字节字符数据) 
    • NCLOB(多字节字符数据)。

    –      CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频,文件等

    目前只支持一种外部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。

    Mysql BLOB

    MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。

    MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)

    实际使用中根据需要存入的数据大小定义不同的BLOB类型。
    需要注意的是:如果存储的文件过大,数据库的性能会下降。

     

    @Test
        public void testDBBlob() throws Exception {
            // 1.读取配置文件
            Properties prop = new Properties();
            InputStream in = null;
            try {
                in = new FileInputStream(new File("jdbc.properties"));
                prop.load(in);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            String url = prop.getProperty("db.url");
            String user = prop.getProperty("db.user");
            String password = prop.getProperty("db.password");
            String driverPath = prop.getProperty("db.driver");
    
            // 2.加载数据库驱动程序
            // 实际应该这样写,但是在mysql driver的静态代码块会被执行实例和注册
            DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());
            // Class.forName(driverPath);
            Connection conn = DriverManager.getConnection(url, user, password);
            in.close();
            System.out.println(conn);
    
            // 3.获得Statement
            PreparedStatement preparedStatement = conn.prepareStatement("insert into picture (picture) values(?)");
            InputStream inputStream = new FileInputStream(new File("F:\照片\Camera\IMG_20160719_103500.jpg"));
            preparedStatement.setBlob(1, inputStream);
    
            int ret = preparedStatement.executeUpdate();
            inputStream.close();
            System.out.println(ret);
            // 先关闭Statement
            preparedStatement.close();
            // 再关闭Connection
            conn.close();
        }

    6.Apache—DBUtils简介

    • commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
    • API介绍:

      –      org.apache.commons.dbutils.QueryRunner

      –      org.apache.commons.dbutils.ResultSetHandler

    • 工具类

      –     org.apache.commons.dbutils.DbUtils、

    package com.atguigu.jdbc;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.commons.dbutils.QueryLoader;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.ResultSetHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.MapHandler;
    import org.apache.commons.dbutils.handlers.MapListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    import org.junit.Test;
    
    /**
     * 测试 DBUtils 工具类
     *
     */
    public class DBUtilsTest {
    
        /**
         * QueryLoader: 可以用来加载存放着 SQL 语句的资源文件.
         * 使用该类可以把 SQL 语句外置化到一个资源文件中. 以提供更好的解耦
         * @throws IOException 
         */
        @Test
        public void testQueryLoader() throws IOException{
            // / 代表类路径的根目录. 
            Map<String, String> sqls = 
                    QueryLoader.instance().load("/sql.properties");
            
            String updateSql = sqls.get("UPDATE_CUSTOMER");
            System.out.println(updateSql); 
        }
        
        /**
         * 1. ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最终取决于
         * query 方法的 ResultHandler 参数的 hanlde 方法的返回值. 
         * 
         * 2. BeanListHandler: 把结果集转为一个 Bean 的 List, 并返回. Bean 的类型在
         * 创建 BeanListHanlder 对象时以 Class 对象的方式传入. 可以适应列的别名来映射 
         * JavaBean 的属性名: 
         * String sql = "SELECT id, name customerName, email, birth " +
         *            "FROM customers WHERE id = ?";
         * 
         * BeanListHandler(Class<T> type)
         * 
         * 3. BeanHandler: 把结果集转为一个 Bean, 并返回. Bean 的类型在创建 BeanHandler
         * 对象时以 Class 对象的方式传入
         * BeanHandler(Class<T> type) 
         * 
         * 4. MapHandler: 把结果集转为一个 Map 对象, 并返回. 若结果集中有多条记录, 仅返回
         * 第一条记录对应的 Map 对象. Map 的键: 列名(而非列的别名), 值: 列的值
         * 
         * 5. MapListHandler: 把结果集转为一个 Map 对象的集合, 并返回. 
         * Map 的键: 列名(而非列的别名), 值: 列的值
         * 
         * 6. ScalarHandler: 可以返回指定列的一个值或返回一个统计函数的值. 
         */
        
        @Test
        public void testScalarHandler(){
            Connection connection = null;
            QueryRunner queryRunner = new QueryRunner();
            
            String sql = "SELECT name FROM customers " +
                    "WHERE id = ?";
            
            try {
                connection = JDBCTools.getConnection();
                Object count = queryRunner.query(connection, sql, 
                        new ScalarHandler(), 6);
                
                System.out.println(count); 
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                JDBCTools.releaseDB(null, null, connection);
            }
        }
        
        @Test
        public void testMapListHandler(){
            Connection connection = null;
            QueryRunner queryRunner = new QueryRunner();
            
            String sql = "SELECT id, name, email, birth " +
                    "FROM customers";
            
            try {
                connection = JDBCTools.getConnection();
                List<Map<String, Object>> mapList = queryRunner.query(connection, 
                        sql, new MapListHandler());
                
                System.out.println(mapList); 
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                JDBCTools.releaseDB(null, null, connection);
            }
        }
        
        @Test
        public void testMapHandler(){
            Connection connection = null;
            QueryRunner queryRunner = new QueryRunner();
            
            String sql = "SELECT id, name customerName, email, birth " +
                    "FROM customers WHERE id = ?";
            
            try {
                connection = JDBCTools.getConnection();
                Map<String, Object> map = queryRunner.query(connection, 
                        sql, new MapHandler(), 4);
                
                System.out.println(map); 
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                JDBCTools.releaseDB(null, null, connection);
            }
        }
        
        /**
         * 测试 ResultSetHandler 的 BeanListHandler 实现类
         * BeanListHandler: 把结果集转为一个 Bean 的 List. 该 Bean
         * 的类型在创建 BeanListHandler 对象时传入:
         * 
         * new BeanListHandler<>(Customer.class)
         * 
         */
        @Test
        public void testBeanListHandler(){
            String sql = "SELECT id, name customerName, email, birth " +
                    "FROM customers";
            
            //1. 创建 QueryRunner 对象
            QueryRunner queryRunner = new QueryRunner();
            
            Connection conn = null;
            
            try {
                conn = JDBCTools.getConnection();
                
                Object object = queryRunner.query(conn, sql, 
                        new BeanListHandler<>(Customer.class));             
                
                System.out.println(object); 
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                JDBCTools.releaseDB(null, null, conn);
            }
        }
    
        /**
         * 测试 QueryRunner 的 query 方法
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        @Test
        public void testResultSetHandler(){
            String sql = "SELECT id, name, email, birth " +
                    "FROM customers";
            
            //1. 创建 QueryRunner 对象
            QueryRunner queryRunner = new QueryRunner();
            
            Connection conn = null;
            
            try {
                conn = JDBCTools.getConnection();
                /**
                 * 2. 调用 query 方法:
                 * ResultSetHandler 参数的作用: query 方法的返回值直接取决于 
                 * ResultSetHandler 的 hanlde(ResultSet rs) 是如何实现的. 实际上, 在
                 * QueryRunner 类的 query 方法中也是调用了 ResultSetHandler 的 handle()
                 * 方法作为返回值的。
                 */
                Object object = queryRunner.query(conn, sql, 
                        new ResultSetHandler(){
                            @Override
                            public Object handle(ResultSet rs) throws SQLException {
                                List<Customer> customers = new ArrayList<>();
                                
                                while(rs.next()){
                                    int id = rs.getInt(1);
                                    String name = rs.getString(2);
                                    String email = rs.getString(3);
                                    Date birth = rs.getDate(4);
                                    
                                    Customer customer = 
                                            new Customer(id, name, email, birth);
                                    customers.add(customer);
                                }
                                
                                return customers;
                            }
                        }
                
                        );            
                
                System.out.println(object); 
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                JDBCTools.releaseDB(null, null, conn);
            }
            
        }
        
        /**
         * 测试 QueryRunner 类的 update 方法
         * 该方法可用于 INSERT, UPDATE 和 DELETE
         */
        @Test
        public void testQueryRunnerUpdate() {
            //1. 创建 QueryRunner 的实现类
            QueryRunner queryRunner = new QueryRunner();
            
            String sql = "DELETE FROM customers " +
                    "WHERE id IN (?,?)";
            
            Connection connection = null;
            
            try {
                connection = JDBCTools.getConnection();
                //2. 使用其 update 方法
                queryRunner.update(connection, 
                        sql, 12, 13);
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                JDBCTools.releaseDB(null, null, connection);
            }
            
        }
    
    }
  • 相关阅读:
    SFML从入门到放弃(3) 视角和碰撞检测
    SFML从入门到放弃(2) 图像和音频
    SFML从入门到放弃(1) 窗口和交互
    SFML从入门到放弃(0) 配置环境
    NOI2017 酱油记
    【bzoj4889】: [Tjoi2017]不勤劳的图书管理员 分块-BIT
    【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞
    【bzoj4887】:[Tjoi2017]可乐 矩阵乘法,快速幂
    THUSC2017酱油记
    CTSC2017酱油记
  • 原文地址:https://www.cnblogs.com/pjlhf/p/8677105.html
Copyright © 2011-2022 走看看