jdbc简介
jdbc就是使用java语言操作关系型数据库的一套api,全称:Java Data Base Connectivity
实质上是官方定义的操作所有关系型数据库的规则,即接口
使用jdbc可以操作市面上大多数关系型数据库
api介绍:
1.Driver Manager(两个功能)
1.1.注册驱动:
Class.forName(“com.mysql.jdbc.Driver”);
1.2.获取链接:
参数:
一.
url:连接路径
格式:jdbc:mysql//IP地址(域名)/端口号/数据库名称?参数值对1&参数值对2&…
如果是连接的本机的mysql服务器,并且服务器默认的端口是3306,则url可以简写为:jdbc:mysql///数据库名称?参数值对1&参数值对2&…
username:用户名
password:密码
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/cly?serverTimezone=UTC";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
2.Connection(两个作用)
1.获取执行SQL的对象
1.普通执行sql对象
Statement creatSteatment()
2.预编译sql执行的sql对象:防止sql注入(具体请百度)
PreparedStatement preparedStatement(sql)
2.事务管理
jdbc事务管理:
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务,false为手动让提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
主要用于try-catch语句
代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class text {
public static void main(String[] args) throws Exception{
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.链接sql
String url = "jdbc:mysql://localhost:3306/cly?serverTimezone=UTC";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String sql1 = "update student set achievement = 100.00 where id = 1";
String sql2 = "update student set achievement = 100.00 where id = 2";
//4.执行sql对象 Statement
Statement stmt = conn.createStatement();
//开启事务
try{
//开启事务
conn.setAutoCommit(false);
int count1 = stmt.executeUpdate(sql1);//会返回受影响的行数
System.out.println(count1);
int count2 = stmt.executeUpdate(sql2);//会返回受影响的行数
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception throwables) {
//回滚事务
conn.rollback();
throwables.printStackTrace();
}
}
}
执行后数据库中的数据变样了
Statement
功能:执行sql语句
1.executeUpdate:执行DML(数据操纵语言),DDL(数据定义语言)
2.executeQuery:执行DQL(数据查询语言)语句
executeUpdate
1.代码如下:
String sql1 = "update student set achievement = 100.00 where id = 1";
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql1);
executeQuery
参数指的是数据表中的第几列!!!
具体代码如下:
import java.sql.*;
public class text {
public static void main(String[] args) throws Exception{
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.链接sql
String url = "jdbc:mysql://localhost:3306/cly?serverTimezone=UTC";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String sql1 = "select * from student";
//4.创建sql对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql1);
while(rs.next())//有数据就会读取
{
int id = rs.getInt(1);//列数
int year = rs.getInt(5);//列数
System.out.println(id);
System.out.println(year);
System.out.println("-------------------");
}
}
}
运行结果:
PrepareStatement
1.sql注入:
sql注入是通过操作输入来修改事先定义好的sql语句,用以达到执行代码对服务器实现攻击的操作
一个小的演示,比如通过修改代码实现用户登录:
模拟登陆程序:
import java.sql.*;
public class text {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.链接sql
String url = "jdbc:mysql://localhost:3306/cly?serverTimezone=UTC";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//接受输入 用户名和密码
String name = "zhangsan";
String pwd = "123";
String sql = "select * from tb_user 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("登陆失败");
}
}
}
数据库中的内容:
但是当修改代码如下:
还是会显示登陆成功!!
这里就是盗取者巧妙地利用了or拼接字符串实现了数据的偷换而登录
这里就要使用
相当于转意
代码如下:
import java.sql.*;
public class text {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.链接sql
String url = "jdbc:mysql://localhost:3306/cly?serverTimezone=UTC";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//接受输入 用户名和密码
String name = "dhashdsahd";//胡乱输入
String pwd = "' or '1' = '1";
String sql = "select * from tb_user where username = ? and password = ?";
//获取stmt对象(PreparedStatement)
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置问号的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行sql
ResultSet rs = pstmt.executeQuery();
//判断登录是否成功
if (rs.next()) {
System.out.println("登陆成功");
} else {
System.out.println("登陆失败");
}
}
}
这时候就会显示登陆失败了