JDBC重要知识点及案例

第一部分:今日技术操作及其概述

* 课堂知识点笔记
*导包都是java.sql包
*配置文件在src上面右键,选择file,是 .properties格式

1.什么是JDBC
*JDBC(Java Data Base Connectivity.java数据库连接)是一种用于执行SQL语句的java API,可以为多种关系数据库
提供统一访问,它由一组用java语言编写的类和接口组成。

2.什么是数据库驱动
*驱动:两个设备(应用)之间通信的桥梁。

3.为什么学习JDBC
*SUN公司提供一套统一的规范(接口)。然后各个数据库生产商提供这套接口的实现。这套接口规范就是JDBC的规范。

4.如何创建项目
*引入jar包(可以在项目下创建一个lib包,把jar包复制到里面,在右键添加到Build path中)

5.JDBC开发步骤
[1]注册驱动
[2]获取数据库连接
[3]获取执行者对象
[4]执行sql语句。并且获取结果集
[5]处理结果集
[6]释放资源

6.JDBC的API详解之DriverManager
*DriverManager是一个驱动管理类
*作用一:注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
*作用二:获得连接
url: 与数据库连接的路径
user: 与数据库连接的用户名
password:与数据库连接的密码
主要关注的是url写法
*jdbc:mysql://localhost:3306/web_test3
jdbc :连接数据库的协议
mysql :是jdbc的子协议
localhost :连接的MySQL数据库服务器的主机地址。(连接是本机就可以写成localhost),如果连接不是本机的,就需要写上连接主机的IP地址。
3306 :MySQL数据库服务器的端口号
web_test3 :数据库名称

7.JDBC的API详解之Connection
*Connection:与数据库连接对象 (连接者)
*作用一:创建执行SQL语句的对象
[1]Statement 执行SQL
[2]PreparedStatement 执行SQL对SQL进行预处理。解决SQL注入漏洞
*作用二:管理事务

8.JDBC的API详解之Statement
*Statement:执行SQL (执行者)
*作用一:执行SQL
?ResultSet executeQuery(String sql); 执行查询(执行select语句)。
int executeUpate(String sql); 执行修改,添加,删除的SQL语句。
*作用二:执行批处理

9.JDBC的API详解之ResultSet
*ResultSet:结果集。(通过select查询,只有查询才能有结果集)
*遍历结果集 rs.next()

10.JDBC的资源释放
*JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet,Statement,Connection。
这几个对象中尤其是Connection对象是非常稀有的。这个对象一定要做到尽量晚创建,尽早释放掉。(connection是与数据库的连接)
*将资源释放的代码写入到finally的代码块中。

11.JDBC工具类的抽取
*因为传统JDBC的开发,注册驱动,获得连接,释放资源这些代码都是重复编写的。所以可以将重复的代码提取到一个类中来完成。

12.JDBC的配置信息提取到配置文件 【公共的部分通过工具类给抽取出来了,还需要将JDBC配置信息提取到配置文件中】
*第一种:?属性文件
格式:扩展名是.properties
内容:key=value
*第二种: XML文件

?reWriteBacthedStatements=true     加快运行速度,在配置文件的路径后面加上能够提高运行速度
eg:url=jdbc:mysql://localhost:3306/day23?reWriteBacthedStatements=true

======================================================================================================

=====老师课堂代码补充=====

[1] JDBC开发步骤———————– 【*面试可能会问到】★★★★★

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet; //导包都是sql包

/*
* 回顾原生的JDBC开发步骤
*/
public class JDBCDemo01 {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName(“com.mysql.jdbc.Driver”); //Driver d一定要大写,小写就出错

    //2.获取数据库连接
    String url = "jdbc:mysql://localhost:3306/day23";   //day23是数据库的名字
    String username = "root";
    String password = "root";
    Connection con = DriverManager.getConnection(url, username, password);

    //3.获取执行者对象
    //Statement stat = con.createStatement();  存在sql注入攻击的安全隐患
    String sql = "SELECT * FROM student";   //--------预处理,student是表名,不是数据库名字
    PreparedStatement pst = con.prepareStatement(sql);
    //给你的sql语句中?占位符赋值
    //pst.setXXX(编号,值);

    //4.执行sql语句。并且获取结果集
    ResultSet rs = pst.executeQuery();

    //5.处理结果集
    while(rs.next()) {
        System.out.println(rs.getInt("sid") + "\t" + rs.getString("sname") + "\t" + rs.getInt("sage") + "\t" + rs.getDouble("score"));
    }

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

}

[2]JDBC文件配置———————–
driverClass=com.mysql.jdbc.Driver 【不能加双引号】
url=jdbc:mysql://localhost:3306/day23?reWriteBacthedStatements=true
username=root
password=root

username=zs 【可以加#进行注释,如果用到这个用户名和密码,在把这个#去掉,把username和password加上#】

password=zs001

[3]JDBC工具类———————————————-
package com.itheima.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
//私有构造方法
private JDBCUtils(){}

//声明一些配置文件所需要的成员变量
private static Connection con;      // 数据库连接对象       
private static String driverClass;  // 注册驱动部分
private static String url;          // url部分
private static String username;     // 用户名
private static String password;     // 密码

