JDBC
- 定义:就是使用java语言操作关系型数据库的一套API
- 全称:Java DAteBase Connectivity java数据库连接
- 本质:
① sun公司定义的一套操作所有关系数据库的规则,即接口
② 各个数据库厂商去实现这套接口,提供数据库驱动jar包 - 好处:
① 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
② 可随时更换底层数据库,访问数据库的Java代码基本不变
JDBC快速入门
具体见:https://www.bilibili.com/video/BV1Qf4y1T7Hx?p=30&vd_source=141108e707fe497ad8a1cdac278e7f4e
package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* JDBC快速入门
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/login";
String username="root";
String password="123456";
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/login?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","123456");
//3.定义sql
String sql="update users set password =123456 WHERE id=1;";
//4.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//5.执行sql
int count= stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
}
}
JDBC接口——DriverManager(驱动管理类)
作用:
- 注册驱动
Class.forName("com.mysql.jdbc.Driver");
Driver类源码:
- 获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/login?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","123456");
上面是引用实例,下面是引用的函数
DriverManager.getConnection(url,user,password)
其中
① url – a database url of the form jdbc:subprotocol:subname
② user – the database user on whose behalf the connection is being made
③ password – the user’s password
JDBC接口——Connection(数据库连接对象)
-
获取执行SQL的对象
(1)createStatement
(2)prepareStatemet -
管理事务
① MySQL事务管理
(1)开启事务:BEGIN;/START
TRANSACTION
(2)提交事务:COMMIT;
(3)回滚事务:ROLLBACK
MySQL默认自动提交事务
② JDBC事务管理:定义了三种办法
(1)开启事务:setAutoCommit(bollean autoCommit
):true为自动提交事务,false为手动提交事务,即开启事务
(2)提交事务:comit()
(3)回滚事务:rollback()
实例:
package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* JDBC API——Connection
*/
public class JDBCDemo2 {
public static void main(String[] args) throws Exception{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/login";
String username="root";
String password="123456";
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/login?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","123456");
//3.定义sql
String sql1="update users set password =123456 WHERE id=1;";
String sql2="update users set password =123456 WHERE id=2;";
//4.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
try{
//开启事务
conn.setAutoCommit(false);
//5.执行sql
int count1= stmt.executeUpdate(sql1);
//6.处理结果
System.out.println(count1);
//5.执行sql
int count2= stmt.executeUpdate(sql2);
//6.处理结果
System.out.println(count2);
//提交事务
conn.commit();
}catch (Exception throwables)
{
//回滚事务(如果try中间存在错误,则返回到try前面的数据)
conn.rollback();
throwables.printStackTrace();
}
//7.释放资源
stmt.close();
conn.close();
}
}
JDBC接口——Statement
作用:
- 执行sql语句
① int executeUpdate(sql):执行DML、DDL语句
返回值:
(1)DML语句影响的行数
(2)DDL语句执行后,执行成功也可能返回0
② ResultSet excuteQuery(sql):执行DQL语句
返回值:ResultSet结果集对象
JDBC接口——ResultSet(结果集对象)
作用
- 封装了DQl查询语句的结果
ResultSet stmt. excuteQuery(sql) :执行DQL语句,返回ReaultSet对象
查询返回结果
① boolean next():(1)将光标从当前位置向前移动一行(2)判断当前行是否为有效行
返回值:true:有效行,当前数据是有效行
false:无效行,当前行没有数据
② xxx getXxx(参数):获取数据
xx:数据类型
参数:int 列的编号,从1开始
String:列的名称
使用步骤
- 游标向下移动一行,并判断是否有数据:next()
- 获取数据:getXxx(参数)
实例:
package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* JDBC API --ResultSet
*/
public class JDBCDemo3{
public static void main(String[] args) throws Exception{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/login";
String username="root";
String password="123456";
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/login?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","123456");
//3.定义sql
String sql="select * from users;";
//4.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//5.执行sql
ResultSet rs =stmt.executeQuery(sql);
//6.处理结果,便利rs中的所有数据
while(rs.next())
{
int id=rs.getInt(1);
String usernames=rs.getString(2);
String passwords=rs.getString(3);
//以上是编号,也可以改成列的名称
System.out.println(id);
System.out.println(usernames);
System.out.println(passwords);
System.out.println("--------------");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
JDBC接口——PrepareStatement
作用:预编译SQL语句并执行,预防SQL注入问题
① 获取PreparedStatement对象
② 设置参数值
③ 执行sql
package org.example;
import java.sql.*;
/**
* JDBC API --PreparedStatement
*/
public class JDBCDemo_PreparedStatement {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/login";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/login?useUnicode=true&characterEncoding=utf-8&useSSL=false", "root", "123456");
//接受用户输入 用户名和密码
String name = "";
String pwd = "";
String sql="select * from users where username=? and passwoed=?";
//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//是指?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行sql
ResultSet rs = pstmt.executeQuery(sql);
//判断登录是否成功
if (rs.next()) {
System.out.println("登陆成功");
} else {
System.out.println("登录失败");
}
//释放资源
rs.close();
pstmt.close();
conn.close();
}
}
好处:预编译SQL,性能更高
防止SQL注入,将敏感字符进行转义
SQL注入演示
package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* JDBC API --PreparedStatement
*/
public class JDBCDemo_login {
public static void main(String[] args) throws Exception{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/login";
String username="root";
String password="123456";
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/login?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","123456");
//接受用户输入 用户名和密码
String name="";
String pwd="";
String sql="select * from users where username='"+name+"' and password='"+pwd+"';";
//获取stmt对象
Statement stmt=conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//判断登录是否成功
if(rs.next())
{
System.out.println("登陆成功");
}
else
{
System.out.println("登录失败");
}
//释放资源
rs.close();
stmt.close();
conn.close();
}
}
注意:按照视频操作我的代码是报错的