MySQL -----> JDBC编程

Posted ohana!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL -----> JDBC编程相关的知识,希望对你有一定的参考价值。

目录

一,什么是JDBC

二,JDBC工作原理及优势

三,JDBC使用总结

1. 创建数据库连接Connection

2. 创建操作命令Statement

3. 使用操作命令来执行SQL

4. 处理结果集ResultSet

5. 释放资源

具体实现代码:

四,JDBC常用接口和类

1.JDBC API

2.数据库连接(Connection) 

3.Statement对象

4.ResultSet对象

5.代码示例


一,什么是JDBC

  • JDBC,即Java Database Connectivity,java数据库连接
  • 是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范
  • 这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成
  • API为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问

二,JDBC工作原理及优势

JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类

JDBC优势:

  • Java语言访问数据库操作完全面向抽象接口编程
  • 开发数据库应用不用限定在特定数据库厂商的API
  • 程序的可移植性大大增强

三,JDBC使用总结

1. 创建数据库连接Connection

Connection connection = DriverManager.getConnection("URL");
mysql数据连接的URL参数格式如下:
jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值

2. 创建操作命令Statement

Statement statement = connection.createStatement();

3. 使用操作命令来执行SQL

ResultSet resultSet= statement.executeQuery
("select id, sn, name, qq_mail, classes_id from student");

4. 处理结果集ResultSet

while (r.next()) 
      int id = r.getInt("id");
      int sn = r.getInt("sn");
      String name = r.getString("name");
      String qqMail = r.getString("qq_mail");
      int classesId = r.getInt("classes_id");
      System.out.printf("id=%s,sn=%s,name=%s,qqMail=%s,classesId=%s\\n",
                        id, sn, name, qqMail, classesId);

5. 释放资源

if(r != null)
   r.close();

if(s != null)
   s.close();

if(conn != null)
   conn.close();

具体实现代码:

package com.bit.jdbc;

import java.sql.*;

public class QueryTest 

    public static void main(String[] args) throws ClassNotFoundException, SQLException 
        Connection conn = null;
        Statement s = null;
        ResultSet r = null;
        try 
            //反射的方式,加载一个类(类加载:执行静态变量,静态代码块)
            //数据库驱动包就可以在这种操作下,执行对应的初始化工作(驱动)
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库连接:Connection接口,需要使用jdbc中的,不要使用mysql中的
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java43?user=root&password=123456&useUnicode=true&characterEncoding=UTF-8&useSSL=false");
            System.out.println(conn);
            //通过连接对象创建操作命令对象Statement(使用jdbc中的),该对象是用于操作sql的一个抽象的对象
            s = conn.createStatement();
            //查询:
            // (1)调用Statement操作命令对象的executeQuery(sql)
            // (2)返回一个ResultSet结果集对象(查询sql执行的结果集)
            r = s.executeQuery("select id,sn,name,qq_mail,classes_id from student where id>3");
            //处理结果集:结果集可能是多行数据,需要遍历来获取
            // 调用next就移动到下一行,返回true代表该行有数据,返回false代表该行没有数据
            while (r.next()) //一直遍历到最后
                //进入循环,代表操作遍历的一行数据
                int id = r.getInt("id");
                String sn = r.getString("sn");
                String name = r.getString("name");
                String qqMail = r.getString("qq_mail");
                int classesId = r.getInt("classes_id");
                System.out.printf("id=%s, sn=%s, name=%s, qqMail=%s, classesId=%s\\n",
                        id, sn, name, qqMail, classesId);
            
        finally //无论如何,都要释放资源
            //释放资源:
            //(1)无论什么情况(异常)
            //(2)释放的顺序,和创建的顺序要相反(结果集对象,操作命令对象,数据库连接对象)
            if(r != null)//出现异常的时候,对象可能还没有赋值(初始化),调用close就会出现空指针异常
                r.close();
            if(s != null)
                s.close();
            if(conn != null)
                conn.close();
        

    

四,JDBC常用接口和类

1.JDBC API

在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程

2.数据库连接(Connection) 

