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数据
写入大文本


读取


你可能感兴趣的:(JDBC)