JDBC

JDBC学习

1.JDBC入门

1.1什么是JDBC

JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。

JDBC是Java访问数据库的标准规范,真正操作数据库还需要具体实现类,也就是数据库驱动。每个数据库厂商根据自家数据库通信格式编写自家的数据库驱动。所以我们只需调用JDBC接口中的方法即可,数据库驱动有数据库厂商提供。

1.2使用JDBC好处

1)程序员如果要开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用关注类是如何实现的。

2)使用同一套java代码,进行少量的修改就以访问其他JDBC支持的数据库。

JDBC

1.3使用JDBC开发用到的包

会使用到的包说明
java.sql所有与JDBC访问数据库相关的接口和类
javax.sql数据库扩展包,提供数据库额外功能。如:连接池
数据库驱动有各大数据库厂商提供,需要额外去下载,是对JDBC接口实现的类

1.4JDBC的核心API

接口或类作用
DriverManager 类1)管理和注册数据库驱动
2)得到数据库连接对象
Connection 接口一个连接,可用于创建Statement和PreparedStatement对像
Statement 接口一个SQL语句对象,用于发送给数据库服务器
PreparedStatement 接口一个SQL语句对象,是Statement的子接口
ResultSet 接口封装数据库查询的结果集,对结果集进行遍历,取出每一条记录

1.5注册驱动

加载驱动或注册驱动的方法描述
Class.forName(数据库驱动实现类)要求JVM查找并加载指定的类,数据库驱动由mysql厂商"com.mysql.jdbc.Driver"
  • 注:从JDBC3开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName这句话可以省略。

2.DriverManager类

2.1 DriverManager 作用:

​ 1)管理和注册驱动

​ 2)创建数据库的连接

2.2类中的方法:

DriverManage 类中的静态方法描述
Connection getConnection(String url,String user,String password)通过连接字符串,用户名,密码来得到数据库连接对象
Connection getConnection (String url,Properties info)通过连接字符串,属性对象来得到连接对象

2.3使用JDBC连接数据库的四个参数

JDBC连接数据库的四个参数说明
用户名登录的用户名
密码登录的密码
连接字符串URL不同的数据库URL是不同,mysql的写法jdbc:mysql://localhost:3306/数据库[?参数名=参数值]
驱动类的字符串名com.mysql.jdbc.Driver

2.4 连接数据库的URL地址格式

协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数名

2.4.1MySQL写法

URL

2.4.2 MySQL中可以简写

前提:必须是本地服务器,端口号是3306

jdbc:mysql:///数据库名

2.4.3乱码的处理

如果数据库出现乱码,可以指定参数: ?characterEncoding=utf8,表示让数据库以 UTF-8 编码来处理数据

jdbc:mysql://localhost:3306/数据库?characterEncoding=utf8

2.5案例:得到MySQL的数据库连接对象

1)使用用户名、密码、URL得到连接对象

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @description
 * @author: yyq
 */
public class JDBC {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:mysql://localhost:3306/jdbc";
        Connection connection = DriverManager.getConnection(url, "root", "123456");
        //com.mysql.jdbc.JDBC4Connection@31221be2
        System.out.println(connection);
    }
}

2)使用属性文件和url得到连接对象

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

/**
 * @description
 * @author: yyq
 */
public class JDBC {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:mysql://localhost:3306/jdbc";
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","123456");
        Connection connection = DriverManager.getConnection(url, info);
        //com.mysql.jdbc.JDBC4Connection@31221be2
        System.out.println(connection);
    }
}

3.Connection接口

3.1 connection作用

connection 接口,具体的实现类由数据库厂商实现,代表一个连接对象。

3.2Connection 方法

connection接口中的方法描述
Statement createStatement()创建一条SQL语句对象

4. Statement接口

4.1 JDBC访问数据库步骤

DriverManager

1)注册和加载驱动(可以省略)

2)获取连接

3)Connection获取Statement

4)使用Statement对象执行对象

5)返回结果集

6)释放资源

4.2 Statement作用

代表一条语句对象,用于发送SQL语句给服务器,要用于执行静态SQL语句并返回它所生成结果集的对象

4.3 Statement中的对象方法

Statement接口中的方法描述
int executeUpdate(String sql)用于发送DML语句,增删改的操作,insert、update、delete
参数:SQL语句
返回值:返回对数据库影响的行数
ResultSet executeQuery(String sql)用于发送DQL语句,执行查询的操作。select
参数:SQL语句
返回值:查询的结果集

4.4 释放资源

1)需要释放的对象:ResultSet结果集,Statement语句,Connection 连接

2)释放原则:先开的后关,后开的先关。 ResultSet ->Statement ->Connection

  1. 放在哪个代码中:finally 块

4.5 执行DDL操作

4.5.1需求:使用JDBC在MySQL的数据库中创建一张学生表

Student

4.5.2代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @description
 * @author: yyq
 */
public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8";
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","123456");
        Connection connection=null;
        Statement statement=null;
        try {
            //1.创建连接
             connection = DriverManager.getConnection(url, info);
            //2.通过连接对象获取语句对象
            statement=connection.createStatement();
            //3.通过语句对象发送SQL语句给服务器
            //4.执行SQL
            String sql="create table student(id int PRIMARY KEY auto_increment,"+
                    "name varchar(20) not null,gender ENUM('男','女') NOT NULL)ENGINE = INNODB DEFAULT CHARSET = utf8 ";
            System.out.println(sql);
            statement.executeUpdate(sql);
            //5.返回影响行数(DDL没有返回值)
            System.out.println("创建表成功");

        } catch (SQLException e) {
            e.printStackTrace();
            //6.释放资源
        }finally {
           //关闭之前要先判断
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }

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

        }

    }
}

