JDBC学习笔记

JDBC笔记

JDBC规范定义接口,具体的实现由各大数据库厂商实现。
JDBC是JAVA访问数据库的标准规范。
使用JDBC的好处:
(1)如果开发访问数据库的程序,只需要会调用JDBC接口的方法就行,不用关注类是怎么实现的
(2)使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库。
使用JDBC开发使用到的包:
在这里插入图片描述
JDBC核心API:
在这里插入图片描述

DriverManager类

作用:1.管理和注册驱动2.创建数据库的连接
类中 的方法:
在这里插入图片描述
使用JDBC连接数据库的四个参数:
在这里插入图片描述
连接数据库的URL地址格式:

协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值

MySQL写法:
在这里插入图片描述
e.g.得到MySQL的数据库连接对象:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 得到连接对象
*/
public class Demo2 {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/day24";
//1) 使用用户名、密码、URL 得到连接对象
Connection connection = DriverManager.getConnection(url, "root", "root");
//com.mysql.jdbc.JDBC4Connection@68de145
System.out.println(connection);
    }
}

Connection接口

作用:具体的实现类由数据库厂商实现,代表一个连接对象
方法:
在这里插入图片描述

Statement接口

(※)JDBC访问数据库的步骤

在这里插入图片描述
(1)注册和加载驱动(可省)
(2)获取连接
(3)Connection获取Statement对象
(4)使用Statement对象执行SQL语句
(5)返回结果集
(6)释放资源

Statement作用:代表一条语句对象,用于发送SQL语句给服务器,用于执行静态SQL语句并返回它所生成结果的对象。

Statement方法:
在这里插入图片描述
释放资源:
(1)需要释放的对象:ResultSet结果集,Statement语句,Connection连接
(2)**释放原则:先开的后关,后开的先关。**ResultSet->Statement->Connection
(3)放在finally代码块中
执行DDL操作
e.g.使用JDBC在MySQL数据库中创建一张学生表

package testSQL;
/*JDBC所用包*/
import java.sql.Connection;//连接
import java.sql.DriverManager;//驱动
import java.sql.Statement;
import java.sql.SQLException;

public class testStu {
	public static void main(String args[]){
		//1.创建链接
		Connection conn = null;
		Statement statement = null;
		try{
			conn = DriverManager.getConnection
				("jdbc:mysql:///test","root","root");
			//2.通过连接对象得到语句对象
			statement = conn.createStatement();
			//3.通过语句对象发送SQL语句给服务器
			//4.执行SQL
			statement.executeUpdate("CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,"
					                + "name VARCHAR(20) NOT NULL,gender BOOLEAN,birthday DATE)");
			//5.返回影响的行数
			System.out.print("success");
		    }catch(SQLException e){
		    	e.printStackTrace();
		    }
		//6.释放资源
		finally{
			if(statement != null){
				try{
					statement.close();
				}catch(SQLException e){
					e.printStackTrace();
				}
			}
			if(conn != null){
				try{
					conn.close();
				}catch(SQLException e){
					e.printStackTrace();
				}
			}
		}
	}
	

}

这一块我并没有执行成功,因为配置有点花时间,大概有个概念吧。

执行DML操作步骤:
(1)创建连接对象

Connection conn = DriverManager.getConnetion
                         ("jdbc:mysql:///test","root","root");

(2)创建Statement对象

Statement statement = conn.createStatement();

(3)执行SQL语句

statement.excuteUpdate
         ("INSERT INTO student VALUES(NULL,'小刘',1,'2005-9-23')");

(4)释放资源

statement.close();
conn.close();

执行DQL操作
ResultSet接口
作用:封装查询的结果集,对结果集进行遍历,取出每一条记录
方法:
在这里插入图片描述
在这里插入图片描述
e.g.确保数据库中有3条记录,查询所有学员的信息
(1)连接连接对象

Connection conn = DriverManager.getConnection("jdbc:mysql:///test","root","root");

(2)创建Statement对象

Statement statement = conn.createStatement();

(3)执行语句,得到结果集

ResultSet rs = statement.excuteQuery("SELECT * FROM student");
while(rs.next()){
	int id = rs.getInt("id");
	String name = rs.getString("name");
	boolean gender = rs.getBoolean("gender");
	Date birthday rs.getDate("birthday");
	System.out.print(...);
}

(4)释放资源(顺序)

rs.close();
statement.close();
conn.close();

SQL注入问题JDBC学习资料

当我们输入以下密码,我们发现我们账号和密码都不对竟然登录成功了

请输入用户名:
newboy
请输入密码:
'a' or '1'='1
select * from user where name='newboy' and password='a' or '1'='1'
登录成功,欢迎您:newboy

问题分析:

select * from user where name='newboy' and password='a' or '1'='1'
name='newboy' and password='a' 为假
'1'='1' 真
相当于
select * from user where true; 查询了所有记录

我们让用户输入的密码和 SQL 语句进行字符串拼接。用户输入的内容作为了 SQL 语句语法的一部分,改变了原有 SQL 真正的意义,以上问题称为 SQL 注入。要解决 SQL 注入就不能让用户输入的密码和我们的 SQL 语句进行简单的字符串拼接。
解决方法:

PreparedStatement

PreparedStatement是Statement的子接口,继承父接口的所有方法,是一个预编译的SQL语句
工作原理
1. prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement 会引用着预编译后的结果。
可以多次传入不同的参数给 PreparedStatement 对象并执行。减少 SQL 编译次数,提高效率。
2. 安全性更高,没有 SQL 注入的隐患。
3. 提高了程序的可读性

使用PreparedStatement的步骤:
(1)编写SQL语句,未知内容使用?占位
(2)获取PreparedStatement对象
(3)设置实际参数
(4)执行参数化SQL语句
(5)释放资源
在这里插入图片描述
e.g.

package com.lqg;
import com.itheima.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 使用 PreparedStatement
*/
public class Demo8Login {
    //从控制台上输入的用户名和密码
    public static void main(String[] args) throws SQLException {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入用户名");
    String name = sc.nextLine();
    System.out.println("请输入密码:");
    String password = sc.nextLine();
    login(name, password);
}
/**
* 登录的方法
* @param name
16 / 21
* @param password
*/
private static void login(String name, String password) throws SQLException {
    Connection connection = JdbcUtils.getConnection();
    //写成登录 SQL 语句,没有单引号
    String sql = "select * from user where name=? and password=?";
    //得到语句对象
    PreparedStatement ps = connection.prepareStatement(sql);
    //设置参数
    ps.setString(1, name);
    ps.setString(2,password);
    ResultSet resultSet = ps.executeQuery();
    if (resultSet.next()) {
    System.out.println("登录成功:" + name);
    }
    else {
    System.out.println("登录失败");
    }
    //释放资源,子接口直接给父接口
    JdbcUtils.close(connection,ps,resultSet);
    } 
}

JDBC事务处理

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值