(7)JavaSE:JDBC连接Mysql

一、JDBC实战技术

1.1JDBC概念

JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。JDBC的作用:可以通过java代码操作数据库。

在这里插入图片描述

1.2创建连接:步骤

在这里插入图片描述

1.2.1Mysql对应Jar包下载

下载官网
在这里插入图片描述在这里插入图片描述在这里插入图片描述
下载ZIp
在这里插入图片描述

1.2.2Idea中导入Jar包

在这里插入图片描述
在Maven工程中直接配置依赖信息即可
在这里插入图片描述
让项目识别Jar包
在这里插入图片描述
在这里插入图片描述

1.2.3Java代码实现连接

package JavaSE_JDBC;

import java.sql.*;

/**
 * @author Pengwei Qu
 * @Date 2024/8/17 22:05
 */
public class Jdbc_mysql01 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //01、注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //02、获取连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_student", "root", "123456");
        //03、定义Sql
        String sql = "SELECT * FROM studinf";
        //04、获取执行者对象
        Statement stat = conn.createStatement();
        //05、执行Sql并获取结果
        ResultSet rs = stat.executeQuery(sql);
        //06、处理返回结果
        while(rs.next()) {
            System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));
        }
        //07、关闭资源
        rs.close();
        stat.close();
        conn.close();
    }
}

在这里插入图片描述

在这里插入图片描述

1.3JDBC中的功能类API

1.3.1DriverManager

(1)作用:

1.加载注册驱动
2.获取连接对象
在这里插入图片描述

(2)注册驱动

下面代码中注册驱动用的是:Class.forName("com.mysql.jdbc.Driver");并不是DriverManager
点开Driver的源码:
在这里插入图片描述

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //01、注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //02、获取连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_student", "root", "123456");
        //03、定义Sql
        String sql = "SELECT * FROM studinf";
        //04、获取执行者对象
        Statement stat = conn.createStatement();
        //05、执行Sql并获取结果
        ResultSet rs = stat.executeQuery(sql);
        //06、处理返回结果
        while(rs.next()) {
            System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));
        }
        //07、关闭资源
        rs.close();
        stat.close();
        conn.close();
    }

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(3)获取连接对象

在这里插入图片描述在这里插入图片描述

(4)警告解决

当使用高版本的Mysql的时候会提示使用SSL的安全连接,配置好SSL安全连接,就不会出现此警告,但是配置SSL安全连接比较繁琐,而且性能会下降,所以一般不去配置,直接设置不用SSL即可
在这里插入图片描述
在这里插入图片描述

1.3.2Connection 数据库连接对象

(1)作用

在这里插入图片描述

在这里插入图片描述

(2)事务管理

事务回滚:当两条执行命令有任何一条出现问题都会执行事务回滚,将数据库的状态恢复到事务开始前的状态。
在这里插入图片描述

package JavaSE_JDBC;

import java.sql.*;

/**
 * @author Pengwei Qu
 * @Date 2024/8/17 22:05
 */
/*Connection作用:获取连接对象/事务管理*/
public class JdbcAPI_Connection {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
         /*如果连接的是本机可简写省略:localhost:3306*/
        Connection conn = DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false", "root", "123456");
        //03、定义Sql
        String sql = "SELECT * FROM studinf";
        String sql2 = "update studinf set Age = 31 Where ID=202403";

        //04、获取执行者对象
        Statement stat = conn.createStatement();
        ResultSet rs = null;


        try {
            //(1)开启事务
            conn.setAutoCommit(false);
            //05、执行Sql并获取结果
            //事务1:
            rs = stat.executeQuery(sql);
            while(rs.next()) {
                System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));
            }
            //事务2
            int count = stat.executeUpdate(sql2);受影响的行数
            System.out.println(count);
            //(2)提交事务
            conn.commit();
        } catch (Exception e) {
            //(3)事务回滚
            conn.rollback();
            e.printStackTrace();
        }
        //07、关闭资源
        rs.close();
        stat.close();
        conn.close();
    }
}

1.3.3Statement

作用就是执行SQL语句。
在这里插入图片描述在这里插入图片描述

1.3.4ResultSet

(1)作用

对于查询的结果如图中右边表格形式存在,列的初始值是1,可以传入getXX(1)参数来获取第一列,或者传入列名效果一样
在这里插入图片描述

boolean next() throws SQLException;
 
String getString(int columnIndex) throws SQLException;
boolean getBoolean(int columnIndex) throws SQLException;
byte getByte(int columnIndex) throws SQLException;
int getInt(int columnIndex) throws SQLException;
double getDouble(int columnIndex) throws SQLException;
......
String getString(String columnLabel) throws SQLException;
......

(2)用法

在这里插入图片描述

//处理执行结果
 while(rs.next()) {
   System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));
   }
   

(3)案例

在这里插入图片描述
实体类

package JavaSE_JDBC.model;

/**
 * @author Pengwei Qu
 * @Date 2024/8/18 11:12
 */
//实体类
public class jdbc_student {
    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getGender() {
        return Gender;
    }

    public void setGender(String gender) {
        Gender = gender;
    }

    public int getAge() {
        return Age;
    }

    public void setAge(int age) {
        Age = age;
    }

    //对应于数据库表对象一行数据
    private int ID;
    private String Name;
    private String Gender;
    private int Age;

    @Override
    public String toString() {
        return "jdbc_student{" +
                "ID=" + ID +
                ", Name='" + Name + '\'' +
                ", Gender='" + Gender + '\'' +
                ", Age=" + Age +
                '}';
    }
}

JDBC连接数据库

package JavaSE_JDBC;

import JavaSE_JDBC.model.jdbc_student;

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

