JDBC

本文介绍了JDBC的基本概念、核心组件(DriverManager、Connection、Statement、PreparedStatement和ResultSet)以及如何在Java中实现JDBC连接数据库、执行SQL语句和结果集处理。重点讲解了PreparedStatement的安全优势和使用示例。

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

JDBC

JDBC(Java DataBase Connectivity)java数据库连接

是一种用于执行SQL语句的JavaAPI,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成

有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库.

JavaAPI中提供了操作数据库的标准接口,最终由不同的数据库开发商实现这些标准接口来对数据库操作.

JDBC API:

供程序员调用的接口与类,集成在java.sql包中

(1)DriverManager类作用:管理各种不同的JDBC驱动

(2)Connection 接口 与特定数据库的连接

(3) Statement 接口 执行sql

(4)PreparedStatement接口 执行sql

(5)ResultSet接口 接收查询结果

JDBC搭建
  • 在工程目录下新建 lib 目录,将需要的jar包复制到该目录下

  • 将jar包引入工程

  • 编写程序

(1)注册JDBC驱动程序:

这需要初始化驱动程序,这样就可以打开与数据库的通信信道。

Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现

或者

DriverManager.registerDriver(new Driver());

(2)建立与数据库连接:

  • 使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个物理连接的数据库.

  • Connection conn = DriverManager.getConnection(URL,USER,PASS);

URL:jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库名?characterEncoding=utf8&useSSL=false&serverTimezone=UTC

USER:用户名(root)

PASS:密码

执行sql语句

(1)获得Satement执行sql语句

Statement st = connection.createStatement();

Satement中的方法:

Int executeUpdate(String sql) 用于执行ddl语句和dml(增,删,改)语句 返回操作的行数

用于执行ddl语句返回0

用于执行dml语句返回操作的行数

ResultSet executeQuery(String sql); 用于执行查询语句 返回一个ResultSet 集合

(2)获得PrepareStatement执行sql语句

在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数

PrepareStatement ps = connection.prepareStatement(sql);

PrepareStatement中的方法:

Int executeUpdate() 用于执行ddl语句和dml(增,删,改)语句 返回操作的行数

用于执行ddl语句返回0

用于执行dml语句返回操作的行数

ResultSet executeQuery(); 用于执行查询语句 返回一个ResultSet 集合

(3)关闭与数据库的链接通道

每次操作完成后关闭所有与数据库交互的通道

st.close();

rs.close();

conn.close();

ps.close();

package day1;

import com.mysql.cj.jdbc.Driver;

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

public class Demo {
    /*
        jdbc 搭建步骤:
        1.导入mysql数据包,里面具体的连接实现
        2.加载数据库
        3.建立与数据库的连接
        4.向数据库发送语句
        5.接收查询的结果
        6关闭与数据库的连接通道
         */
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver"); // 利用反射机制加载Driver类
            // 加载驱动
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        /*try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }*/
        // 建立与数据库的连接
        try {
            // ? 后面都是参数,  键=值&键=值
            String url = "jdbc:mysql://127.0.0.1:3306/t_school?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
          Connection connection= DriverManager.getConnection(url,"root","111111");
          //发送sql语句
            String name = "王五";
            String sex = "男";
            String phone = "152333333";
            int gradeId  = 2;
            //获得Statement ,用于向数据库发送sql语句(静态)
            Statement st=connection.createStatement();
            /*execute(sql) 如果执行有返回结果--true, 没有结果--false
            boolean b=st.execute("create table test(id int,name varchar(10))");
            System.out.println(b);*/

          int se=  st.executeUpdate("INSERT INTO student(NAME,sex,phone,grade_id,reg_time) " +
                    "Values('"+name+"','"+sex +"','"+phone+"','"+gradeId+"','2021-01-20 18:36:10')");
            System.out.println(se);
            // 关闭数据库的连接通道
            st.close();
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

PreparedStatement和Statement区别

(1)代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次

(2)最重要的一点是极大地提高了安全性.

防止注入
例子: Stringsql=“ delete from user where id = ”+num;
   如果我们把[or 1=1]作为id传入进来?
   delete from tb_name where id = 1 or 1 = 1;
   因为‘1’=‘1’肯定成立

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系. 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.

结果集处理

  • PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中.

  • 使用ResultSet中的next()方法获得下一行数据

  • 使用getXXX(String name)方法获得值

package day2;

import java.sql.*;

public class PreparedStatementDemo {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver"); // 利用反射机制加载Driver类
            // 加载驱动
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //建立与数据库的连接
        try {
            // ? 后面都是参数,  键=值&键=值
            String url = "jdbc:mysql://127.0.0.1:3306/t_school?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
            Connection connection= DriverManager.getConnection(url,"root","111111");
            //发送sql语句
            String name = "王五";
            String sex = "男";
            String phone = "152333333";
            int gradeId  = 2;
            //将sql语句预先编译到 PreparedStatement, ? 占位符,表示此处需要传值,并没有向数据库发送
          /*  PreparedStatement ps=connection.prepareStatement("insert into student (name,sex,phone,grade_id,reg_time)" +
                    "values(?,?,?,?,?)");
            //然后通过指定的方法向sql语句中的占位符赋值,
                    ps.setString(1,name);
                    ps.setString(2,sex);
                    ps.setString(3,phone);
                    ps.setInt(4,gradeId);
                    ps.setDate(5,new Date(new java.util.Date().getTime()));
                   // ps.setObject(5,new java.util.Date());
            //最后向数据库发送sql
            ps.executeUpdate();*/
            PreparedStatement ps=connection.prepareStatement("delete from student where name=?");
                        ps.setString(1,name);

                        int res=ps.executeUpdate();
            System.out.println(res);
            ps.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

package day2;

import java.sql.*;
import java.util.ArrayList;
import java.util.Date;

public class ResultDemo1 {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver"); // 利用反射机制加载Driver类
            // 加载驱动
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //建立与数据库的连接
        try {
            // ? 后面都是参数,  键=值&键=值
            String url = "jdbc:mysql://127.0.0.1:3306/t_school?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
            Connection connection= DriverManager.getConnection(url,"root","111111");
            PreparedStatement ps=connection.prepareStatement("select num,name,sex,phone,grade_id,reg_time " +
                    " from student where num=?");
            //executeQuery()  方法会将查询的结果封装在Result 可以是多条
            ResultSet rs = ps.executeQuery();
            //从Result 中将数据提取  rs.next()判断Result中还有没有数据
            ArrayList<Student> list=new ArrayList<Student>();

                while (rs.next()){
                    Student stu=new Student();
                  stu.setNum(rs.getInt("num"));
                   stu.setName(rs.getString("name"));
                   stu.setSex(rs.getString("sex"));
                   stu.setPhone(rs.getString("phone"));
                   stu.setGradeId( rs.getInt("grade_id"));
                    // rs.getDate()  只能获得年月日
                    Date s =rs.getTimestamp("reg_time");
                    list.add(stu);
                }
            System.out.println(list.size());
            ps.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

package day2;

import java.util.Date;

public class Student {
    private  int num;
    private  String name;
    private  String sex;
    private  String phone;
    private  int gradeId;

    public void setNum(int num) {
        this.num = num;
    }

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

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public void setGradeId(int gradeId) {
        this.gradeId = gradeId;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值