当前位置:   article > 正文

JDBC连接MySQL

jdbc连接mysql

第一章:JDBC技术概述

1.1 JDBC技术概述

Java Database Connectivity 简称JDBC,是Java数据库连接的技术。是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

JDBC是Java访问数据库的标准规则,可以为不同的关系型数据库(MySQL,Oracle,DB2)提供统一访问,它由一组用Java语言编写的接口和类组成。

JDBC技术开发数据库,无论使用哪种数据库,程序保持一致。

1.2 数据库驱动程序

数据库就是存储数据的,原理都是不同的,我们开发人员面向哪种数据库开发?

Sun公司提供了一套操作数据的标准API。我们开发人员不需要面对数据库。只需要面对Sun公司标准API即可开发。Sun公司提供的是数据库开发的接口,数据库厂商提供的是这些接口的实现类。就是数据库的驱动程序。

开发人员面向Sun公司的接口,多态的形式调用实现类的方法重写即可。

即使更换数据库,只需要改变驱动程序即可,开发人员的代码无需改变。

数据库厂商提供的驱动,都是以jar包的形式提供

1.3 JDBC中的核心API

  • java.sql.DriverManager类:数据库驱动的管理类,管理数据库的驱动程序。

  • java.sql.Connection接口:表示数据库的连接对象,负责和数据库取得连接。

  • java.sql.Statment接口:执行SQL语句的对象,将Java中的SQL语句传递给数据库,让数据库执行SQL语句。

  • java.sql.ResultSet接口:表示数据表的查询结构集对象,执行的SQL语句是select,ResultSet就是我们查询的结果

强调问题:以上接口的实现类,都是由数据库驱动实现。接口调用这些实现类的方法重写!

1.4 Object Relational Mapping 映射思想

ORM:数据库开发的指导思想,Java中的对象和数据表的对应关系

  • Java中的类:对应数据表

  • 类中的字段:对应数据表的列

  • Java中的对象,对应数据表的行数据

第二章:JDBC实现数据库的增删改查

2,JDBC快速入门

先来看看通过Java操作数据库的流程

 

第一步:编写Java代码

第二步:Java代码将SQL发送到MySQL服务端

第三步:MySQL服务端接收到SQL语句并执行该SQL语句

第四步:将SQL语句执行的结果返回给Java代码

2.1 编写代码步骤

  • 创建工程,导入驱动jar包

     

  • 注册驱动

    Class.forName("com.mysql.cj.jdbc.Driver");
  • 获取连接

    Connection conn = DriverManager.getConnection(url, username, password);

    Java代码需要发送SQL给MySQL服务端,就需要先建立连接

  • 定义SQL语句

    String sql =  “update…” ;
  • 获取执行SQL对象

    执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象

    Statement stmt = conn.createStatement();
  • 执行SQL

    stmt.executeUpdate(sql);  
  • 处理返回结果

  • 释放资源

3,JDBC API详解

3.1 DriverManager

DriverManager(驱动管理类)作用:

  • 注册驱动

static void   registerDriver(Driver driver)      使用 DriverManager注册给定的驱动程序。 

registerDriver方法是用于注册驱动的,但是我们之前做的入门案例并不是这样写的。而是如下实现

Class.forName("com.mysql.jdbc.Driver");

在该类中的静态代码块中已经执行了 DriverManager 对象的 registerDriver() 方法进行驱动的注册了,那么我们只需要加载 Driver 类,该静态代码块就会执行。而 Class.forName("com.mysql.cj.jdbc.Driver"); 就可以加载 Driver 类。

==提示:==

  • MySQL 8之前的驱动包,加载Driverlei的包名路径是Class.forName("com.mysql.jdbc.Driver")

  • 获取数据库连接

 static  Connection      getConnection(String url,String user,String password)   尝试建立与给定数据库url的连接

参数说明:

  • url : 连接路径

    语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…

    示例:jdbc:mysql://127.0.0.1:3306/db1

    ==细节:==

    • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对

    • 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示

  • user :用户名

  • poassword :密码

3.2 Connection

Connection(数据库连接对象)作用:

  • 获取执行 SQL 的对象

  • 管理事务

