八、JDBC

本文详细介绍了JDBC的概念、依赖包及核心API,包括如何加载和注册驱动、获取数据库连接以及执行SQL语句。通过实例演示了JDBCUtils工具类的创建,用户登录案例以及PreparedStatement接口的使用,强调了SQL注入问题和事务处理的重要性。
摘要由CSDN通过智能技术生成

主要内容:

  • 能够理解JDBC的概念
  • 能够使用DriverManager类
  • 能够使用Connection接口
  • 能够使用Statement接口
  • 能够使用ResultSet接口
  • 能够说出SQL注入原因和解决方案
  • 能够通过PreparedStatement完成增、删、改、查
  • 能够完成PreparedStatement改造登录案例

1 JDBC入门

1.1 客户端操作MySQL数据库的方式

  1. 使用第三方客户端来访问MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL;
    在这里插入图片描述
  2. 使用MySQL自带的命令行方式;
  3. 通过Java来访问MySQL数据库,今天要学习的内容。

1.2 JDBC的基本概念

  1. 概念:Java DataBase Connectivity(Java 数据库连接),Java语言操作数据库

  2. 本质:是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商提供各自的实现类去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

  3. 优点:

    1. 程序员如果要开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用关注类是如何实现的;
    2. 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库。

    在这里插入图片描述

1.3 JDBC依赖包与核心API

  1. JDBC开发使用到的包:
    使用到的包 说明
    java.sql 所有与JDBC访问数据库相关的接口和类
    javax.sql 数据库扩展包,提供数据库额外的功能。如:连接池
    数据库驱动 由各大数据库厂商提供,需要额外去下载,是对JDBC接口实现的类
  2. JDBC的核心API:
    接口或类 作用
    DriverManager类 1. 管理和注册数据库驱动
    2. 得到数据库连接对象
    Connection接口 一个连接对象,可用于创建Statement和PreparedStatement对象
    Statement接口 一个SQL语句对象,用于将SQL语句发送给数据库服务器
    PreparedStatement接口 一个SQL语句对象,是Statement的子接口
    ResultSet接口 用于封装数据库查询的结果集,返回给客户端Java程序

2 JDBC操作步骤

在这里插入图片描述

2.1 导入驱动Jar包

  1. 复制 mysql-connector-java-5.1.37-bin.jar 到项目的 lib 目录下:
    在这里插入图片描述
  2. 右键Add As Library
    在这里插入图片描述

2.2 加载和注册驱动

  1. 语法:Class.forName(数据库驱动实现类)
    数据库驱动由数据库厂商提供:

    • MySQL驱动类名:com.mysql.jdbc.Driver
    • Oracle驱动类名:oracle.jdbc.driver.OracleDriver
    • SQL server驱动类名:com.microsoft.jdbc.sqlserver.SQLServerDriver
    public class Demo1 {
         
        public static void main(String[] args) throws ClassNotFoundException {
         
    		//抛出类找不到的异常,注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
        }
    }
    
  2. 为什么这样可以注册驱动?
    查看 Class.forName(String className) 源码:

    @CallerSensitive
    public static Class<?> forName(String className) throws ClassNotFoundException {
         
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }
    

    再看 forName0 方法:

    private static native Class<?> forName0(String name, boolean initialize,
                                     ClassLoader loader,
                                     Class<?> caller)
    	throws ClassNotFoundException;
    

    forName0 是一个 native 方法(由非java语言实现),返回一个给定类或者接口的一个 Class 对象,如果没有给定 ClassLoader, 那么会使用根类加载器。如果 initalize 这个参数传了 true,那么给定的类如果之前没有被初始化过,则会被初始化。JDBC 传入的参数是 com.mysql.jdbc.Driver。也就是说这个类会被初始化,查看这个类的源码:

    public class Driver implements java.sql.Driver {
         
        static {
         
            try {
         
                DriverManager.registerDriver(new Driver()); //注册数据库驱动
            } catch (SQLException var1) {
         
                throw new RuntimeException("Can't register driver!");
            }
        }
    
        public Driver() throws SQLException {
         
        }
    }
    

    类在初始化的时候,静态代码块的内容会被执行的。也就是说我们 Class.forName 和直接写 DriverManager.registerDriver(new Driver) 两者功能是等同的。

    注:从JDBC3开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName这句话可以省略。

