欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA Web03——jdbc原理_使用Statement/PrepareStatement访问数据库_两种访问方式的区别_jdbc总结

程序员文章站 2022-06-23 14:50:46
一、JDBC原理JDBC:Java DataBase Connectivity可以为多种关系型数据库提供统一的访问方式,用JAVA操作数据库学习目录1.JDBC API:提供各种操作访问接口,Connection Statement PreParedStatement ResultSet2.JDBC DirverManager:管理不同的数据库驱动3.各种数据库驱动:相应的数据库厂商提供的(第三方公司提供),连接/直接操作数据库1.JDBC API主要功能:与数据库建立连...

目录

一、JDBC原理

学习目录

1.JDBC API

2.JDBC访问数据库的具体具体步骤

3.数据库驱动

二、使用Statement访问数据库

三、使用PrepareStatement访问数据库

四、两种访问方式的区别

五、jdbc总结


一、JDBC原理

JDBC:Java DataBase Connectivity

可以为多种关系型数据库提供统一的访问方式,用JAVA操作数据库

学习目录

1.JDBC API:提供各种操作访问接口,Connection Statement PreParedStatement ResultSet

2.JDBC DirverManager:管理不同的数据库驱动

3.各种数据库驱动:相应的数据库厂商提供的(第三方公司提供),连接/直接操作数据库

1.JDBC API

主要功能:

  1. 与数据库建立连接 Connection
  2. 发送SQL语句 Statement
  3. 返回处理结果 ResultSet

实现方法:

  • DriverManager:管理jdbc驱动
  • Connection:连接(通过DriverManager产生)
  • Statement(PreparedStatement):增删改查(通过Connection产生)
  • CallableStatement:调用数据库中的存储过程/存储函数(通过Connection产生)
  • ResultSet:存储查询的结果(上面的Statement等产生)

Connection产生操作数据库的对象:

  • Connection产生Statement对象:createStatement()
  • Connection产生PreParedStatement对象:prepareStatement()
  • Connection产生CallableStatement对象:prepateCall()

ResultSet:保存结果集
next():光标下移,判断是否有下一条数据

2.JDBC访问数据库的具体具体步骤

1.导入驱动,加载具体的驱动类
2.与数据库建立连接
3.发送sql,执行
4.处理结果集

3.数据库驱动

  驱动jar 具体驱动类 连接字符串
Oracle ojdbc-x.jar oracle.jdbc.OracleDriver jdbc:oracle:thin:@localhost:1521:ORCL
MySQL mysql-connector-java-x.jar com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/数据库实例名
SqlSever sqljdbc-x.jar com.microsoft.sqlsever.jdbc.SQLseverDriver jdbc:microsoft:sqlsever:localhost:1433;databasename=数据库实例名

二、使用Statement访问数据库