Connection接口实现类由数据库提供,获取Connection通常有两种方式

  • 一种是通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
  • 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setURL("jdbc:mysql://localhost:3306/ttl");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("111111");
((MysqlDataSource) ds).setUseUnicode(true);
((MysqlDataSource) ds).setCharacterEncoding("UTF-8");
((MysqlDataSource) ds).setUseSSL(false);

以上两种方式的区别:

  • DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
  • DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收

3.Statement对象

三种类型:

  1. Statement简单的操作命令对象
  2. PrepareStatement预编译操作的命令对象
  3. CallableStatement存储过程的操作命令(就是写一段代码,里面有变量,判断,循环)

预编译命令相对于原来简单操作命令的好处(优势):

  1. 防止SQL注入,就是字符串去替换占位符的时候,会把单引号转义(替换的字符串里面的单引号会被当做字符串的一部分)
  2. 预编译,效率高(除了占位符的地方,其余的地方都一样,提前编译后可以提高效率)

4.ResultSet对象

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

5.代码示例

package com.bit.jdbc;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.*;

public class AdvanceQueryTest 

    public static void main(String[] args) throws ClassNotFoundException, SQLException 
        Connection conn = null;
        Statement s = null;
        ResultSet r = null;
        try 
            //先创建数据库连接池,再通过连接池获取数据库连接对象
            DataSource ds = new MysqlDataSource();
            //创建数据库连接池:初始化时,就会创建一定数量的数据库连接,这些连接对象是可以重复使用,效率更高
            //整个url带参数可以只使用setURL方法,也可以将参数调用方法的方式来设置
            ((MysqlDataSource) ds).setURL("jdbc:mysql://localhost:3306/java43");
            ((MysqlDataSource) ds).setUser("root");
            ((MysqlDataSource) ds).setPassword("123456");
            ((MysqlDataSource) ds).setUseUnicode(true);
            ((MysqlDataSource) ds).setCharacterEncoding("UTF-8");
            ((MysqlDataSource) ds).setUseSSL(false);
            conn = ds.getConnection();

            //要解决以上安全问题,需要调整以上操作命令对象为PreparedStatement
            String queryName = "skdjsj' or '1'='1";
            int queryId = 6;
            //准备一个带?占位符的sql
            String sql = "select id,sn,name,qq_mail,classes_id from student where name=? or id=?";
            PreparedStatement ps = conn.prepareStatement(sql);//创建预编译的操作命令对象
            //替换占位符:调用setXXX方法,第一个参数,表示第几个占位符(从1开始),第二个参数,表示要替换的值
            ps.setString(1, queryName);//替换的值是什么类型,就调用setXXX方法
            ps.setInt(2, queryId);

            //执行sql,需要使用无参的方法
            r = ps.executeQuery();

            //处理结果集:结果集可能是多行数据,需要遍历来获取
            // 调用next就移动到下一行,返回true代表该行有数据,返回false代表该行没有数据
            while (r.next()) //一直遍历到最后
                //进入循环,代表操作遍历的一行数据
                int id = r.getInt("id");
                String sn = r.getString("sn");
                String name = r.getString("name");
                String qqMail = r.getString("qq_mail");
                int classesId = r.getInt("classes_id");
                System.out.printf("id=%s, sn=%s, name=%s, qqMail=%s, classesId=%s\\n",
                        id, sn, name, qqMail, classesId);
            
        finally //无论如何,都要释放资源
            //释放资源:
            //(1)无论什么情况(异常)
            //(2)释放的顺序,和创建的顺序要相反(结果集对象,操作命令对象,数据库连接对象)
            if(r != null)//出现异常的时候,对象可能还没有赋值(初始化),调用close就会出现空指针异常
                r.close();
            if(s != null)
                s.close();
            if(conn != null)
                conn.close();
        

    

以上是关于MySQL -----> JDBC编程的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 数据库JDBC 编程之 Java 连接 MySQL

MySQL 数据库JDBC 编程之 Java 连接 MySQL

[MySQL]如何使用JDBC编程?

MySQL -----> JDBC编程

MySQL 数据库与JDBC编程

基于JDBC的MySQL数据库编程