• JDBC基础知识


    常见连接数据库工具:

    1. 图形化工具:点击、拖拽就可以操作数据库,对用户友好,简单对数据操作,复杂数据库操作爱莫能助
    2. JDBC(驱动程序):调用jar包接口
    3. 窗口(命令行):输入完整SQL语句对复杂数据库查询

    JDBC:在java中就是jar包,应用通过JDBC提供的统一接口就可以实现对不同数据库(ORACLE、Mysql)的使用,让我们不需要了解他们之间的差异与具体操作。

     Connection对象:代表java应用程序对后端数据库的一条物理链接,基于链接执行sql语句

    Statement stmt=conn.createStatement();

    Statement对象:是sql的容器,通过executeQuery承载sql语句,进行增删改查,返回ResultSet对象/int。

    ResultSet rs=stmt.executeQuery("select name from student");

    ResultSet对象:代表查询的结果

    获取行:

      .next():向后移动一行

      .previous():向前移动一行

      .absolute():直接移动到某一行

    获取列:

      .getString(ColumnName/Index)

      .getInt(ColumnName/Index)

      .getObject(ColumnName/Index)

    package com.tao.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class jdbctest {
    
        static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost:3306/schoolweb?useUnicode=true&characterEncoding=UTF-8";
        static final String USER = "root";
        static final String PASSWORD = "admin";
    
        public static void main(String[] args) throws ClassNotFoundException {
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
    
            // 装载驱动程序
            Class.forName(JDBC_DRIVER);
            // 建立数据库连接
            try {
                conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
                // 执行sql语句
                stmt = conn.createStatement();
                rs = stmt.executeQuery("select name from student");
                // 获取执行结果
                while (rs.next()) {
                    System.out.println(rs.getString("name"));
                }
            } catch (SQLException e) {
                // 异常处理
                e.printStackTrace();
            } finally {
                //释放宝贵资源
                try {
                    if (conn != null) {
                        conn.close();
                    }
                    if (stmt != null) {
                        stmt.close();
                    }
                    if (rs != null) {
                        rs.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    JDBC进阶:java程序运行在JVM中,JVM也有内存。

    1.查询结果条目过多,防止内存溢出,一次载入较少记录。

    游标:提供一种客户端读取部分结果集的机制,分批读取。

      1.在DB_URL中设置useCursorFetch=true开启游标

       2.使用setFetchSize()设置每次读多少

    package com.tao.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class jdbctest {
    
        static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost:3306/schoolweb?useCursorFetch=true&useUnicode=true&characterEncoding=UTF-8";
        static final String USER = "root";
        static final String PASSWORD = "admin";
    
        public static void main(String[] args) throws ClassNotFoundException {
            Connection conn = null;
            PreparedStatement ptmt=null;
            ResultSet rs = null;
    
            // 装载驱动程序
            Class.forName(JDBC_DRIVER);
            // 建立数据库连接
            try {
                conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
                // 执行sql语句
                ptmt = conn.prepareStatement("select name from student");
                ptmt.setFetchSize(1);//每次读取一条记录
                rs=ptmt.executeQuery();
                // 获取执行结果
                while (rs.next()) {
                    System.out.println(rs.getString("name"));
                }
            } catch (SQLException e) {
                // 异常处理
                e.printStackTrace();
            } finally {
                //释放宝贵资源
                try {
                    if (conn != null) {
                        conn.close();
                    }
                    if (ptmt != null) {
                        ptmt.close();
                    }
                    if (rs != null) {
                        rs.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    2.一行存储大字段内容,比如存储博文,怎么读取?

      1.流方式读取,按区间读取

    package com.tao.test;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class jdbctest {
    
        static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost:3306/schoolweb?useCursorFetch=true&useUnicode=true&characterEncoding=UTF-8";
        static final String USER = "root";
        static final String PASSWORD = "admin";
        static final String FILE_URL = "./text.txt";
    
        public static void main(String[] args) throws ClassNotFoundException,
                IOException {
            Connection conn = null;
            PreparedStatement ptmt = null;
            ResultSet rs = null;
    
            // 装载驱动程序
            Class.forName(JDBC_DRIVER);
            // 建立数据库连接
            try {
                conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
                // 执行sql语句
                ptmt = conn.prepareStatement("select name from student");
                ptmt.setFetchSize(1);// 每次读取一条记录
                rs = ptmt.executeQuery();
                // 获取执行结果
                while (rs.next()) {
                    InputStream in = rs.getBinaryStream("name");
                    File f = new File(FILE_URL);
                    FileOutputStream out = new FileOutputStream(f);
                    int temp = 0;
                    while ((temp = in.read()) != -1)
                        out.write(temp);
                    out.close();
                    in.close();
                }
            } catch (SQLException e) {
                // 异常处理
                e.printStackTrace();
            } finally {
                // 释放宝贵资源
                try {
                    if (conn != null) {
                        conn.close();
                    }
                    if (ptmt != null) {
                        ptmt.close();
                    }
                    if (rs != null) {
                        rs.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

     3.一次插入多条数据

      1.批处理Statement  

        addBatch()     //将sql打包为Batch

        executeBatch()   //执行sql

        clearBatch()     //清空Batch

    package com.tao.test;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class jdbctest {
    
        static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost:3306/schoolweb?useCursorFetch=true&useUnicode=true&characterEncoding=UTF-8";
        static final String USER = "root";
        static final String PASSWORD = "admin";
        static final String FILE_URL = "./text.txt";
        static final String[] users = {"张三","李四"};
    
        public static void main(String[] args) throws ClassNotFoundException,
                IOException {
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
    
            // 装载驱动程序
            Class.forName(JDBC_DRIVER);
            // 建立数据库连接
            try {
                conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
                // 执行sql语句
                stmt=conn.createStatement();
                for(String user:users)
                {
                    stmt.addBatch("insert into student(name) values('"+user+"')");
                }
                stmt.executeBatch();
                stmt.clearBatch();
            } catch (SQLException e) {
                // 异常处理
                e.printStackTrace();
            } finally {
                // 释放宝贵资源
                try {
                    if (conn != null) {
                        conn.close();
                    }
                    if (stmt != null) {
                        stmt.close();
                    }
                    if (rs != null) {
                        rs.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    4.中文问题

      数据库: 实例、dabase、表、字段 级别内置编码(优先级从小到大)

      JDBC编码:DB_URL+characterEncoding=utf-8

  • 相关阅读:
    腾讯QQ强制下线,每天可能强抢会员300万元
    visual studio 2010 winform程序不能添加对system.web的引用
    一个用来将Excel中同一个人的多行记录中的特定列合并到第一行的宏
    很希望看到微软来一次“因为QQ未经用户允许扫描硬盘,在所有window平台拒绝运行QQ”
    windows2003的数据执行保护会造成无法正常安装SQL SERVER
    改变jboss部署目录(虚拟目录)
    SecureCRT6.5.0英文版,提示数据库里没有找到防火墙"无"
    spring注解事务
    windows下查看端口被哪个程序占用
    union和union all区别
  • 原文地址:https://www.cnblogs.com/handsometaoa/p/14257914.html
Copyright © 2020-2023  润新知