JDBC概述

  • JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
  • JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
  • JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

JDBC原理

  • Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动
  • JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

准备

sql部分

CREATE TABLE sort ( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR ( 100 ), sprice DOUBLE, sdesc VARCHAR ( 500 ) );

insert into sort(sname,sprice,sdesc) values('家电',2000, '优惠的促销');
insert into sort(sname,sprice,sdesc) values('家具',8900, '家具价格上调,原材料涨价');
insert into sort(sname,sprice,sdesc) values('儿童玩具',290, '赚家长的钱');
insert into sort(sname,sprice,sdesc) values('生鲜',500.99, '生鲜商品');
insert into sort(sname,sprice,sdesc) values('服装',24000, '换季销售');
insert into sort(sname,sprice,sdesc) values('洗涤',50, '洗发水促销');  

mysql-connector-java

mysql-connector-java-5.1.37.zip

JDBC开发步骤

  • 注册驱动 告知JVM使用的是哪一个数据库的驱动
  • 获得连接 使用JDBC中的类,完成对MySQL数据库的连接
  • 获得语句执行平台 通过连接对象获取对SQL语句的执行者对象
  • 执行sql语句 使用执行者对象,向数据库执行SQL语句 获取到数据库的执行后的结果
  • 处理结果
  • 释放资源 一堆close()

注册驱动

import java.sql.*;
import com.mysql.jdbc.Driver;

public class Test {
    public static void main(String[] args) throws Exception {
        // 反射技术,将驱动类加入到内容
        // 使用java.sql.DriverManager类静态方法 registerDriver(Driver driver)
        // Diver是一个接口,参数传递,MySQL驱动程序中的实现类
        DriverManager.registerDriver(new Driver());
    }
}

或者直接使用Class.forName

public class Test {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
    }
}

获得连接

import java.sql.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        // 获得数据库连接  DriverManager类中静态方法
        // static Connection getConnection(String url, String user, String password)  
        // 返回值是Connection接口的实现类,在mysql驱动程序
        // url: 数据库地址  jdbc:mysql://连接主机IP:端口号//数据库名字
        String url = "jdbc:mysql://localhost:3306/javastudy";
        String user = "root";
        String password = "123456";
        Connection con = DriverManager.getConnection(url, user, password);
        System.out.println(con);
    }
}

获得语句执行平台

import java.sql.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/javastudy";
        String user = "root";
        String password = "123456";
        Connection con = DriverManager.getConnection(url, user, password);
        // con对象调用方法   Statement createStatement() 获取Statement对象,将SQL语句发送到数据库
        // 返回值是 Statement接口的实现类对象,,在mysql驱动程序
        Statement stat = con.createStatement();
        System.out.println(stat);
    }
}

执行sql语句 处理结果 释放资源

import java.sql.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/javastudy";
        String user = "root";
        String password = "123456";
        Connection con = DriverManager.getConnection(url, user, password);
        Statement stat = con.createStatement();
        // 执行 insert update delete
        int row = stat.executeUpdate
                ("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽车用品',50000,'疯狂涨价')");
        System.out.println("操作行数:"+row);
        // 执行 select
        ResultSet rs = stat.executeQuery("SELECT * FROM sort");

        // 处理结果集
        // ResultSet接口方法 boolean next() 返回true,有结果集,返回false没有结果集
        while(rs.next()){
            System.out.println(rs.getInt("sid")+"   "+rs.getString("sname")+"   "+rs.getDouble("sprice")+"   "+rs.getString("sdesc"));
        }

        // 释放资源
        rs.close();
        stat.close();
        con.close();
    }
}

PrepareStatement接口预编译SQL

import java.sql.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/javastudy";
        String user = "root";
        String password = "123456";
        Connection con = DriverManager.getConnection(url, user, password);
        PreparedStatement pst;
        // 预编译sql
        pst = con.prepareStatement("UPDATE sort SET sname=?,sprice=? WHERE sid=?");
        pst.setObject(1, "汽车美容");
        pst.setObject(2, 49988);
        pst.setObject(3, 7);
        // 执行 insert update delete
        int row = pst.executeUpdate();
        System.out.println("操作行数:"+row);

        // 预编译sql
        pst = con.prepareStatement("SELECT * FROM sort");
        // 执行 select
        ResultSet rs = pst.executeQuery();

        // 处理结果集
        // ResultSet接口方法 boolean next() 返回true,有结果集,返回false没有结果集
        while(rs.next()){
            System.out.println(rs.getInt("sid")+"   "+rs.getString("sname")+"   "+rs.getDouble("sprice")+"   "+rs.getString("sdesc"));
        }

        // 释放资源
        rs.close();
        pst.close();
        con.close();
    }
}

JDBC的封装

import java.sql.*;

public class Jdbctool {
    private Jdbctool(){}
    private static Connection con;
    static{
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/javastudy";
            String user = "root";
            String password = "123456";
            con = DriverManager.getConnection(url, user, password);
        }
        catch(Exception e)
        {
            throw new RuntimeException(e+"连接失败");
        }
    }

    public static Connection getsql(){
        return con;
    }

    public static void close(Connection con,Statement stat){
         if(stat!=null){
             try{
                 stat.close();
             }catch(SQLException ex){}
         }

         if(con!=null){
             try{
                 con.close();
             }catch(SQLException ex){}
         }
    }


    public static void close(Connection con,Statement stat , ResultSet rs){
         if(rs!=null){
             try{
                 rs.close();
             }catch(SQLException ex){}
         }

         if(stat!=null){
             try{
                 stat.close();
             }catch(SQLException ex){}
         }

         if(con!=null){
             try{
                 con.close();
             }catch(SQLException ex){}
         }
    }
}
  • 测试代码
import java.sql.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Connection con = Jdbctool.getsql();
        PreparedStatement pst = con.prepareStatement("SELECT sname FROM sort");
        ResultSet rs = pst.executeQuery();
        while(rs.next()){
            System.out.println(rs.getString("sname"));
        }
        Jdbctool.close(con, pst, rs);
    }
}

读取文件内参数

  • 可以通过文件的形式才存储数据库的链接参数 并且可以在JDBC封装里应用
  • database.properties放在最顶层目录
import java.io.*;
import java.util.Properties;

public class Test {
    public static void main(String[] args) throws Exception {
        //使用类的加载器
        InputStream in = Test.class.getClassLoader().getResourceAsStream("database.properties");
        Properties pro = new Properties();
        pro.load(in);
        System.out.println(pro.getProperty("driverClass"));
        System.out.println(pro.getProperty("url"));
        System.out.println(pro.getProperty("username"));
        System.out.println(pro.getProperty("password"));
    }
}
  • database.properties内容
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/javastudy
username=root
password=123456