JDBC—(Java DataBase Connectivity)

1.概念

JDBC(Java DataBase Connectivity):Java数据库连接。它的本质是sun公司定义的一套操作所有关系型数据库的规则,也就是统一的JavaAPI接口。

  看到JDBC有没有想到我们在.net 中的ADO.NET,两者类似,但是还是存在一定的差异,请看博客:再谈ADO .NET vs JDBC

JDBC—(Java DataBase Connectivity)

  下图是JDBC示意图,JDBC这是提供统一的接口,各个厂商实现该接口,提供驱动不同数据库的炸包。

JDBC—(Java DataBase Connectivity)

2.JDBC的使用步骤:

 第一步:导入驱动jar包。新建一个jar包的文件夹,将mysql数据库炸包放入该文件中。点击右键 选择 Add As Library

JDBC—(Java DataBase Connectivity)

 第二步:注册驱动

 DriverManager:驱动管理对象——告诉程序应该使用某种数据库驱动jar包。

 例如下面我们使用的则是MySQL数据库的炸包。(mysql5以后,该步骤可以省略,不写也可以,炸包可以自动导入)

 // 2.注册驱动
 Class.forName("com.mysql.jdbc.Driver");

JDBC—(Java DataBase Connectivity)

第三步:connection,数据库连接对象,获取数据库连接对象

JDBC—(Java DataBase Connectivity)

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

第四步:定义SQL语句

  String sql = "update account set balance = 500 where id = 1";

第五步:获取执行SQL对象的Statement

    Statement stmt = conn.createStatement();

第六步:执行SQL语句

1. 
int executeUpdate(String sql) //执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
返回值:通过判断影响行数,判断数据是否执行成功,返回值大于0,则执行成功,反之失败。

2.
 ResultSet executeQuery(String sql)  //执行DQL(select)语句
  int count = stmt.executeUpdate(sql);

第七步:处理结果

  if (count>0){
        System.out.println("更新成功");
  }
  else{
        System.out.println("更新失败");
  }

第八步:释放资源

stmt.close();
conn.close();

 3.具体使用

增删改使用:executeUpdate(sql)

 public static void main(String[] args) {
        Statement stmt = null;
        Connection conn = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2. 定义sql
            String sql = " INSERT INTO student VALUES (9,'狗狗哲',10,50,NULL,NULL,'张家口')";
            //3.获取Connection对象
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            //4.获取执行sql的对象 Statement
            stmt = conn.createStatement();
            //5.执行sql
            int count = stmt.executeUpdate(sql);//影响的行数
            //6.处理结果
            System.out.println(count);
            if (count > 0) {
                System.out.println("添加成功!");
            } else {
                System.out.println("添加失败!");
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //stmt.close();
            //7. 释放资源
            //避免空指针异常
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

获取数据的方法:executeQuery(sql)

JDBC—(Java DataBase Connectivity)

 public static <string> void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            //3.定义sql
            String sql = "select * from student";
            //4.获取执行sql对象
            stmt = conn.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.处理结果
            //循环判断游标是否是最后一行末尾。
            while (rs.next()) {
                //获取数据
                //6.2 获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                int age = rs.getInt(3);
                double score = rs.getDouble(4);
                String datetime = rs.getString("insert_time");
                String adress = rs.getString("adress");
                System.out.println(id + "--" + name + "--" + age + "--" + score + "--" + datetime + "--" + adress);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

 封装一个实体,相当于我们.net项目中的实体层

package cn.itcast.domain;

import java.util.Date;

/**
 * 封装Emp表数据的JavaBean
 */
public class Emp {
    private int id;
    private String name;
    private int age;
    private double score;
    private String  datetime;
    private String adress ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getDatetime() {
        return datetime;
    }

    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }

    public String getAdress() {
        return adress;
    }

    public void setAdress(String adress) {
        this.adress = adress;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                ", datetime='" + datetime + '\'' +
                ", adress='" + adress + '\'' +
                '}';
    }
}

 遍历数据到对象集合中

ackage cn.itcast.jdbc;
import cn.itcast.domain.Emp;
import cn.itcast.util.JDBCUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
 */
public class JDBCDemo8 {

    public static void main(String[] args) {
        List<Emp> list = new JDBCDemo8().findAll();
        System.out.println(list);
        System.out.println(list.size());
    }
    /**
     * 查询所有emp对象
     * @return
     */
    public List<Emp> findAll(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Emp> list = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            //3.定义sql
            String sql = "select * from student";
            //4.获取执行sql的对象
            stmt = conn.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.遍历结果集,封装对象,装载集合
            Emp emp = null;
            list = new ArrayList<Emp>();
            while(rs.next()){

                // 创建emp对象,并赋值
                emp = new Emp();
                emp.setId(rs.getInt("id"));
                emp.setName(rs.getString("name"));
                emp.setAge(rs.getInt(3));
                emp.setScore(rs.getDouble(4));
                emp.setDatetime(rs.getString("insert_time"));
                emp.setAdress(rs.getString("adress"));
                //装载集合
                list.add(emp);
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }

四、JDBC工具类封装

 ① 创建一个JDBC的配置文件,相当于我们.net项目中的配置文件

url=jdbc:mysql://127.0.0.1/db1  
user=root
password=root
#方便更改数据库驱动 程序
driver=com.mysql.jdbc.Driver  

JDBC—(Java DataBase Connectivity)

② 抽取工具类,相当于.net当中的SQLHelper类

package cn.itcast.util;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具类
 */
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    /**
     * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
     */
    static {
        //读取资源文件,获取值。

        try {
            //1. 创建Properties集合类。
            Properties pro = new Properties();
            //获取src路径下的文件的方式--->ClassLoader 类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();
            //2. 加载文件
            // pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));
            pro.load(new FileReader(path));
            //3. 获取数据,赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //4. 注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     *
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {

        return DriverManager.getConnection(url, user, password);
    }

    /**
     * 释放资源
     *
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

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


    /**
     * 释放资源
     *
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

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

}

  ③ 简化后的查询方法

public List<Emp> findAll() {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Emp> list = null;
        try {
            conn = JDBCUtils.getConnection();
            //1.定义sql
            String sql = "select * from student";
            //2.获取执行sql的对象
            stmt = conn.createStatement();
            //3.执行sql
            rs = stmt.executeQuery(sql);
            //4.遍历结果集,封装对象,装载集合
            Emp emp = null;
            list = new ArrayList<Emp>();
            while (rs.next()) {
                //获取数据
                // 创建emp对象,并赋值
                emp = new Emp();
                emp.setId(rs.getInt("id"));
                emp.setName(rs.getString("name"));
                emp.setAge(rs.getInt(3));
                emp.setScore(rs.getDouble(4));
                emp.setDatetime(rs.getString("insert_time"));
                emp.setAdress(rs.getString("adress"));
                //装载集合
                list.add(emp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, conn);
        }
        return list;
    }

  关于JDBC的基础学习就先到这里,后续将持续更新该方面的学习,记得关注哦!