JDBC学习1

本文介绍了JDBC的概念,强调它是一套操作关系型数据库的接口规范。内容包括JDBC的本质、快速入门步骤、四大核心对象(DriverManager、Connection、Statement、ResultSet)的详细解释和用途,特别是PreparedStatement的预编译SQL特性,以及JDBCUtils工具类的抽取以提高代码复用性和安全性。此外,还提供了练习案例,如添加记录和用户登录验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC

概念

Java DataBase Connectivity Java 数据库连接, Java语言操作数据库

JDBC本质:

其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。

各个数据库厂商去实现这套接口,提供数据库驱动jar包。

我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

快速入门

  1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
  • 复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
  • 右键–>Add As Library
  1. 注册驱动
  2. 获取数据库连接对象 Connection
  3. 定义sql
  4. 获取执行sql语句的对象 Statement
  5. 执行sql,接受返回结果
  6. 处理结果
  7. 释放资源
package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/* jdbc快速入门*/
public class jdbcDemo1 {
    public static void main(String[] args) throws Exception {
        //1.导入驱动jar包
        //2.注册驱动  mysql5之后驱动可以不写,会自动注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //3.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
        //4.定义sql语句
        String sql = "update account set balance = 500 where id = 1";
        //5.获取执行的sql对象 Statement  conn.createstatement()
        Statement stmt = conn.createStatement();
        //6.执行sql对象   stmt.excuteupdate(string sql)
        int count = stmt.executeUpdate(sql);
        //7.处理结果
        System.out.println(count);
        //8.释放资源
        stmt.close();
        conn.close();

    }

}

详解各个对象

1.DriverManager:驱动管理对象

1.作用一:注册驱动(一般不用)

|返回值 | 方法介绍 | 方法介绍 |
static void | registerDriver(Driver driver) | 注册驱动|
使用static void registerDriver(Driver driver) 可以帮我们完成驱动的注册,但是开发中我们一般都不用,因为使用这个方法就会导致驱动被注册两次.
写代码使用:Class.forName("com.mysql.jdbc.Driver");
在代码中有一段静态代码块,静态代码块已经调用了注册驱动的方法。如果再手动调用该方法注册驱动,就会导致驱动被注册两次.所以mysql5 之后可以不手动注册驱动

static {
    try {
        DriverManager.registerDriver(new Driver());
    } catch (SQLException var1) {
        throw new RuntimeException("Can't register driver!");
    }
}
作用二:获取数据库连接
  • 方法
  • 使用static Connection getConnection(String url, String user, String password)可以帮我们获取与数据库的连接

这个方法中有三个参数:

  • url :与数据库连接的路径
  • 语法jdbc:mysql://ip地址:端口/数据库名称
  • "jdbc:mysql://localhost:3306/db1"
  • url如果连接的是本机的路径,并且默认端口为3306,可以简化为如下格式:jdbc:mysql:///db1
  • user :与数据库连接的用户名

  • password :与数据库连接的密码

  • jdbc : 连接数据库的协议(固定)

  • mysql : 是jdbc的子协议

  • localhost : 连接的MySQL数据库服务器的主机地址。(连接是本机就可以写成localhost),如果连接不是本机的,就需要写上连接主机的IP地址。

  • 3306 :MySQL数据库服务器的端口号

  • :数据库名称

2.Connection:数据库连接对象

作用一: 获取执行SQL语句的对象
  • Statement createStatement() 获取执行SQL语句的对象
PreparedStatement	prepareStatement(String sql)

预编译SQL

作用二:管理事物
  • 开启事物 void setAutoCommit(boolean autoCommit) 调用该方法设置参数为false,即开启事物
  • 提交事务 void commit()
  • *回滚事务 void rollback()

3.Statement:执行sql的对象

作用一:执行SQL

1.boolean execute(String sql) 执行SQL语句
2.ResultSet executeQuery(String sql) 执行查询 DQL (select)语句
3.int executeUpdate(String sql) 执行增(insert),删(delete),改(update)DML语句, DDL(create,alter,drop)语句

**练习:account 添加一条记录
**

package cn.itcast.jdbc;
/*account表  添加一条记录 insert语句*/