4.6执行DML操作

  • 需求像学生表中添加4条记录,主键是自动增长

在这里插入图片描述

  • 步骤

1)创建连接对象

2)创建Stamement语句对象

3)执行SQL语句:executeUpdate(sql)

4)返回影响的行数

5)释放资源

  • 代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @description
 * @author: yyq
 */
public class JDBC {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8";
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","123456");
        Connection connection=null;
        Statement statement=null;
            //1.创建连接
             connection = DriverManager.getConnection(url, info);
            //2.通过连接对象获取语句对象
            statement=connection.createStatement();
            //3.通过语句对象发送SQL语句给服务器
            //4.执行SQL
            int count=0;
            String sql="INSERT INTO student(name,gender)" +
                    "VALUES" +
                    "('yyq','男')," +
                    "('mm','男')," +
                    "('yzh','男')" ;
            count=statement.executeUpdate(sql);
            System.out.println("插入了" + count + "条记录");
            //5.返回影响行数
            System.out.println("创建表成功");

    }
}

4.7执行DQL操作

4.7.1 ResultSet接口

  • 作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录

  • 接口中方法:

    ResultSet接口中的方法描述
    bool next()1)游标向下移动1行
    2)返回boolean类型,如果还有下一条记录,返回true,反之false
    数据类型 getXxx()1)通过字段名,参数是String类型,返回不同的类型
    2)通过列号,参数是整数,从1开始。返回不同的

    API

4.7.2 常用数据类型转型表

SQL类型JDBC对应方法返回类型
BIT(1) bit(n)getBoolean()boolean
TINYINTgetByte()byte
SMALLINTgetShort()short
INTgetInt()int
BIGINTgetLong()long
CHAR,VARCHARgetString()String
TEXT(Clob) BlobgetClob() getBlob()Clob Blob
DATEgetData()java.sql.Date 只代表日期
TIMEgetTime()java.sql.Time 只表示时间
TIMESAMPgetTimestamp()java.sql.Timestamp同时有时间和日期
java.sql.Date、Time、Timestamp(时间戳),三个共同父类是:java.util.Date

4.7.3 需求:确保数据库中有3条以上的记录,查询所有的学员信息

  • 步骤

1)得到连接对象

2)得到语句对象

3)执行SQL语句得到结果集ResultSet对象

4)循环遍历取出每一条记录

5)输出在控制台上

6)释放资源

在这里插入图片描述

import java.sql.*;
import java.util.Properties;

/**
 * @description
 * @author: yyq
 */
public class JDBC {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8";
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","123456");
        Connection connection=null;
        Statement statement=null;
            //1.创建连接
             connection = DriverManager.getConnection(url, info);
            //2.通过连接对象获取语句对象
            statement=connection.createStatement();
            //3.通过语句对象发送SQL语句给服务器
            //4.执行SQL
        ResultSet resultSet = statement.executeQuery("select * from student");

        while(resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            String gender = resultSet.getString("gender");
            System.out.println("编号:"+id+",姓名:"+name+"性别:"+gender);
        }

        resultSet.close();
        statement.close();
        connection.close();
    }
}

4.7.4 关于ResultSet 接口中的注意事项

  1. 如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set

  2. 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set

  3. 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection

5. PreparedStatement

5.1继承结构与作用

在这里插入图片描述

PreparedStatement 是Statement 接口的子接口,继承与父接口中所有的方法。它是一个预编译的SQL语句。

5.2 PreparedStatement 的执行原理

在这里插入图片描述

1)因为有预先预编译功能,提高SQL的执行效率。

2)可以有效防止SQL注入问题,安全性高。

5.3 Connection 创建 PreparedStatement 对象

Connection 接口中的方法描述
PreparedStatement preparedStatement(String sql)指定预编译的SQL语句,SQL语句中使用占位符?创建一个语句对象

5.4 PreparedStatement 接口中的方法

PreaparedStatement接口中的方法描述
int executeUpdate()执行DML,增删改的操作,返回影响的行数
ResultSet executeQuery()执行DQL,查询的操作,返回结果集

5.5 PreparedStatement 的好处

  1. reparedStatement()会将SQL语句发送给数据库预编译。PreparedStatement会引用着预编译的结果。
    可以多次传入不同的参数给PreparedStatement对象并执行。减少SQL编译次数,提高效率。
  2. 安全性更高,没有SQL注入的隐患。
  3. 提高程序的可读性

5.6使用PreparedStatement 的步骤

1)编写SQL语句,未知内容使用?占位"SELECT * FROM user WHERE name=? AND password=?";

2)获得PreparedStatement 对象

3)设置实际参数:setXxx(占位符的位置,真实的值)

4)执行SQL语句

5)关闭资源

PreparedStatement中设置参数的方法描述
void setDouble(int parameterIndex, double x)将指定参数设置为给定 Java double 值
void setFloat(int parameterIndex, float x)将指定参数设置为给定 Java REAL 值
void setInt(int parameterIndex, int x)将指定参数设置为给定 Java int 值
void setLong(int parameterIndex, long x)将指定参数设置为给定 Java long 值
void setObject(int parameterIndex, Object x)使用给定对象设置指定参数的值
void setString(int parameterIndex, String x)将指定参数设置为给定 Java String 值
void setDouble(int parameterIndex, double x)将指定参数设置为给定 Java double 值
void setFloat(int parameterIndex, float x)将指定参数设置为给定 Java REAL 值
void setInt(int parameterIndex, int x)将指定参数设置为给定 Java int 值
void setLong(int parameterIndex, long x)将指定参数设置为给定 Java long 值
void setObject(int parameterIndex, Object x)使用给定对象设置指定参数的值
void setString(int parameterIndex, String x)将指定参数设置为给定 Java String 值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请多多指教呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值