3.2.1 获取执行对象
  • 普通执行SQL对象

    Statement createStatement()

    入门案例中就是通过该方法获取的执行对象。

 

第四章:SQL注入攻击

4.1 用户登录时的注入问题

什么是注入攻击,利用数据库的SQL语句的漏洞进行攻击,会导致数据的泄露或者数据的丢失,SQL的注入攻击是安全问题,不能忽视。

模拟用户的登录功能,实现对数据库的注入攻击。

用户名和密码作为查询条件,能查询到用户数据,登录成功,否则失败

select * from userinfo where username='tom' and password='123';

登录查询的SQL语句问题,and两边为true or 运算符是一边为true,整个表达式为true。

select * from userinfo where username='tom' and password='123' or 1=1;

4.2 实现SQL语句的注入

  1. package com.fly.dao.impl;
  2. import com.fly.Utils.Utils;
  3. import com.fly.pojo.UserInfo;
  4. import java.sql.Connection;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.Scanner;
  11. public class sqlTest {
  12. //select * from userinfo where username='123'and password='1'or 1=1'
  13.    public static void main(String[] args) throws SQLException {
  14.        // 定义出数据库作用需要的对象
  15.        Connection connection= Utils.getConnection();
  16.        System.out.println("请输入用户名");
  17.        Scanner scanner=new Scanner(System.in);
  18.        String name=scanner.nextLine();
  19.        System.out.println("请输入密码");
  20.        String password=scanner.nextLine();
  21.        String sql="select * from userinfo where username='"+name+"'and password='"+password+"'";
  22.        System.out.println(sql);
  23.        Statement statement=connection.createStatement();
  24.        ResultSet resultSet = statement.executeQuery(sql);
  25.        List<UserInfo> list=new ArrayList<>();
  26.        while (resultSet.next()){
  27.            UserInfo userInfo=new UserInfo();
  28.            userInfo.setId(resultSet.getInt("id"));
  29.            list.add(userInfo);
  30.       }
  31.        if(list.size()>0){
  32.            System.out.println("恭喜您,登录成功");
  33.       }else{
  34.            System.out.println("登陆失败");
  35.       }
  36.        Utils.Close(resultSet,statement,connection);
  37.   }
  38. }

解决SQL的注入问题:数据库的厂家也很清楚,数据库厂家也提供解决SQL注入攻击的办法,保证了数据库的安全。Prepared Statement接口技术!

4.3 Prepared Statement接口介绍

java.sql.PreparedStatement接口:继承Statement接口,也是一个执行SQL语句的对象。

Prepared Statement接口特性:

  • 将SQL语句预编译并存储,可以反复的高效的执行。

    • 高效执行:必须是同一个查询语句才高效

  • 执行SQL语句,可以有效的防止SQL语句的注入

    PreparedStatement接口实现类的获取:数据库连接对象的方法:

 PreparedStatement preparedStatement = connection.prepareStatement(String sql); 返回接口实现类的对象

第五章,JDBC练习

5.1 需求

完成商品品牌数据的增删改查操作

  • 查询:查询所有数据

  • 添加:添加品牌

  • 修改:根据id修改

  • 删除:根据id删除

5.2 案例实现

