JDBC

JDBC是什么?

JDBC代表Java数据库连接,这对Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API。

JDBC 的实现包括三个部分
1.JDBC 驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql.DriverManager类实现
2.JDBC驱动API:最主要的接口是java.sql.Driver接口
3.JDBC驱动器:他是一种数据驱动由数据库厂商创建,也称jdbc驱动程序
JDBC驱动器实现了JDBC驱动器API,负责与特定的数据库连接以及处理通信细节

JDBC常用API

1.Driver接口
是所有JDBC驱动程序必须实现的接口该接口专门提供给数据库厂商使用,在编写JDBC程序时必须要
把指定数据库驱动程序或类库加载到项目的CLASSPATH中

2.DriverManager类
用于加载JDBC驱动并且创建与数据库的链接。定义了两个重要的静态方法
registerDriver(Driver driver)向DriverManager中注册给定的JDBC驱动程序
getConnection(String url,String user,String pwd)建立与数据库的链接,并返 回表示
连接的Connection对象 

3.Connection接口
代表java程序和数据库的链接
getMetaData()返回表示数据库的元数据的DataBaseMetaData对象
createstatement()创建一个statement对象来将SQL语句发送到数据库
prepareStatement(String sql)创建一个prepareStatement对象来讲参数化的 
                              sql语句发送到数据库 。
prepareCall(String sql)创建一个callableStatement对象来调节数据库存储过程

4.statement接口
用于向数据库发送SQL语句
execute(String sql)返回一个Boolean类型的值
executeUpdate(String sql)执行SQL中的insert,update和delete语句,返回一个int类型的值,表示数据库受该SQL语句影响的记录数目;
executeQuery(String sql)执行SQL中select语句返回一个表示查询结果的ResultSet对象

5.preparedStatement接口
是statement的子接口用于执行预编译的SQL语句

executeUpdate()执行SQL中的insert,update和delete语句,返回一个int类型的值,表示数据库受该SQL语句影响的记录数目,SQL操纵DML或者无返回内容,如DDL;
executeQuery()执行SQL中select语句返回一个表示查询结果的ResultSet对象

6.callablestatement接口
是preparedStatement的子接口用于执行SQL的存储过程
7.result的接口
表示select查询语句得到的结果集,接口内部有一个指向表格数据行的游标
实现第一个JDBC程序
1.加载并注册数据库驱动
    DriverManager.registerDriver(new com.mysql.jdbc.Driver());
2.通过DriverManager获取数据库连接     
        String url = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "root";
    Connection conn = DriverManager.getConnection(url, user, password);
3.通过Connection对象获取Statement对象
        Statement stmt = conn.createStatement();
        String sql = "select * from person";
4.使用Statement执行SQL语句
        ResultSet rs = stmt.executeQuery(sql);
5.操作ResultSet结果集
        while(rs.next()) {
            System.out.println(rs.getInt(1)+rs.getString(2)+rs.getString(3)+rs.getString(4)+rs.getString(5)+rs.getFloat(6)+rs.getDate(7)+rs.getString(8));          
}
6.回收数据库资源,关闭数据库连接,释放资源
        rs.close();
        stmt.close();
        conn.close();

JDBC 的改进

1.注册驱动
在注册数据库驱动时虽然DriverManager.registerDriver(new com.jdbc.mysql.Driver)方
法可以完成但是驱动会被执行两次,因为Driver类源码中已经在静态代码块中完成了数据库驱动
的注册。所以只需在程序中加载驱动类即可    
Class.forName("com.mysql.jdbc.Driver")  
2.释放资源
由于数据库资源宝贵,数据库允许的并发访问连接数量有限,所以一定要释放资源,应该将最终必
须要执行的操作放finally代码块中

PreparedStatement对象

statement对象每次执行SQL语句时,都会对其进行编译,当相同的语句执行多次,statement就会
使数据库频繁的编译相同的SQL语句,会降低数据库的访问效率。为解决上述问题Statement提供了
一个子类PreparedStatement。PreparedStatement。可以对SQL语句进行预编译,也就是说当相
同的SQL语句,数据库只需使用缓冲区的数据,而不需对SQL语句进行再次编译