2.3 获取数据库连接

  1. DriverManager类:驱动管理对象。
    1. Connection getConnection (String url, String user, String password) :通过连接字符串,用户名,密码来得到数据库的连接对象;

      • url :数据库连接路径,用于标识数据库的位置,告知JDBC程序连接哪个数据库。
        • 格式:协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值
        • MySQL格式:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数=参数值
          在这里插入图片描述

          注:如果连接的是本地服务器,并且端口号是3306,可简写为:jdbc:mysql:///数据库名称

      • user :登录的用户名。
      • password :登录的密码。
      • 乱码处理:指定参数 ?characterEncoding=utf8,表示让数据库以UTF-8编码来处理数据。
        jdbc:mysql://localhost:3306/数据库?characterEncoding=utf8
      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.SQLException;
      
      public class Demo2 {
             
          public static void main(String[] args) throws SQLException {
             
              //使用用户名、密码、URL得到连接对象
              String url = "jdbc:mysql://localhost:3306/day24";
              Connection connection = DriverManager.getConnection(url, "root", "root");
              System.out.println(connection); //com.mysql.jdbc.JDBC4Connection@68de145
          }
      }
      
    2. Connection getConnection (String url, Properties info) :通过连接字符串,属性对象来得到连接对象。

      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.SQLException;
      import java.util.Properties;
      
      public class Demo3 {
             
          public static void main(String[] args) throws SQLException {
             
      		//url连接字符串
              String url = "jdbc:mysql://localhost:3306/day24";
      		//属性对象
              Properties info = new Properties();
      		//把用户名和密码放在info对象中
              info.setProperty("user", "root");
              info.setProperty("password", "root");
              Connection connection = DriverManager.getConnection(url, info);
              System.out.println(connection); //com.mysql.jdbc.JDBC4Connection@68de145
          }
      }
      

2.4 执行sql语句

  1. Connection接口:数据库连接对象。
    1. Statement createStatement() :创建一条SQL语句对象。
  2. ResultSet接口:结果集对象,用于封装查询结果。
    在这里插入图片描述
    • boolean next() :游标向下移动1行,判断当前指向的记录是否还有下一条记录,如果还有下一条返回true;否则返回false。

    • 参数数据类型 getXxx(参数)

      • 通过列名:
        getInt(“id”),getString(“name”),getBoolean("gender "),getDate(“birthday”)
      • 通过列号:
        getInt(1), getString(2),getBoolean(3),getDate(4)

      在这里插入图片描述
      常用数据类型转换表:

      SQL类型 JDBC对应方法 返回类型
      BIT(1) bit(n) getBoolean() boolean
      TINYINT getByte() byte
      SMALLINT getShort() short
      INT getInt() int
      BIGINT getLong() long
      CHAR,VARCHAR getString() String
      Text(Clob) Blob getClob getBlob() Clob Blob
      DATE getDate() java.sql.Date 只代表日期
      TIME getTime() java.sql.Time 只表示时间
      TIMESTAMP getTimestamp() java.sql.Timestamp 同时有日期和时间

      java.sql.Date、Time、Timestamp(时间戳),三个共同父类是:java.util.Date

  3. Statement接口:代表一条语句对象,用于发送SQL语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。
    1. 释放资源:

      1. 需要释放的对象:ResultSet结果集,Statement语句,Connection连接;
      2. 释放原则:先开的后关,后开的先关。ResultSet → Statement → Connection;
      3. 放在哪个代码块中:finally块。
    2. Statement中的方法:

      1. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句,返回对数据库影响的行数。

        1. 执行DDL操作:使用JDBC在MySQL的数据库中创建一张学生表。

          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.SQLException;
          import java.sql.Statement;
          
          public class Demo4DDL {
                     
              public static void main(String[] args) {
                     
          		//1. 创建连接
                  Connection conn = null;
                  Statement statement = null;
                  try {
                     
                      conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值