5.2.1 环境准备
  • 数据库表 tb_brand

    -- 删除tb_brand表
    drop table if exists tb_brand;
    -- 创建tb_brand表
    create table tb_brand (
        -- id 主键
        id int primary key auto_increment,
        -- 品牌名称
        brand_name varchar(20),
        -- 企业名称
        company_name varchar(20),
        -- 排序字段
        ordered int,
        -- 描述信息
        description varchar(100),
        -- 状态:0:禁用  1:启用
        status int
    );
    -- 添加数据
    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
           ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
           ('小米', '小米科技有限公司', 50, 'are you ok', 1);
  • 在pojo包下实体类 Brand

    1. /**
    2. * 品牌
    3. * alt + 鼠标左键:整列编辑
    4. * 在实体类中,基本数据类型建议使用其对应的包装类型
    5. */
    6. public class Brand {
    7.    // id 主键
    8.    private Integer id;
    9.    // 品牌名称
    10.    private String brandName;
    11.    // 企业名称
    12.    private String companyName;
    13.    // 排序字段
    14.    private Integer ordered;
    15.    // 描述信息
    16.    private String description;
    17.    // 状态:0:禁用 1:启用
    18.    private Integer status;
    19.    public Integer getId() {
    20.        return id;
    21.   }
    22.    public void setId(Integer id) {
    23.        this.id = id;
    24.   }
    25.    public String getBrandName() {
    26.        return brandName;
    27.   }
    28.    public void setBrandName(String brandName) {
    29.        this.brandName = brandName;
    30.   }
    31.    public String getCompanyName() {
    32.        return companyName;
    33.   }
    34.    public void setCompanyName(String companyName) {
    35.        this.companyName = companyName;
    36.   }
    37.    public Integer getOrdered() {
    38.        return ordered;
    39.   }
    40.    public void setOrdered(Integer ordered) {
    41.        this.ordered = ordered;
    42.   }
    43.    public String getDescription() {
    44.        return description;
    45.   }
    46.    public void setDescription(String description) {
    47.        this.description = description;
    48.   }
    49.    public Integer getStatus() {
    50.        return status;
    51.   }
    52.    public void setStatus(Integer status) {
    53.        this.status = status;
    54.   }
    55.    @Override
    56.    public String toString() {
    57.        return "Brand{" +
    58.                "id=" + id +
    59.                ", brandName='" + brandName + '\'' +
    60.                ", companyName='" + companyName + '\'' +
    61.                ", ordered=" + ordered +
    62.                ", description='" + description + '\'' +
    63.                ", status=" + status +
    64.                '}';
    65.   }
    66. }
5.2.2 查询所有
  1. /**
  2.   * 查询所有
  3.   * 1. SQL:select * from tb_brand;
  4.   * 2. 参数:不需要
  5.   * 3. 结果:List<Brand>
  6.   */
  7. @Test
  8. public void testSelectAll() throws Exception {
  9.    //1. 获取Connection
  10.    //3. 加载配置文件
  11.    Properties prop = new Properties();
  12.    prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
  13.    //4. 获取连接池对象
  14.    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  15.    //5. 获取数据库连接 Connection
  16.    Connection conn = dataSource.getConnection();
  17.    //2. 定义SQL
  18.    String sql = "select * from tb_brand;";
  19.    //3. 获取pstmt对象
  20.    PreparedStatement pstmt = conn.prepareStatement(sql);
  21.    //4. 设置参数
  22.    //5. 执行SQL
  23.    ResultSet rs = pstmt.executeQuery();
  24.    //6. 处理结果 List<Brand> 封装Brand对象,装载List集合
  25.    Brand brand = null;
  26.    List<Brand> brands = new ArrayList<>();
  27.    while (rs.next()){
  28.        //获取数据
  29.        int id = rs.getInt("id");
  30.        String brandName = rs.getString("brand_name");
  31.        String companyName = rs.getString("company_name");
  32.        int ordered = rs.getInt("ordered");
  33.        String description = rs.getString("description");
  34.        int status = rs.getInt("status");
  35.        //封装Brand对象
  36.        brand = new Brand();
  37.        brand.setId(id);
  38.        brand.setBrandName(brandName);
  39.        brand.setCompanyName(companyName);
  40.        brand.setOrdered(ordered);
  41.        brand.setDescription(description);
  42.        brand.setStatus(status);
  43.        //装载集合
  44.        brands.add(brand);
  45.   }
  46.    System.out.println(brands);
  47.    //7. 释放资源
  48.    rs.close();
  49.    pstmt.close();
  50.    conn.close();
  51. }
