【MySQL】Java的数据库编程:JDBC编程

目录

🌾Java的数据库编程:JDB

        🌈1. JDBC是什么?

        🌈2.JDBC常用接口和类

        🌈3. JDBC使用步骤总结


🌾Java的数据库编程:JDBC

        🌈1. JDBC是什么?

        JDBC,就是Java Database connectivity,java 的数据库连接。是一种用于执行SQL语句的Java API,它是java中的数据库连接规范。它为java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。    

        🌈2.JDBC常用接口和类

  1、数据库连接的获取方式(2种)

(1)通过DriverManager(驱动管理类)的静态方法获取;其中,DriverManager类获取的Connection连接,是无法重复利用的,每次利用完以后释放资源时,通过connection.close()关闭物理连接。

//加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
Connection connection = DriverManager.getConnection(URL);

(2)  通过DataSource(数据源)对象获取。实际应用中使用。其中DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些数量是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收。

        private static DataSource dataSource = null;

        //1、初始化数据源
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        //2、设置连接的参数
        mysqlDataSource.setURL(URL);
        mysqlDataSource.setUser(USER);
        mysqlDataSource.setPassword(PASSWORD);
        //3、将构建好的MySQL数据源赋值给JDBC中的datasource
        dataSource = mysqlDataSource;

2、Statement对象

        Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。但是最常用的是PreparedStatement用于执行带或者不带参数的SQL语句,SQL语句会预编译在数据库系统,执行速度快于Statement对象。 

其余两种:Statement:用于执行不带参数的简单SQL语句;CallableStatement用于执行数据库村塾过程中的调用。

两种执行SQL的方法:

(1)executeQuery()方法执行后返回单个结果集。通常用于select语句;

(2)executeUpdate()方法返回的是一个整数,指示受影响的行数。通常用于update,insert,delete语句。

关键:

一个PreparedStatement是从java.sql.connection对象和所提供的sql字符串得到的,sql字符串中包含问号(?),调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值。注意用setXXX方式设置时,需要与数据库中的字段类型对应,例如mysql中字段为varchar,就需要使用setString方法,如果为Date类型,就需要使用setDate方法来设置具体sql的参数.
例如:

String sql = "select id,name from student where id=? andname=?";
PreparedStatement ps =conn.prepareStatement(sql);
ps.setint(1,id);
ps.setstring(2,name);
ResultSet rs = ps.executeQuery();

3、ResultSet对象

        ResultSet对象被称为结果集,它代表符合SQL语句的所有行,并且通过一套getXXX方法提供了对这些行中数据的访问。ResultSet里的数据一行一行排列,每一行又有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。如果我们想要获取某一条记录,就要使用ResultSet的next()方法;如果我们想要得到ResultSet里的所有记录,就要使用while循环。

🌈3. JDBC使用步骤总结

五部曲:创建数据库连接Connection -> 创建操作命令Statement ->  使用操作命令来执行SQL ->

处理结果集ResultSet - > 释放资源。

🌰栗子:查询studnet表中的学号为X的学生信息:

 实现过程:

(1)文件1:a01_Connection.java文件(其中,关闭资源的时候要按照从后往前的顺序)


import com.mysql.cj.jdbc.MysqlDataSource;
import com.sun.deploy.util.SyncAccess;

import javax.rmi.CORBA.StubDelegate;
import javax.sql.ConnectionEvent;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Scanner;

public class a01_Connection {
    /*
     * 构建数据源——>获取连接——>写sql语句——>执行sql语句并获取结果——>释放数据源
     */
    //定义一个数据源对象
    private static DataSource dataSource = null;
    //数据库的用户名
    private static final String USER = "root";
    //数据库的密码
    private static final String PASSWORD = "123456";
    //数据库连接的字符串
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/java78?" +
            "characterEncoding=utf8&useSSL= true&serverTimezone=Asia/Shanghai";
    public static void main(String[] args) {
        //1、初始化数据源
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        //2、设置连接的参数
        mysqlDataSource.setURL(URL);
        mysqlDataSource.setUser(USER);
        mysqlDataSource.setPassword(PASSWORD);
        //3、将构建好的MySQL数据源赋值给JDBC中的datasource
        dataSource = mysqlDataSource;

        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            //1、通过数据源获取一个数据库连接
            connection = dataSource.getConnection();
            //接收用户输入的值
            System.out.println("请输入学号 ->");
            Scanner sc = new Scanner(System.in);
            String sn  = sc.next();
            //2、定义SQL语句
            String sql = "select * from student where sn = ?";
            System.out.println("sql-->" + sql);
            //3、获取statement对象
            //获取一个预处理对象
            statement = connection.prepareStatement(sql);
            //处理占位符的值
            statement.setString(1,sn);
            //4、执行sql语句
            resultSet = statement.executeQuery();
            //5、解析结果集,resultSet.next()表示结果集中是否有记录
            if(resultSet.next()){
                //创建表示结果的java对象
                Student student = new Student();
                //依次获取结果集中的数据并赋值给java对象
                student.setId(resultSet.getInt(1));
                student.setSn(resultSet.getString(2));
                student.setName(resultSet.getString(3));
                student.setMail(resultSet.getString(4));
                student.setClassesId(resultSet.getInt(5));
                //打印结果
                System.out.println(student);
            }
        } 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();
                }
            }
        }
    }
}

(2)文件2:Studnet.java(里面创建的所有的变量id,sn,name mail,classesId都一一对应数据库中student表中的字段名)

public class Student {
    private int id;
    private String sn;
    private String name;
    private String mail;
    private int classesId;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getSn() {
        return sn;
    }

    public void setSn(String sn) {
        this.sn = sn;
    }

    public String getName() {
        return name;
    }

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

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public int getClassesId() {
        return classesId;
    }

    public void setClassesId(int classesId) {
        this.classesId = classesId;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", sn='" + sn + '\'' +
                ", name='" + name + '\'' +
                ", mail='" + mail + '\'' +
                ", classesId=" + classesId +
                '}';
    }
}

(3)工具类

package sqlConnection.utils;

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;


public class DBUtils {
    //定义一个数据源对象
    private static DataSource dataSource = null;
    //数据库的用户名
    private static String USER = "root";
    //数据库的密码
    private static String PASSWORD = "123456";
    //数据库的连接字符串
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/java78?" +
            "characterEncoding=utf8&useSSL= true&serverTimezone=Asia/Shanghai";
    static {
        //获取一个数据源对象
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        //初始化数据源
        mysqlDataSource.setURL(URL);
        mysqlDataSource.setUser(USER);
        mysqlDataSource.setPassword(PASSWORD);
        //将获取到的数据源对象赋值给JDBC中的datasource
        dataSource = mysqlDataSource;
    }
    //使用private修饰构造方法,使外部不能new这个类的对象
    private DBUtils(){};

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

    /**
     * 函数作用:关闭对象并释放资源
     * @param resultSet
     * @param statement
     * @param connection
     */
    public static void close(ResultSet resultSet, PreparedStatement statement, Connection connection){
        //依次关闭对象,释放资源
        if(resultSet != null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(statement != null){
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

查询结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值