Connection conn = null;
    PreparedStatement pstt = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "";
        conn = DriverManager.getConnection(url, user, password);
        String sql = "insert into person values(?,?,?)";
        pstt = conn.prepareStatement(sql);
        pstt.setString(1, "呵呵");
        pstt.setInt(2, 10);
        pstt.setString(3,"哈哈");
        pstt.executeUpdate();
    } catch (SQLException e) {
        
        e.printStackTrace();
    }finally {//释放资源
        if(pstt!=null){
            pstt.close();
        }
        if(conn!=null) {
            conn.close();
        }       
}

resultset对象

resultSet主要存储结果集,并通过next()方法由前向后逐个获取结果集中的数据,如果想获取任意位置的数据需在创建Statement之前,设置两个Result定义的常量

Connection conn = null;
    Statement smtt = null;
    ResultSet rs = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "root";
        conn = DriverManager.getConnection(url, user, password);
        String sql = "select * from person";
        smtt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs = smtt.executeQuery(sql);
        
        System.out.println("第三条数据name的值为:");
        rs.absolute(3);                         //定位指针
        System.out.println(rs.getString("name"));
        System.out.println("第一条数据name的值为:");    
        rs.beforeFirst();                       //定位到第一行之前
        rs.next();                              //指针向后滚动
        System.out.println(rs.getString("name"));
        System.out.println("最后一条数据name的值为:");   
        rs.afterLast();                         //定位到最后一行之后
        rs.previous();                          //指针向前滚动
        System.out.println(rs.getString("name"));
    
    } catch (SQLException e) {
        
        e.printStackTrace();
    }finally {//释放资源
        
        if(rs!=null){
            rs.close();
        }
        if(smtt!=null){
            smtt.close();
        }
        if(conn!=null) {
            conn.close();
        }   
}

JDBC批处理

1.statement 批处理
Statement通过addBatch()方法添加一条SQL语句,通过executeBatch实现批处理

        String sql = "";
        String sql2 ="insert into ....";
        String sql3 = "update person set id=1";
        smtt.addBatch(sql);
        smtt.addBatch(sql2);
        smtt.addBatch(sql3);
        smtt.executeBatch();

2.PreparedStatement批处理
String sql = "insert into person values(?,?,?)";
    pstt = conn.prepareStatement(sql);
      for(int i=0;i<5;i++){
        pstt.setString(1," ");
          pstt.setString(2," ");
            pstt.setString(3," ");
        pstt.addBatch();
}
        pstt.executeBatch();

JDBCUtils

public static Connection getConnection() throws ClassNotFoundException, SQLException {

        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, user, password);
        return conn;

    }
    
    public static void release(Statement stmt,Connection conn){
        
            try {
                if(stmt!=null){stmt.close();}
                if(conn!=null){conn.close();}
            } catch (SQLException e) {
                
                e.printStackTrace();
            }
    }
    public static void release(ResultSet rs,Statement stmt,Connection conn){
        
        try {
            if(rs!=null){rs.close();}
            if(stmt!=null){stmt.close();}
            if(conn!=null){conn.close();}
        } catch (SQLException e) {
            
            e.printStackTrace();
        }
}
//在properties文件中
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day15
user=root
password=sorry
-----------------------------------------------------------------------
    private static String driverClass;
    private static String url;
    private static String user;
    private static String password;
    
    static{//代码块随着类而加载一次
        try {
            ClassLoader cl = JdbcUtil.class.getClassLoader();//类加载器
            InputStream in = cl.getResourceAsStream("dbcfg.properties");
            Properties props = new Properties();
            props.load(in);
            driverClass = props.getProperty("driverClass");
            url = props.getProperty("url");
            user = props.getProperty("user");
            password = props.getProperty("password");
            
            Class.forName(driverClass);
        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }
    
    
    public static Connection getConnection() throws Exception{
        Connection conn = DriverManager.getConnection(url,user, password);
        return conn;
    }
    public static void release(ResultSet rs,Statement stmt,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }

封装JDBC的连接及增删改查的方法


    private Connection conn = null;
    private PreparedStatement pstt = null;
    private ResultSet rs = null;
    public static final String url = "jdbc:mysql://localhost:3306/test?useUnicode=ture&characterEncoding=utf-8";
    public static final String user = "root";
    public static final String password = "root";
    public static final String driverclass = "com.mysql.jdbc.Driver";

    public Connection getConnection() {

        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);
        } catch (Exception e) {

            e.printStackTrace();
        }
        return conn;

    }

    public int executeUpdate(String sql, Object... para) {//可变数组
        getConnection();
        int a = 0;
        try {
            pstt = conn.prepareStatement(sql);
            for (int i = 0; i < para.length; i++) {
                pstt.setObject((i + 1), para[i]);
            }
            a = pstt.executeUpdate();
        } catch (SQLException e) {

            e.printStackTrace();
        }

        return a;

    }
    public ResultSet executeQuery(String sql,Object ...para){//可变数组
        getConnection();
        try {
            pstt = conn.prepareStatement(sql);
            for (int i = 0; i < para.length; i++) {
                pstt.setObject((i + 1), para[i]);
            }
            rs = pstt.executeQuery();
            
        } catch (SQLException e) {
            
            e.printStackTrace();
        }
        
        return rs;
    }


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;
import java.util.Properties;