static {      【静态代码块】
    try{
        //读取配置文件信息,为成员变量进行赋值
        Properties prop = new Properties();
        InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");    【db.properties 配置文件文件名称】
        prop.load(is);

        driverClass = prop.getProperty("driverClass");          //为成员变量进行赋值,读的是配置文件里面对应的值,通过键获得值
        url = prop.getProperty("url");                          //要加双引号,如果不加双引号就是上面配置文件的私有成员变量,就不是配置文件里面的键值对的值
        username = prop.getProperty("username");
        password = prop.getProperty("password");

        //注册驱动
        Class.forName(driverClass);         //driverClass在配置文件中就是=com.mysql.jdbc.Driver,所以这里只需要写driverClass即可

        //获取数据库连接
        con = DriverManager.getConnection(url, username, password);
    }catch(Exception e) {
        e.printStackTrace();
    }
}

//提供一个公共的静态的方法,用于返回数据库连接对象    -----在static括号外面写
public static Connection getConnection(){    【上面con被私有了,不能创建对象,只有通过类名调用】
    return con;              【便于增删改查,调用con】
}

//提供释放资源的方法         【前固定,后可以变con stat  rs】
public static void release(Connection con,Statement stat,ResultSet rs){        【release方法名,可变】
    if(con != null) {
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();

        }
        con = null;
    }

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

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

public static void release(Connection con,Statement stat){     【方法重载,这个是没有结果集的,增删改没有结果集,上面一个是有结果集的】
    if(con != null) {
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        con = null;
    }

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

}

2.JDBC增删改查———————————————-
package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.itheima.utils.JDBCUtils;

/*
* 使用工具类完成增删改查的动作
*/
public class JDBCDemo02 {
public static void main(String[] args) {
//insert();
//del();
//update();
//select();
}

//查询的方法
public static void select(){
    Connection con = null;
    PreparedStatement pst = null;       //解决注入漏洞
    ResultSet rs = null;
    try{
        //获取数据库连接                [getConnection()是JDBc工具类中的静态方法]
        con = JDBCUtils.getConnection();      //工具类和数据库建立了连接,对于增删改查只需要和工具类建立连接,就是和数据库建立了连接

        //获取执行者对象
        String sql = "SELECT * FROM student WHERE score > ?";       // 查询分数大于85分的
        pst = con.prepareStatement(sql);
        //为?号占位符赋值
        pst.setDouble(1, 85);

        //执行sql语句,并且获取结果集
        rs = pst.executeQuery();

        //处理结果集
        while(rs.next()) {
            System.out.println(rs.getInt("sid") + "\t" + rs.getString("sname") + "\t" + rs.getInt("sage") + "\t" + rs.getDouble("score"));
        }

    }catch(Exception e) {
        e.printStackTrace();
    }finally{
        //释放资源
        JDBCUtils.release(con, pst, rs);
    }
}

//修改的方法
public static void update(){
    Connection con = null;
    PreparedStatement pst = null;
    try{
        //获取数据库连接
        con = JDBCUtils.getConnection();

        //获取执行者对象
        String sql = "UPDATE student SET sage=?,score=? WHERE sid=?";
        pst = con.prepareStatement(sql);
        //给?号占位符进行赋值
        pst.setInt(1, 25);       //【第一个占位符?的值,在数据库中改为25岁】
        pst.setDouble(2, 100);   //【第二个占位符?的值,在数据库中改为100分】
        pst.setInt(3, 2);        //【第三个占位符?的值,在数据库中改为对id为2的人,对其年龄和分数进行修改】

        //执行sql语句
        int num = pst.executeUpdate();
        if(num > 0) {             //数据库中有一个共有几行受到影响,如果>0,表示数据库中的至少一行受到影响,进行修改,就提示修改成功
            System.out.println("修改成功");
        }
    }catch(Exception e) {
        e.printStackTrace();
    }finally{
        //释放资源
        JDBCUtils.release(con, pst);
    }
}

//删除的方法
public static void del(){
    Connection con = null;
    PreparedStatement pst = null;
    try{                                  【try catch处理异常,如果后面出错还可以继续执行,直接抛出异常下面代码就不能继续执行】
        //获取数据库连接
        con = JDBCUtils.getConnection();

        //获取执行者对象
        String sql = "DELETE FROM student WHERE sid = ?";
        pst = con.prepareStatement(sql);
        //给?号占位符进行赋值
        pst.setInt(1, 1);

        //执行sql语句
        int num = pst.executeUpdate();
        if(num > 0) {
            System.out.println("删除成功");
        }
    }catch(Exception e) {
        e.printStackTrace();
    }finally{
        //释放资源
        JDBCUtils.release(con, pst);
    }
}

//插入的方法
public static void insert(){
    Connection con = null;
    PreparedStatement pst = null;
    try{
        //获取数据库连接    【前面注册驱动啥的,在工具类中已经创建好了,直接调用即可】
        con = JDBCUtils.getConnection();

        //获取执行者对象
        String sql = "INSERT INTO student VALUES (null,?,?,?)";
        pst = con.prepareStatement(sql);
        //给?号占位符进行赋值
        pst.setString(1, "赵六");
        pst.setInt(2, 26);
        pst.setDouble(3, 99.5);

        //执行sql语句
        int num = pst.executeUpdate();
        if(num > 0) {
            System.out.println("新增成功");
        }
    }catch(Exception e) {
        e.printStackTrace();
    }finally{
        //释放资源
        JDBCUtils.release(con, pst);
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值