JavaWeb11_JDBC

JDBC 的介绍

Java DataBase Connectivity 是一个独立于特定数据库的管理系统,通用的 SQL 数据库存取和操作的公共接口。

JDBC 定义了一组标准,为访问不同数据库提供了统一的途径。

JDBC 接口包括两个层面:

1、JDBC API:面向应用的 API,供程序员调用面向数据库的 API

供开发者调用的接口:java.sql 和 javax.sql

  • DriverManager 类
  • Connection 接口
  • Statement 接口
  • ResultSet 接口

2、DriverManager:面向数据库的API,负责连接不同厂商的数据库驱动

  • 加载数据库驱动,Java 程序和数据库之间的桥梁。
  • 获取 Connection,Java 程序与数据库的一次连接。
  • 创建 Statement 对象,由 Connection 产生,执行 SQL 语句。
  • 如果需要接收返回值,创建 ResultSet 对象,保存 Statement 执行之后所查询到的结果。
JDBC 的使用示例
  • 引入驱动:mysql-connector-java-8.0.11.jar

  • insert 示例代码:

public class Test {
	
	public static void main(String[] args) {
		try {
			//1. 加载驱动
			Class.forName("com.mysql.cj.jdbc.Driver");
			//2. 获取连接
			String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
			String user = "root";
			String password = "123456";
			Connection connection = DriverManager.getConnection(url,user,password);
			//3. 创建Statement,执行sql语句
			String sql = "insert into user(name,age) values('诸葛亮',37)";
			Statement statement = connection.createStatement();
			int result = statement.executeUpdate(sql);
			System.out.println(result);
			//关闭连接
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
1
  • select 示例代码:
public class Test {
	
	public static void main(String[] args) {
		try {
			//加载驱动
			Class.forName("com.mysql.cj.jdbc.Driver");
			//获取连接
			String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
			String user = "root";
			String password = "123456";
			Connection connection = DriverManager.getConnection(url,user,password);
			//创建Statement,执行sql语句
			String sql = "select * from user";
			Statement statement = connection.createStatement();
			ResultSet resultSet = statement.executeQuery(sql);
			while(resultSet.next()) {
				Integer id = resultSet.getInt("id");
				String name = resultSet.getString("name");
				Integer age = resultSet.getInt("age");
				System.out.println(id+"-"+name+"-"+age);
			}
			//关闭连接
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
1-BLU-20
2-张三-23
3-李四-35
4-王五-27
5-小明-44
6-诸葛亮-37

PreparedStatement

Statement 的子类,提供了 SQL 占位符的功能

使用 Statement 进行开发有两个问题:

1、需要频繁拼接 String 字符串,出错率较高。
2、存在 SQL 注入的⻛险。

SQL 注入:利用某些系统没有对用户输入的信息进行充分检测,在用户输入的数据中注入非法的 SQL语句,从而利用系统的 SQL 引擎完成恶意行为的做法。

例如:

String name = "xxxx' or '1'='1";
String password = "xxxx' or '1'='1";
String sql = "select * from user where name = '"+ name +"' and password = '"+ password +"'" ;

使用 PreparedStatement 代替 Statement 的写法:

public class Test {
	
	public static void main(String[] args) {
		try {
			//加载驱动
			Class.forName("com.mysql.cj.jdbc.Driver");
			//获取连接
			String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
			String user = "root";
			String password = "123456";
			Connection connection = DriverManager.getConnection(url,user,password);
			//创建Statement,执行sql语句
			String name = "BLU";
			int age = 20;
			String sql = "select * from user where name = ? and age = ? ";
			PreparedStatement prepareStatement = connection.prepareStatement(sql);
			prepareStatement.setString(1, name);
			prepareStatement.setInt(2, age);
			ResultSet resultSet = prepareStatement.executeQuery();
			if(resultSet.next()) {
				System.out.println("查询成功");
				Integer id = resultSet.getInt("id");
				String dbName = resultSet.getString("name");
				Integer dbAge = resultSet.getInt("age");
				System.out.println(id+"-"+dbName+"-"+ dbAge);
			}else {
				System.out.println("查询失败");
			}
			//关闭连接
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
查询成功
1-BLU-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值