public class jdbcUtil {
    private static Connection conn = null;
    private static PreparedStatement pstt = null;
    private static ResultSet rs = null;
    private static String driverClass;
    private static String url;
    private static String user;
    private static String password;
    static {
        try {
            ClassLoader cl = jdbcUtil.class.getClassLoader();
            InputStream in = cl.getResourceAsStream("a.properties");
            Properties pro = new Properties();

    pro.load(in);
    driverClass = pro.getProperty("driverClass");
    url = pro.getProperty("url");
    user = pro.getProperty("user");
    password = pro.getProperty("password");
    Class.forName(driverClass);
    } catch (Exception e) {
        e.printStackTrace();
    }

    }
    

    public static int executeUpdate(String sql, Object... para) {
        int a = 0;
        try {
             conn = DriverManager.getConnection(url,user, password);
            pstt = conn.prepareStatement(sql);
            for (int i = 0; i < para.length; i++) {
                pstt.setObject((i + 1), para[i]);
            }
            a = pstt.executeUpdate();
        } catch (SQLException e) {

    e.printStackTrace();
    }
    return a;
    }
    public static ResultSet executeQuer(String sql, Object... para) {// 可变数组
        try {
             conn = DriverManager.getConnection(url,user, password);
            pstt = conn.prepareStatement(sql);
            for (int i = 0; i < para.length; i++) {
                pstt.setObject((i + 1), para[i]);
            }
            rs = pstt.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

    public static void close() {

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

    e.printStackTrace();
    }
    }
}
大数据处理

大数据处理主要指的是对CLOB和BLOB类型数据的操作
在应用操作中这两个数据类型必须使用PreparedStatement完成,并且操作形式都要以IO流的形式进行存放和读取
1.处理CLOB数据
写入大文本


读取


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容

  • JDBC基础知识 一、采用JDBC访问数据库的基本步骤: A.载入JDBC驱动程序 B.定义连接URL ...
    java日记阅读 3,767评论 0 20
  • JDBC概述 在Java中,数据库存取技术可分为如下几类:JDBC直接访问数据库、JDO技术、第三方O/R工具,如...
    usopp阅读 3,495评论 3 75
  • 本文主要内容1、JDBC2、DBUtils 01JDBC概念和数据库驱动程序 A: JDBC概念和数据库驱动程序a...
    乘风破浪的姐姐阅读 776评论 0 6
  • 以下我是归纳的JDBC知识点图: 图上的知识点都可以在我其他的文章内找到相应内容。 JDBC常见面试题 JDBC操...
    Java3y阅读 1,710评论 0 15
  • 本文主要内容 1、JDBC 2、DBUtils 01JDBC概念和数据库驱动程序 A: JDBC概念和数据库驱动程...
    胜浩_ae28阅读 367评论 0 0