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);
}
}