jdbc基础

1、什么是jdbc

  sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来同一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了
 

2、使用jbdc发送sql的前提

    登录数据库服务器(连接数据库服务器)

            数据库的IP地址

            端口

            数据库用户名

            密码

3、使用jdbc连接数据的步骤

 1.注册数据库驱动
   DriverManager.registerDriver(new Driver());//缺点一:观察mysqlDriver源码发现此方法导致了数据库驱动被注册了两次。缺点二:整个程序域mysql数据库驱动绑定增加了耦合性
   Class.forName(“com.mysql.jdbc.Driver”);
   2.获取连接
   DriverManager.getConnection(url, user, password);
     ~url的写法:
        Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
        SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
        MySql—jdbc:mysql://localhost:3306/sid
     ~url可以接的参数
        user、password
        useUnicode=true&characterEncoding=UTF-8

  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day10", "root", "root");  

   3.获取传输器
    createStatement():创建向数据库发送sql的statement对象。
    prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

   Statement stat = conn.createStatement();
   4.利用传输器执行sql语句获取结果集
      executeQuery(String sql) :用于向数据发送查询语句。
      executeUpdate(String sql):用于向数据库发送insert、update或delete语句
      execute(String sql):用于向数据库发送任意sql语句

   ResultSet rs = stat.executeQuery("select * from user");

   5.遍历结果集取出结构
      ResultSet以表的样式在内存中保存了查询结果,其中还维护了一个游标,最开始的时候游标在第一行之前,每调用一次next()方法就试图下移一行,如果移动成功返回true;
      ResultSet还提供了很多个Get方法,用来获取查询结果中的不同类型的数据
      除了next方法,还有以下方法可以用来遍历结果集:
         next():移动到下一行
         Previous():移动到前一行
         absolute(int row):移动到指定行
         beforeFirst():移动resultSet的最前面。
         afterLast() :移动到resultSet的最后面。

      while(rs.next()){
         String name = rs.getString("name");
         System.out.println(name);
        }
   6.释放资源
      conn是一个有限的资源,用完立即要释放表
      stat占用内存,所以使用完后也要释放
      rs占用内存,所以使用完后也要释放
      释放时后创建的先释放

      rs.close();
      stat.close();
      conn.close();

4、jdbc接口的核心api

  java.sql.*   和  javax.sql.*

 

                            |- Driver接口: 表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。

                                     |- connect(url, properties):  连接数据库的方法。

                                                        url: 连接数据库的URL

                                                                 URL语法: jdbc协议:数据库子协议://主机:端口/数据库

                                                                 user: 数据库的用户名

                                                                 password: 数据库用户密码

                            |- DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序

                                     |-registerDriver(driver)  : 注册驱动类对象

                                     |-Connection getConnection(url,user,password);  获取连接对象

 

                            |- Connection接口: 表示java程序和数据库的连接对象。

                                               |- Statement createStatement() : 创建Statement对象

                                               |- PreparedStatement prepareStatement(String sql)  创建PreparedStatement对象

                                               |- CallableStatement prepareCall(String sql) 创建CallableStatement对象

 

                            |- Statement接口: 用于执行静态的sql语句

                                               |- int executeUpdate(String sql)  : 执行静态的更新sql语句(DDL,DML)

                                               |- ResultSet executeQuery(String sql)  :执行的静态的查询sql语句(DQL)

 

                                     |-PreparedStatement接口:用于执行预编译sql语句

                                                        |- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)

                                                        |-ResultSet executeQuery()  : 执行预编译的查询sql语句(DQL)

 

                                               |-CallableStatement接口:用于执行存储过程的sql语句(call xxx)

                                                                 |-ResultSet executeQuery()  : 调用存储过程的方法

 

 

                            |- ResultSet接口:用于封装查询出来的数据

                                               |- boolean next() : 将光标移动到下一行

                                               |-getXX() : 获取列的值

5、jdbc链接数据库的比较

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties;

import org.junit.Test;
/**
 * jdbc连接数据库
 * 
 *
 */
public class Demo1 {
    //连接数据库的URL
    private String url = "jdbc:mysql://localhost:3306/day17";
                        // jdbc协议:数据库子协议:主机:端口/连接的数据库   //

    private String user = "root";//用户名
    private String password = "root";//密码
    
    /**
     * 第一种方法
     * @throws Exception
     */
    @Test
    public void test1() throws Exception{
        //1.创建驱动程序类对象
        Driver driver = new com.mysql.jdbc.Driver(); //新版本
        //Driver driver = new org.gjt.mm.mysql.Driver(); //旧版本
        
        //设置用户名和密码
        Properties props = new Properties();
        props.setProperty("user", user);
        props.setProperty("password", password);
        
        //2.连接数据库,返回连接对象
        Connection conn = driver.connect(url, props);
        
        System.out.println(conn);
    }
    
    /**
     * 使用驱动管理器类连接数据库(注册了两次,没必要)
     * @throws Exception
     */
    @Test
    public void test2() throws Exception{
        Driver driver = new com.mysql.jdbc.Driver();
        //Driver driver2 = new com.oracle.jdbc.Driver();
        //1.注册驱动程序(可以注册多个驱动程序)
        DriverManager.registerDriver(driver);
        //DriverManager.registerDriver(driver2);
        
        //2.连接到具体的数据库
        Connection conn = DriverManager.getConnection(url, user, password);
        System.out.println(conn);
        
    }
    