Statement操作数据库:

  • 增删改:executeUpdate()
  • 查询:executeQuery()
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo {
	private static final String URL = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";
	private static final String USERNAME = "root";
	private static final String PWD = "123456";
	
	public static void update(){	//增删改
		Connection connection = null;
		Statement stmt = null;
		try {
			//1.导入驱动,加载具体的驱动类
			Class.forName("com.mysql.cj.jdbc.Driver");	//加载具体的驱动类
			//2.与数据库建立连接
			connection = DriverManager.getConnection(URL, USERNAME, PWD);
			//3.发送sql,执行(【增删改】、查)
			stmt = connection.createStatement();
			//String sql = "insert into ussser values(3,'aa')";
			//String sql = "update ussser set name='dd' where id=3";
			String sql = "delete from ussser where id=3";
			//执行SQL(增删改executeUpdate(),查询executeQuery())
			int count = stmt.executeUpdate(sql);	//返回值表示增删改 几条数据
			//4.处理结果
			if(count>0) {
				System.out.println("操作成功!");
			}
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(stmt!=null)
					stmt.close();
				if(connection!=null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void query() {
		Connection connection = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			//1.导入驱动,加载具体的驱动类
			Class.forName("com.mysql.cj.jdbc.Driver");	//加载具体的驱动类
			//2.与数据库建立连接
			connection = DriverManager.getConnection(URL, USERNAME, PWD);
			//3.发送sql,执行(增删改、【查】)
			stmt = connection.createStatement();
			String sql = "select id,name from ussser";
			//执行SQL(增删改executeUpdate(),查询executeQuery())
			rs = stmt.executeQuery(sql);	//返回值表示增删改 几条数据
			//4.处理结果
			while(rs.next()) {
				//推荐用字段名的形式
				int id = rs.getInt("id");
				String name = rs.getString("name");
//				int id = rs.getInt(1);	//下标: 从1开始计数
//				String name = rs.getString(2);
				System.out.println(id+"---"+name);
			}
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null)
					rs.close();
				if(stmt!=null)
					stmt.close();
				if(connection!=null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		//update();
		query();
	}
}

使用jdbc操作数据库时,如果对数据库进行了更换,只需要替换:驱动、具体驱动类、连接字符串、用户名、密码

三、使用PrepareStatement访问数据库

PreParedStatement操作数据库:

  • 增删改:executeUpdate()
  • 查询:executeQuery()
  • 赋值操作:setXxx()
public class JDBCDemo {
	private static final String URL = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";
	private static final String USERNAME = "root";
	private static final String PWD = "123456";
	
	public static void update(){	//增删改
		Connection connection = null;
		Statement stmt = null;
		PreparedStatement pstmt = null;
		try {
			//1.导入驱动,加载具体的驱动类
			Class.forName("com.mysql.cj.jdbc.Driver");	//加载具体的驱动类
			//2.与数据库建立连接
			connection = DriverManager.getConnection(URL, USERNAME, PWD);
			//3.发送sql,执行(【增删改】、查)
			/*Statement
			stmt = connection.createStatement();
			//String sql = "insert into ussser values(3,'aa')";
			//String sql = "update ussser set name='dd' where id=3";
			String sql = "delete from ussser where id=3";
			//执行SQL(增删改executeUpdate(),查询executeQuery())
			int count = stmt.executeUpdate(sql);	//返回值表示增删改 几条数据
			*/
			
			//PreparedStatement
			String sql = "insert into ussser values(?,?)";
			pstmt = connection.prepareStatement(sql);
			
			pstmt.setInt(1, 7);
			pstmt.setString(2,"acd");
			
			int count = pstmt.executeUpdate();
			
			//4.处理结果
			if(count>0) {
				System.out.println("操作成功!");
			}
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(stmt!=null)
					stmt.close();
				if(connection!=null)
					connection.close();
				if(pstmt!=null)
					pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		update();
	}
}

四、两种访问方式的区别

1.Statement

  1. sql
  2. executeUpdate(sql)

2.PrepareStatement

  1. sql(可能存在占位符?)
  2. 在创建PrepareStatement对象时,将sql预编译 prepareStatement(sql)
  3. executeUpdate(sql)
  4. setXxx()替换占位符

推荐使用PrepareStatement,优势:

  • 编码更加方便(避免了字符串的拼接)
  • 提高性能(因为有预编译操作,预编译只需要执行一次)
    eg:重复增加100条(批量处理)
  • 安全(可以有效防止sql注入)
    sql注入:将客户输入的内容 和 开发人员的SQL语句混为一体
    stmt:存在被sql注入的风险(例如输入 用户名:任意值 ' or 1=1 -- 密码:任意值)
    pstmt:有效防止sql注入

五、jdbc总结

  1. 导入驱动包,加载具体驱动类  Class.forName("具体驱动类");
  2. 与数据库简历连接  connection = DriverManager.getConnection( . . . );
  3. 通过connection获取操作数据库的对象(Statement\preparedStatement\callableStatement)
    stmt = connection.createStatement();
  4. (查询)处理结果集 rs=pstmt.executeQuery();
    while(rs.next()){
        rs.getXxx( . . . );
    }

 

本文地址:https://blog.csdn.net/qiao39gs/article/details/108985838