MySQL:JDBC编程

什么是JDBC

JDBC(Java Data Base Connectivity, Java数据库连接)是Java程序和数据库之间的桥梁,包含
了⼀套Java定义的⽤于执⾏SQL语句的接⼝,使开发者能够编写数据库的程序。JDBC 的主要作⽤是:与数据库建⽴连接、发送SQL语句和处理数据库执⾏结果

访问数据库的步骤

  1. 确定数据库服务器的地址,端口号
  2. 建立连接,用户名,密码(不同的数据库以哪种协议连接)
  3. 发送执行的SQL语句
  4. 接受返回结果
  5. 关闭连接

JDBC是由Java平台提供的接口,具体的实现是由数据库的厂商实现完成的 

修改idea中的内置的MAVEN

修改其配置 

 

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    -->
    <!-- 加入如下mirror节点 使用国内阿里云仓库镜像  开始 -->
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    <mirror>
        <id>central</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun central</name>
        <url>https://maven.aliyun.com/repository/central</url>
    </mirror>
    <mirror>
        <id>spring</id>
        <mirrorOf>*</mirrorOf>
        <name>aliyun spring</name>
        <url>https://maven.aliyun.com/repository/spring</url>
    </mirror>
    <!-- 加入如下mirror节点 使用国内阿里云仓库镜像  结束-->
</mirrors>

创建一个MAVEN工程

创建项目的方式

创建完成后,对其项目的配置文件pom写一个jdbc的依赖 

首先建一个管理依赖的节点

然后通过https://mvnrepository.com/

先搜索mysql

点击第二个

点8.0.33

复制,并将其粘贴到管理依赖节点处

 <dependencies>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

</dependencies>

点击进行下载 

 

JDBC的使用

1.加载数据库厂商的驱动包(通过其驱动包拉操作数据库)

2.建立数据库的连接

JDBC   URL

3.创建Statement

4.定义SQL

5.执行SQL,获得查询结果

6.遍历结果

7.进行关闭,释放资源

 

进行测试

import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;