import javax.swing.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class jdbcDemo2 {
    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 account values(3,'王五',3000)";
            //3.获取connection对象   alt+enter
            try {
                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 (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally{
           // stmt.close();  可能依旧为空 为了避免空指针异常
            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            //conn.close();
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

4.ResultSet:结果集对象,封装查询结果

作用:遍历结果集,获取结果集数据

1.boolean next() 将光标从当前位置向下移一行,如果有下一行数据返回true,没有下一行数据返回false

  • getxxx方法 xxx代表数据类型

2.int getInt(int columnIndex) 获取结果集中指定列的值,转化成int类型返回

3.int int getInt(String columnLabel) 获取结果集中指定列的值 ,转化成int类型返回

4.long getLong(int columnIndex) 获取结果集中指定索引列的值 ,转化成long类型返回
5. 获取结果集中指定列名的列的值,转化成long类型返回

6.String getString(int columnIndex) 获取结果集中指定索引列的值,转化成String类型返回

7.String getString(String columnLabel) 获取结果集中指定列名的列的值,转化成String类型返回

8.Object getObject(int columnIndex) 获取结果集中指定索引列的值,转化成Object类型返回

9.Object getObject(int columnLabel) 获取结果集中指定列名的列的值,转化成Object类型返回

在这里插入图片描述

在这里插入图片描述
以下为正确使用:
1.游标向下移动一行
2.判断是否有数据
3.获取数据

//6.1循环判断游标是否是最后一行末尾。
while(rs.next()){
   //获取数据
   //6.2 获取数据
   int id = rs.getInt(1);
   String name = rs.getString("name");
   double balance = rs.getDouble(3);

   System.out.println(id + "---" + name + "---" + balance);
}

5.PreparedStatement:执行sql的对象

1.SQL注入问题
在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

1. 输入用户随便,输入密码:a' or 'a' = 'a
2. 使用sql拼接会将sql拼接为:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'

2.解决sql注入问题:使用PreparedStatement对象来解决,预编译的SQL使用 ? 作为占位符

1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
  * 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
5. 获取执行sql语句的对象 PreparedStatement ps =   Connection.prepareStatement(String sql)
6. 给?赋值:
  * 方法: setXxx(参数1,参数2)
    * 参数1:?的位置编号 从1 开始
    * 参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源
抽取JDBC工具类 :JDBCUtils
  • 目的 : 简化书写
  • 分析 :
  1. 将注册驱动,获取连接,释放资源的操作抽取到一个工具类中
    2.抽取一个方法获取新连接对象
  • 需求 : 不想传递参数,并保证工具类的通用性
  • 解决 : 配置文件
jdbc.properties
url=
user = 
password=

  1. 抽取一个方法释放资源
package cn.itcast.Utils;

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

/*JDBC工具类*/
public class JBDCUtils {
    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路径下文件的方式  ----- ClassLoder 类加载器
加载字节码文件进内存,可以获取src路径下文件的方式
 */
        ClassLoader classLoader = JDBCUtils.class.getClassLoader();
        URL res = classLoader.getResource("jdbc.propertues");
        String path = res.getPath();
        System.out.println(path);

        //2.加载文件
        //pro.load(new FileReader("src/jdbc.properties")); // 这里静态代码块只能处理异常,不能抛出异常,因为抛要借助于方法才可以声明异常
        pro.load(new FileReader(path));

        //3.获取数据,赋值
        url = pro.getProperty("url");
        user = pro.getProperty("user");
        password = pro.getProperty("password");
        driver = pro.getProperty("password");

        //4.注册驱动
        lass.forName(driver);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

    /*获取连接
    @return 连接对象
     */
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, user, password);

    }

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

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

    }

    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();
            }
        }

    }
}

在这里插入图片描述

练习
  • 需求 :
    1.通过键盘录入用户名和密码
    2.判断用户是否登录成功
  • 步骤 :
  1. 创建一个数据库表
    在这里插入图片描述
CREATE TABLE USER(
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(32),
  PASSWORD VARCHAR(32)

);

INSERT INTO USER VALUES(NULL,'zhangsan','123');
INSERT INTO USER VALUES(NULL,'lisi','234');

2.判断用户是否登录成功

select * from user where username = "" and password = "";

代码实现:

public static boolean login(String username,String password) throws SQLException {

    //1. 获取连接
    Connection connection = JdbcUtils.getConnection();
    //2. 获取执行sql语句的对象
    Statement st = connection.createStatement();
    //3. 定义sql语句
    String sql = "select * from user where username = '"+username+"' and password = '"+password +"'";
    //4. 执行sql语句
    ResultSet rs = st.executeQuery();
    return  rs.next();
}
/**
     * 登录方法2  使用PrepareStatement实现
     */
    public boolean login2(String username, String password){
        if(username == null || password == null){
            return false;
        }

        // 连接数据库判断是否登录成功
        Connection conn = null;
        PrepareStatement pstmt = null;
        ResultSet rs = null;

        try {
            //1.获取连接
            conn = JDBCUtils.getConnection();
            //2.定义sql
            String ql = "select * from user where username = ? and password = ?";
            //3.获取执行sql对象
           pstmt = conn.prepareStatement(sql);
            //4.执行查询 ,不用传递sql
            rs = pstmt.executeQuery();
            //5.判断
        /*
        if(rs.next()){  // 如果有下一行,返回true
            return true;
        }else{
            return false;
        }
        */
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.close(rs, pstmt, conn);

        }

        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值