JDBC学习

JDBC

  1. 定义:就是使用java语言操作关系型数据库的一套API
  2. 全称:Java DAteBase Connectivity java数据库连接
  3. 本质:
    ① sun公司定义的一套操作所有关系数据库的规则,即接口
    ② 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  4. 好处:
    ① 各数据库厂商使用相同的接口,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(驱动管理类)

作用:

  1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");

Driver类源码:
在这里插入图片描述

  1. 获取数据库连接
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(数据库连接对象)

  1. 获取执行SQL的对象
    (1)createStatement
    (2)prepareStatemet

  2. 管理事务
    ① 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

作用:

  1. 执行sql语句
    ① int executeUpdate(sql):执行DML、DDL语句
    返回值:
    (1)DML语句影响的行数
    (2)DDL语句执行后,执行成功也可能返回0
    ② ResultSet excuteQuery(sql):执行DQL语句
    返回值:ResultSet结果集对象

JDBC接口——ResultSet(结果集对象)

作用

  1. 封装了DQl查询语句的结果
    ResultSet stmt. excuteQuery(sql) :执行DQL语句,返回ReaultSet对象
    查询返回结果
    ① boolean next():(1)将光标从当前位置向前移动一行(2)判断当前行是否为有效行

返回值:true:有效行,当前数据是有效行
false:无效行,当前行没有数据
② xxx getXxx(参数):获取数据
xx:数据类型
参数:int 列的编号,从1开始
String:列的名称

使用步骤

  1. 游标向下移动一行,并判断是否有数据:next()
  2. 获取数据: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();
    }
}

注意:按照视频操作我的代码是报错的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值