jdbc预习

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("登陆失败");
        }
    }
}

这时候就会显示登陆失败了
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值