public class Demon_01DriverManager {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //1.加载数据库厂商提供的驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得数据库的连接
            connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/u?characterEncoding=utf8" +
                    "&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");
            //3.创建Statement对象
            statement = connection.createStatement();
            //4.定义一个SQL语句并执行
            System.out.println("请输入学生的姓名");
            Scanner scanner =new Scanner(System.in);
            //接受用户的输入
            String name =scanner.next();
            String sql = "select student_id, sn, name, mail, class_id from student where name = '" + name + "'";
            //5.执行SQL,获取查询的结果
            resultSet = statement.executeQuery(sql);
            //6结果集进行遍历
            //如果下一条有记录则返回true,否则返回false
            while (resultSet.next()){
                long stu_id = resultSet.getLong(1);
                String stu_sn = resultSet.getString(2);
            String stu_name = resultSet.getString(3);
                String stu_mail = resultSet.getString(4);
                long class_id = resultSet.getLong(5);
                System.out.println(MessageFormat.format("学生编号={0},学号={1},学生姓名={2},学生邮件={3},学生班级={4}",
                        stu_id, stu_sn, stu_name, stu_mail, class_id));
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //释放资源,进行关闭
            if (resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

注:

1.如果在其输入   'or/**/1=1;#   会出所有的结果集,非常不安全

2.我们通过DriverManager每次调⽤getConnection⽅法都会初始化⼀个新的连接,使⽤完成后会关闭真实 连接,导致资源浪费。

DataSource使⽤了连接池的技术,会在初始化时创建⼀定数量的数据库连接,这些连接可以重复使⽤,关闭时并不是真正关闭连接,⽽是将连接归还给连接池,以供后续使⽤,有效地提⾼资源利⽤率和和性能

我们通过数据源DataSource来获取对象

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;


public class Demon_02DataSource {
    public static void main(String[] args) {
        // 定义MySQL数据源对象
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        // 设置数据库连接串
        mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/u?characterEncoding=utf8&allowPublicKeyRetrieval" +
                "=true&useSSL=false");
        // 用户名
        mysqlDataSource.setUser("root");
        // 密码
        mysqlDataSource.setPassword("123456");

        // 定义JDBC的数据源对象
        DataSource dataSource = mysqlDataSource;

        // 定义连接对象
        Connection connection = null;
        // 定义预处理SQL执行对象
        PreparedStatement statement = null;
        // 定义结果集对象
        ResultSet resultSet = null;


        try {
            // 1. 通过数据源获取数据库连接
            connection = dataSource.getConnection();
            // 2. 获取预处理SQL执行对象
            // 定义要执行的SQL
            String sql = "select student_id, sn, name, mail, class_id from student where name = ?";
            statement = connection.prepareStatement(sql);
            // 接收用户的输入
            System.out.println("请输入学生姓名:");
            Scanner scanner = new Scanner(System.in);
            String name = scanner.next();
            // 3. 用真实值替换占位符
            statement.setString(1, name);
            // 4. 执行SQL,获取结果集
            resultSet = statement.executeQuery();
            // 5. 遍历结果集
            while (resultSet.next()) {
                // 获取学生Id
                long stuId = resultSet.getLong("student_id");
                String stuSn = resultSet.getString(2);
                String stuName = resultSet.getString(3);
                String stuMail = resultSet.getString(4);
                long classId = resultSet.getLong(5);
                System.out.println(MessageFormat.format("学生编号={0}, 学号={1}, 学生姓名={2}, 邮箱={3}, 班级编号={4}", stuId, stuSn,
                        stuName, stuMail, classId));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 依次释放资源,关闭连接
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

当我们运行  'or/**/1=1;#时   不会出现所有的结果集

封装使用 

当我们写一个项目时,总是会有一些重复的操作,在这个项目中也是一样,比如说获得数据库的连接,关闭连接,释放资源等,我们可以将它们进行封装

package utils;

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class DBUtil {
    // 数据源
    private static DataSource dataSource = null;
    // 数据库连接串
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/u?characterEncoding=utf8" +
            "&allowPublicKeyRetrieval=true&useSSL=false";
    // 用户名
    private static final String USER = "root";
    // 密码
    private static final String PASSWORD = "123456";

    // 当类加载到JVM的时候,执行数据源的初始化
    static {
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setURL(URL);
        mysqlDataSource.setUser(USER);
        mysqlDataSource.setPassword(PASSWORD);
        dataSource = mysqlDataSource;
    }

    /**
     * 构造方法私有化,防止new这个对象
     */
    private DBUtil() {}

    /**
     * 获取数据库连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection () throws SQLException {
        return dataSource.getConnection();
    }

    /**
     * 释放资源,关闭连接
     * @param resultSet
     * @param statement
     * @param connection
     */
    public static void close(ResultSet resultSet, Statement statement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

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

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



}

通过分装进行一个插入的使用


import utils.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;


public class Demon_03Insert {
    public static void main(String[] args) {

        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 1. 获取数据库连接
            connection = DBUtil.getConnection();
            // 2. 定义SQL
            String sql = "insert into student (sn, name, mail, class_id) values (?,?,?,?)";
            // 3. 定义SQL预处理对象
            statement = connection.prepareStatement(sql);
            // 4. 接收用户参数
            System.out.println("请输入学号:");
            Scanner scanner = new Scanner(System.in);
            String sn = scanner.next();

            System.out.println("请输入姓名:");
            String name = scanner.next();

            System.out.println("请输入邮箱:");
            String mail = scanner.next();

            System.out.println("请输入班级编号:");
            Long classId = Long.valueOf(scanner.next());

            // 5. 用真实数据填充占位符
            statement.setString(1, sn);
            statement.setString(2, name);
            statement.setString(3, mail);
            statement.setLong(4, classId);
            // 6. 执行SQL获取结果
            int row = statement.executeUpdate();
            // 7. 判断结果
            if (row == 1) {
                System.out.println("插入成功");
            } else {
                System.out.println("插入失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 释放资源,关闭连接
            DBUtil.close(null, statement, connection);
        }
    }
}

运行

 

 

希望能对大家有所帮助!!!! 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值