    /**
     * (推荐使用这种方式连接数据库)
     * 推荐使用加载驱动程序类  来 注册驱动程序 
     * @throws Exception
     */
    @Test
    public void test3() throws Exception{
        //Driver driver = new com.mysql.jdbc.Driver();
        
        //通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        
        //Driver driver2 = new com.oracle.jdbc.Driver();
        //1.注册驱动程序(可以注册多个驱动程序)
        //DriverManager.registerDriver(driver);
        //DriverManager.registerDriver(driver2);
        
        //2.连接到具体的数据库
        Connection conn = DriverManager.getConnection(url, user, password);
        System.out.println(conn);
        
    }

}

一个优化后的完整代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo1 {

    private String url = "jdbc:mysql://localhost:3306/mydata";
    private String user = "root";
    private String password = "root";

    @Test
    public static void main(String[] args){
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try{
            //1.注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            /*//2.获取数据库连接
            conn = DriverManager.getConnection("jdbc:mysql:///mydata?user=root&password=root");*/
            //2.获取连接对象,上面一种方法也可以
            conn = DriverManager.getConnection(url, user, password);        
            //3.获取传输器对象
            stat = conn.createStatement();
            //4.利用传输器传输sql语句到数据库中执行,获取结果集对象
            rs = stat.executeQuery("select * from user");
            //5.遍历结果集获取查询结果
            while(rs.next()){
                String name = rs.getString("name");
                System.out.println(name);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            //6.关闭资源(顺序:后打开的先关闭)
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    rs = null;
                }
            }
            if(stat!=null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    stat = null;
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    conn = null;
                }
            }
        }
    }
}

使用工具类优化后的代码

1、配置文件db.properties 放在src下

url=jdbc:mysql://localhost:3306/maydata
user=root
password=root
driverClass=com.mysql.jdbc.Driver

2、工具类

/**
 * jdbc工具类
 * 
 *
 */
public class JdbcUtils {
    private static String url = null;
    private static String user = null;
    private static String password = null;
    private static String driverClass = null;
    
    /**
     * 静态代码块中(只加载一次)
     */
    static{
        try {
            //读取db.properties文件
            Properties props = new Properties();
            /**
             *  . 代表java命令运行的目录
             *  在java项目下,. java命令的运行目录从项目的根目录开始
             *  在web项目下,  . java命令的而运行目录从tomcat/bin目录开始
             *  所以不能使用点.
             */
            //FileInputStream in = new FileInputStream("./src/db.properties");
            
            /**
             * 使用类路径的读取方式
             *  / : 斜杠表示classpath的根目录
             *     在java项目下,classpath的根目录从bin目录开始
             *     在web项目下,classpath的根目录从WEB-INF/classes目录开始
             */
            InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");
            
            //加载文件
            props.load(in);
            //读取信息
            url = props.getProperty("url");
            user = props.getProperty("user");
            password = props.getProperty("password");
            driverClass = props.getProperty("driverClass");
            
            
            //注册驱动程序
            Class.forName(driverClass);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("驱程程序注册出错");
        }
    }

    /**
     * 抽取获取连接对象的方法
     */
    public static Connection getConn(){
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    
    /**
     * 释放资源的方法
     */
    
    public static void close(ResultSet rs, Statement stat,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                rs = null;
            }
        }
        if(stat!=null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                stat = null;
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                conn = null;
            }
        }
    
    }
}

3、使用工具类的实现数据的CRUD

public class JDBCDemo2 {

    @Test
    public void add() {
        Connection conn = null;
        Statement stat = null;
        try {
            // 1.注册数据库驱动
            // 2.获取连接
            conn = JDBCUtils.getConn();
            // 3.获取传输器对象
            stat = conn.createStatement();
            // 4.执行sql语句
            int count = stat.executeUpdate("insert into user values (null,'zhaoliu','123456','zhaoliu@qq.com','1999-09-09')");
            // 5.处理结果
            if (count > 0) {
                System.out.println("执行成功!影响到的行数为" + count);
            } else {
                System.out.println("执行失败!!");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //6.关闭资源
            JDBCUtils.close(null, stat, conn);
        }
    }
}
    @Test
    public void delete(){
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try{
            conn = JDBCUtils.getConn();
            stat =  conn.createStatement();
            stat.executeUpdate("delete from user where name='zhaoliu'");
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.close(rs, stat, conn);
        }
    }
    
    @Test
    public void find(){
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try{
            conn = JDBCUtils.getConn();
            stat =  conn.createStatement();
            rs = stat.executeQuery("select * from user where name='zhaoliu'");
            while(rs.next()){
                String name = rs.getString("name");
                String password = rs.getString("password");
                System.out.println(name+":"+password);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.close(rs, stat, conn);
        }
    }
    
    @Test
    public void update() {
        Connection conn = null;
        Statement stat = null;
        try{
            conn = JDBCUtils.getConn();
            stat =  conn.createStatement();
            stat.executeUpdate("update user set password=999 where name='zhaoliu'");
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.close(null, stat, conn);
        }
    }
    
    
原文地址:https://www.cnblogs.com/flei/p/6727288.html