5.2.3 添加数据
  1. /**
  2.  * 添加
  3.  * 1. SQL:insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);
  4.  * 2. 参数:需要,除了id之外的所有参数信息
  5.  * 3. 结果:boolean
  6.  */
  7. @Test
  8. public void testAdd() throws Exception {
  9.    // 接收页面提交的参数
  10.    String brandName = "香飘飘";
  11.    String companyName = "香飘飘";
  12.    int ordered = 1;
  13.    String description = "绕地球一圈";
  14.    int status = 1;
  15.    //1. 获取Connection
  16.    //3. 加载配置文件
  17.    Properties prop = new Properties();
  18.    prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
  19.    //4. 获取连接池对象
  20.    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  21.    //5. 获取数据库连接 Connection
  22.    Connection conn = dataSource.getConnection();
  23.    //2. 定义SQL
  24.    String sql = "insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);";
  25.    //3. 获取pstmt对象
  26.    PreparedStatement pstmt = conn.prepareStatement(sql);
  27.    //4. 设置参数
  28.    pstmt.setString(1,brandName);
  29.    pstmt.setString(2,companyName);
  30.    pstmt.setInt(3,ordered);
  31.    pstmt.setString(4,description);
  32.    pstmt.setInt(5,status);
  33.    //5. 执行SQL
  34.    int count = pstmt.executeUpdate(); // 影响的行数
  35.    //6. 处理结果
  36.    System.out.println(count > 0);
  37.    //7. 释放资源
  38.    pstmt.close();
  39.    conn.close();
  40. }
5.2.4 修改数据
  1. /**
  2.  * 修改
  3.  * 1. SQL:
  4.     update tb_brand
  5.         set brand_name = ?,
  6.         company_name= ?,
  7.         ordered     = ?,
  8.         description = ?,
  9.         status     = ?
  10.     where id = ?
  11.   * 2. 参数:需要,所有数据
  12.   * 3. 结果:boolean
  13.   */
  14. @Test
  15. public void testUpdate() throws Exception {
  16.    // 接收页面提交的参数
  17.    String brandName = "香飘飘";
  18.    String companyName = "香飘飘";
  19.    int ordered = 1000;
  20.    String description = "绕地球三圈";
  21.    int status = 1;
  22.    int id = 4;
  23.    //1. 获取Connection
  24.    //3. 加载配置文件
  25.    Properties prop = new Properties();
  26.    prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
  27.    //4. 获取连接池对象
  28.    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  29.    //5. 获取数据库连接 Connection
  30.    Connection conn = dataSource.getConnection();
  31.    //2. 定义SQL
  32.    String sql = " update tb_brand\n" +
  33.        "         set brand_name = ?,\n" +
  34.        "         company_name= ?,\n" +
  35.        "         ordered     = ?,\n" +
  36.        "         description = ?,\n" +
  37.        "         status     = ?\n" +
  38.        "     where id = ?";
  39.    //3. 获取pstmt对象
  40.    PreparedStatement pstmt = conn.prepareStatement(sql);
  41.    //4. 设置参数
  42.    pstmt.setString(1,brandName);
  43.    pstmt.setString(2,companyName);
  44.    pstmt.setInt(3,ordered);
  45.    pstmt.setString(4,description);
  46.    pstmt.setInt(5,status);
  47.    pstmt.setInt(6,id);
  48.    //5. 执行SQL
  49.    int count = pstmt.executeUpdate(); // 影响的行数
  50.    //6. 处理结果
  51.    System.out.println(count > 0);
  52.    //7. 释放资源
  53.    pstmt.close();
  54.    conn.close();
  55. }
5.2.5 删除数据
  1. /**
  2.  * 删除
  3.  * 1. SQL:
  4.            delete from tb_brand where id = ?
  5.  * 2. 参数:需要,id
  6.  * 3. 结果:boolean
  7.  */
  8. @Test
  9. public void testDeleteById() throws Exception {
  10.    // 接收页面提交的参数
  11.    int id = 4;
  12.    //1. 获取Connection
  13.    //3. 加载配置文件
  14.    Properties prop = new Properties();
  15.    prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
  16.    //4. 获取连接池对象
  17.    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  18.    //5. 获取数据库连接 Connection
  19.    Connection conn = dataSource.getConnection();
  20.    //2. 定义SQL
  21.    String sql = " delete from tb_brand where id = ?";
  22.    //3. 获取pstmt对象
  23.    PreparedStatement pstmt = conn.prepareStatement(sql);
  24.    //4. 设置参数
  25.    pstmt.setInt(1,id);
  26.    //5. 执行SQL
  27.    int count = pstmt.executeUpdate(); // 影响的行数
  28.    //6. 处理结果
  29.    System.out.println(count > 0);
  30.    //7. 释放资源
  31.    pstmt.close();
  32.    conn.close();
  33. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/512941
推荐阅读
相关标签
  

闽ICP备14008679号