Java的基本学习(八)——与数据库

前言:

大概一个半月前,我开启了Java的基本学习一系列文章,白驹过隙,已经来到了最后一部分——与数据库的交互

 

 

 

 

 

 


JDBC介绍

JDBC(Java Data Base Connectivity)是Java程序连接和存取数据库的应用程序接口(API)。此接口是Java核心API的一部分。JDBC由一群类和接口组成,它支持 ANSI SQL-92标准,因此,通过调用这些类和接口所提供的成员方法,我们可以方便地连接各种不同的数据库。

JDBC结构

用JDBC连接数据库实现了与平台无关的客户机/服务器的数据库应用。由于JDBC是针对“与平台无关”设计的,因此只要在Java数据库应用程序中指定使用某个数据库的JDBC驱动程序,就可以连接并存取指定的数据库了。而且,当要连接几个不同的数据库时,只需修改程序中的JDBC驱动程序,无需对其他的程序代码做任何改动。JDBC的基本结构有4个部分:

  1. Java应用程序
  2. JDBC管理器
  3. 驱动程序
  4. 数据库

四类JDBC驱动程序

  1. JDBC-ODBC Bridge
  2. JDBC-Native API Briges
  3. JDBC-Middleware
  4. Pure JDBC Driver

关于驱动程序的更多细节可以参考这篇文章

 

常见的JDBC类与方法

  • DriverManager类

DriverManager类是JDBC的管理器,负责管理JDBC驱动程序中,跟踪可用的驱动程序并在数据库和相应驱动程序之间建立连接。如果使用JDBC驱动程序,必须加载JDBC驱动程序并向DriverManager注册后才能使用。加载和注册驱动程序可以使用Class.forName()方法来完成。此外,java.sql.DriveManager类还处理如驱动程序登录时间限制及登录和跟踪信息的显示等事务。

  • Connection接口

Connection接口负责建立与指定数据库的连接。在连接上下文中执行SQL语句并返回结果。

  • Statement接口

Statement接口用于执行静态SQL语句并返回它所生成的对象。在默认情况下,同一时间每个Statement的对象只能打开一个ResultSet的对象。

  • PreparedStatement 接口

PreparedStatement接口可以表示预编译的SQL语句的对象,它是statement接口的子接口。由于SQL语句可以被预编译在PreparedStatement接口的对象中,所以,可以使用此对象多次高效地执行该语句。

  • ResultSet接口

java.sql.ResultSet接口表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。ResultSet的对象具有指向其当前数据行的光标。最初光标被放置于第一行之前。next()方法将光标移动到下一行;因为该方法在ResultSet的对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。

 

 


Java连接mysql:

我是Mysql 8.0.18的版本

首先我们需要下载驱动包(适用于mysql8.0以上),下载好之后在对应的项目中导入该库文件。

链接,提取码:2qdi

拿到驱动包后倒入到java的驱动包中

好了,接下来就可以操作了

这是我们的数据库notenow中的数据表test中的内容

好,开始写代码:

package 测试;
import java.sql.*;
class test {
    // MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
	//声明JDBC驱动名称
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";  
    //定义JDBC的url地址
    static final String DB_URL = "jdbc:mysql://localhost:3306/notenow?useSSL=false&serverTimezone=UTC";
 
    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "964939451";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            // 注册 JDBC 驱动
            //将这个包加载进内存
            Class.forName(JDBC_DRIVER);
        
            // 打开链接
            System.out.println("连接数据库...");
            //连接数据库url(返回一个Connection接口对象)
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 执行查询
            System.out.println(" 实例化Statement对象...");
            //创建statement对象
            stmt = conn.createStatement();
            //SQL语句
            String sql;
            sql = "SELECT id, name FROM test";
            //执行SQL语句,并得到结果
            ResultSet rs = stmt.executeQuery(sql);
        
            // 展开结果集数据库
            while(rs.next()){
                // 通过字段检索
                String name = rs.getString("name");
                System.out.print("姓名:" + name+" \n");
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        }catch(java.lang.ClassNotFoundException e) {
        	System.out.print("ForName:"+e.getMessage());      
        }catch(SQLException se){
            // 处理 JDBC 错误
            se.printStackTrace();
        }catch(Exception e){
            // 处理 Class.forName 错误
            e.printStackTrace();
        }finally{
            // 关闭资源
            try{
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
            }// 什么都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
} 

输出成功:

连接数据库...
 实例化Statement对象...
姓名:可爱的兔子 
姓名:凶恶的老虎 
Goodbye!

要注意,mysql版本会影响设置

  • mysql版本低于8.0

请使用这个驱动包,提取码:wy2c

声明驱动名称:com.mysql.jdbc.Driver

定义连接url:jdbc:mysql://localhost:3306/数据库名

  • mysql版本高于8.0

请使用这个驱动包,提取码:2qdi

声明驱动名称:com.mysql.cj.jdbc.Driver

定义连接url:jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC

MySQL 8.0 以上版本不需要建立 SSL 连接的,需要显式关闭,还有就是要设置时区。

然后就可以成功连接了!

 


模拟登陆:

有了上面的基础我们来做一个模拟登陆的代码示例

首先先看一下我们的数据表

+—-+————+———-+
|   id  |     name    | password |
+—-+————+———-+
|  1    | 可爱的兔子| 123456 |
|   2   | 凶恶的老虎| 654321 |
+—-+————+———-+

代码奉上:

package 测试;
import java.sql.*;
import java.util.Scanner;

class test {
    // MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
	//声明JDBC驱动名称
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";  
    //定义JDBC的url地址
    static final String DB_URL = "jdbc:mysql://localhost:3306/notenow?useSSL=false&serverTimezone=UTC";
 
    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "964939451";
 
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs;
        //键盘录入,接受用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.nextLine();
        System.out.println("请输入密码");
        String password = sc.nextLine();
        
        try{
            // 注册 JDBC 驱动,
            //将这个包加载进内存
            Class.forName(JDBC_DRIVER);
        
            // 打开链接
            System.out.println("连接数据库...");
            //连接数据库url
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            //SQL语句
            String sql;
            sql = "SELECT * FROM test WHERE name=? and password=?";
            //执行SQL语句,并得到结果
            pstmt=conn.prepareStatement(sql);
            //给?赋值
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            //执行查询
            rs=pstmt.executeQuery();
            // 展开结果集数据库
            if(rs.next()){
                System.out.println("登录成功");
            }else {
            	System.out.println("登录失败");
            }
            
            // 完成后关闭
            rs.close();
            sc.close();
            conn.close();
        }catch(java.lang.ClassNotFoundException e) {
        	System.out.print("ForName:"+e.getMessage());      
        }catch(SQLException se){
            // 处理 JDBC 错误
            se.printStackTrace();
        }catch(Exception e){
            // 处理 Class.forName 错误
            e.printStackTrace();
        }finally{
            // 关闭资源
            try{
                if(pstmt!=null) pstmt.close();
            }catch(SQLException se2){
            }// 什么都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
} 

在这个程序中使用了PrepareStatement接口,它提供了一些列的set方法来设定位置。

注意该程序中的Preparedstatement()方法中的参数“?”,后面的setString的一个参数就是指定第几个?,第二个参数就是用这个参数替换?程序必须在execute之间指定好参数?

 


完结:

java的基本学习到此告一段落,但是java世界的探索才刚刚起航,加油!

 

 


 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

 

 

发表评论