/**
 * @author Pengwei Qu
 * @Date 2024/8/18 10:58
 */
//案例
public class jdbcAPI_ResultSet {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        /*DriverManager*/
        //01注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //02获取连接对象
        Connection conn= DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false", "root", "123456");

        /*Connection:1.获取执行SQL的对象2.事务管理*/
        //03获取执行对象
        Statement statement = conn.createStatement();
        String sql = "SELECT * FROM studinf";
        /*ResultSet*/
        //04执行Sql并获取结果
        ResultSet resultSet = statement.executeQuery(sql);
        //05返回结果处理
        ArrayList<jdbc_student> arrayList = new ArrayList<>();
        while (resultSet.next()){
            //创建实体类对象接收数据
            jdbc_student jdbcStudent = new jdbc_student();
            jdbcStudent.setID(resultSet.getInt("ID"));
            jdbcStudent.setName(resultSet.getString("Name"));
            jdbcStudent.setGender(resultSet.getString("Gender"));
            jdbcStudent.setAge(resultSet.getInt("Age"));
            //将对象存入集合
            arrayList.add(jdbcStudent);

        }
        //打印集合
        System.out.println(arrayList);
        //06释放资源
        conn.close();
        statement.close();
        resultSet.close();


    }
}

在这里插入图片描述

1.3.5PrepareStatement

(1)SQL注入

在这里插入图片描述
正常代码:输入的账号密码正确登陆成功

 /*演示SQL注入问题*/
    @Test
    public  void Test() throws SQLException {
        Scanner scanner = new Scanner(System.in);
/*        System.out.println("输入账号");
        String user = scanner.nextLine();
        System.out.println("输入密码");
        String pwd = scanner.nextLine();*/
        String user="Jack";
        String pwd="123456";

        //01获取连接对象
        Connection conn= DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false","root","123456");
        //02获取执行sql对象,执行Sql
        String Sql="Select * FROM login where User='"+user+"' and Pwd='"+pwd+"'";
        System.out.println("查看当前拼接好输入的账号信息的Sql语句"+Sql);

        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(Sql);
        if (resultSet.next()){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

    }

在这里插入图片描述

SQL注入问题:由于原来的Sql语句中存在字符串的现象,很容易被修改原来的语义
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

    @Test
    public  void Test2() throws SQLException {
        Scanner scanner = new Scanner(System.in);
/*        System.out.println("输入账号");
        String user = scanner.nextLine();
        System.out.println("输入密码");
        String pwd = scanner.nextLine();*/
        String user="Jack";
        String pwd="'or'1'='1";

        //01获取连接对象
        Connection conn= DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false","root","123456");
        //02获取执行sql对象,执行Sql
        String Sql="Select * FROM login where User='"+user+"' and Pwd='"+pwd+"'";
        System.out.println("查看当前拼接好输入的账号信息的Sql语句"+Sql);

        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(Sql);
        if (resultSet.next()){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

    }

(2)解决SQL注入

在这里插入图片描述

/*03解决Sql注入*/
    @Test
    public  void Test3() throws SQLException {
        Scanner scanner = new Scanner(System.in);
/*        System.out.println("输入账号");
        String user = scanner.nextLine();
        System.out.println("输入密码");
        String pwd = scanner.nextLine();*/
        String user="Jack";
        String pwd="'or'1'='1";

        //01获取连接对象
        Connection conn= DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false","root","123456");
        //02获取执行sql对象,执行Sql
        String Sql="Select * FROM login where User=? and Pwd=?";
        //System.out.println("查看当前拼接好输入的账号信息的Sql语句"+Sql);
        PreparedStatement prSt = conn.prepareStatement(Sql);
        //设置?对应的值
        prSt.setString(1,user);
        prSt.setString(2,pwd);
        //03执行Sql

        ResultSet resultSet = prSt.executeQuery();


        if (resultSet.next()){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

    }

在这里插入图片描述
原理:

//设置?对应的值
        prSt.setString(1,user);
        prSt.setString(2,pwd);

在这里插入图片描述

(3)原理

  1. 可以预编译Sql提高性能,但是默认预编译功能是关闭的,需要再url中手动打开

在这里插入图片描述
在这里插入图片描述

1.4数据库连接池

1.4.1简介

在这里插入图片描述
在这里插入图片描述

1.4.2Druid连接池

在这里插入图片描述
1.导入jar包 druid-1.1.12.jar
2.定义配置文件
在这里插入图片描述
3.加载配置文件
在这里插入图片描述

4.获取数据库连接池对象
在这里插入图片描述

5.获取连接

package JavaSE_JDBC;

import com.alibaba.druid.pool.DruidAbstractDataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author Pengwei Qu
 * @Date 2024/8/18 17:12
 */
public class jdbc_l连接池 {
    public static void main(String[] args) throws Exception {

//         1.导入jar包 druid-1.1.12.jar
//            2.定义配置文件
//            3.加载配置文件
        Properties properties = new Properties();

        properties.load(new FileInputStream("D:\\Java\\Java_Project\\JavaProject3_7_12\\src/druid.properties"));
//            4.获取数据库连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//            5.获取连接对象
        Connection conn = dataSource.getConnection();
        System.out.println(conn);
       // System.out.println(System.getProperty("user.dir"));
        //6.连接
        String sql = "SELECT * FROM studinf";
        //获取执行者对象
        Statement stat = conn.createStatement();
        //执行Sql并获取结果
        ResultSet rs = stat.executeQuery(sql);
        //处理返回结果
        while(rs.next()) {
            System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));
        }
        //关闭资源
        rs.close();
        stat.close();
        conn.close();



    }
}

在这里插入图片描述

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

泰勒今天想展开

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

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

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

打赏作者

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

抵扣说明:

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

余额充值