JDBC驱动实现程序与数据库的连接

JDBC是Java程序访问数据库的标准,由一组Java语言编写的类和接口组成,这些类和接口称为JDBC API
JDBC API包括两个包:

  • java.sql包:基本的数据库编程服务的类和接口建立与数据库的连接
  • javax.sql包:主要提供了服务器端访问和处理数据源的类和接口

JDBC的基本功能包括:

  • 建立与数据库的连接
  • 发送SQL语句
  • 处理数据库操作结果

JDBC(Java DataBase Connectivity) 驱动可以为多种关系型数据库DBMS 提供统一的访问方式,用Java来操作数据库
在这里插入图片描述

涉及知识点,下面实例要用

数据库驱动:
DB 驱动(jar包) 具体驱动类 连接字符串
MySQL mysql-connector-java-x.jar com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/数据库实例名
SqlServer sqljdbc-x.jar com.microsoft.sqlserver.jdbc.SQLServerDriver bc:microsoft:sqlserver:localhost:1433;databasename=数据库实例名
Oracle ojdbc-x.jar oracle.jdbc.OracleDriver jdbc:oracle:thin:@localhost:1521:数据库实例名

使用JDBC操作数据库时,如果对数据库进行了更换,只需要替换:驱动、具体驱动类、连接字符串、DB实例名、用户名、密码
驱动包可以去中央仓库maven下载:https://mvnrepository.com/

Statement操作数据库:
  • 增删改:executeUpdate()
  • 查询:executeQuery()

JDBC API:https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html

JDBC驱动建立与数据库的连接流程:
  • 导相应数据库的驱动:jar包
  • 反射class.forName()加载具体的驱动类
  • DriverManager.getConnection()管理JDBC驱动并与数据库建立连接
  • Statement(PreparedStatement/createStatement/CallableStatement)获取操作数据库的对象
  • Statement操作数据库: (增删改/查)处理结果集
  • 关闭建立的对象

下面以MySQL数据库为例,与Java建立连接

准备一个mysql数据库:SYMYSQL
并建立一张表:student
下方案例用CMD操作DB,启动mysql,也可以在电脑“服务”中启动
在这里插入图片描述
在这里插入图片描述
Java程序
com.demo包下的JDBCPreparedStatementDemo.java

package com.demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;

public class JDBCPreparedStatementDemo {
	private static final String URL = "jdbc:mysql://localhost:3306/SYMYSQL";	//mysql连接字符串,数据库名为SYMYSQL
	private static final String USERNAME = "root";			//数据库用户名为root
	private static final String PWD = "root";			//数据库密码为root

	// 增删改
	public static void update() {
		Connection connection = null;
		PreparedStatement pstmt = null;
		try {
			// a.导入驱动,加载具体的驱动类
			Class.forName("com.mysql.jdbc.Driver");			// 加载mysql具体的驱动类
			// b.与数据库建立连接
			connection = DriverManager.getConnection(URL, USERNAME, PWD);

			/*
			// Statement
			stmt = connection.createStatement();
			String sql = "insert into student values(8,'suoyue',56)";		//DB插入语句
			//String sql = "update student set stu_Score='66' where stu_Num=8"; //DB更新语句
			//String sql = "delete from student where stu_Num=8";				//DB删除语句
			int count = stmt.executeUpdate(sql); // 返回值表示 增删改 几条数据
			*/
			
			// PreparedStatement
			String sql = "insert into student values(?,?,?)";					//数据库插入语句
			//String sql = "update student set stu_Score=? where stu_Num=?"; 	//DB更新语句
			//String sql = "delete from student where stu_Num=?";				//DB删除语句
			pstmt = connection.prepareStatement(sql);			//预编译
			//赋值操作:配置占位符数据[8,"suoyu",56]
			pstmt.setInt(1, 8);
			pstmt.setString(2, "suoyu");
			pstmt.setInt(3, 56);

			int count = pstmt.executeUpdate();		// 增删改,成功返回:1,失败返回:0

			// d.处理结果
			if (count > 0) {
				System.out.println("操作成功");
			}
		} catch (ClassNotFoundException e) {	//Class.forName() 抛出ClassNotFoundException异常
			e.printStackTrace();
		} catch (SQLException e) {				//其余方法全部抛SQLException异常
			e.printStackTrace();
		} catch (Exception e) {					//保险起见,只要有异常就再抛个Exception异常
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)				//先判断不为空再进行关闭操作,避免异常
					pstmt.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/*
	//查
	public static void query() {
		Connection connection = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			......
			
			String sql = "select count(*) from login where stu_Num= ? and stu_Name =?";
			pstmt = connection.prepareStatement(sql);
			pstmt.setInt(1, 8);
			pstmt.setString(2, "suoyue");

			rs = pstmt.executeQuery(); 		// 执行SQL(增删改executeUpdate(),查询executeQuery())

			int count = -1;
			if (rs.next()) {				//next()光标下移,判断是否有下一条数据;true/false
				count = rs.getInt(1);		//getXxx(字段名|位置):获取具体的字段值 
			}
			if (count > 0) {
				System.out.println("查找成功");
			} else {
				System.out.println("查找失败");
			}

		} 
		
		......
	}
	*/
	
	public static void main(String[] args) {
		update() ;
//		query();
	}
}

在PreparedStatement与createStatement的使用中推荐使用前者,原因如下:

  • 编码更加简便(避免了字符串的拼接)
  • 提高性能(因为 有预编译操作,预编译只需要执行一次)
  • 安全(可以有效防止sql注入)

CallableStatement:调用 存储过程、存储函数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章