JDBC -- API

目录

DriverManager 驱动管理类

作用

注册驱动

获取数据库连接

Connection 数据库连接对象

作用

获取执行SQL的对象

管理事务

Statement

作用

执行SQL语句

ResultSet 结果集对象

作用

封装了DQL查询语句的结果

获取查询结果

PreparedStatement

作用

预编译SQL语句并执行:预防SQL注入问题

使用

好处

原理


DriverManager 驱动管理类

作用

注册驱动

Class.forName("com.mysql.jdbc.Driver");

查看源码

TIP:

MySQL 5之后的驱动包,可以省略注册驱动的步骤

自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

获取数据库连接

DriverManager.getConnection( String url,String username,String password);

1. url:连接路径

语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...

示例: jdbc:mysql://127.0.0.1:3306/test1

细节:

  • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则ur可以简写为: jdbc:mysql:///数据库名称?参数键值对
  • 配置useSSL=false参数,禁用安全连接方式,解决警告提示

2.username:用户名

3.password:密码

Connection 数据库连接对象

作用

获取执行SQL的对象

普通执行SQL对象

Statement createStatement()

预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement prepareStatement (sql)

执行存储过程的对象

CallableStatement prepareCall (sql)

管理事务

MySQL事务管理

开启事务:BEGIN; / START TRANSACTION;

提交事务:COMMIT;

回滚事务:ROLLBACK;

MySQL默认自动提交事务

JDBC 事务管理: Connection接口中定义了3个对应的方法

开启事务: setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动提交事务,即为开启事务

提交事务:commit()

回滚事务:rollback()

一般情况配合try/catch来使用

        //3.定义SQL
        String sql = "update a set score=100 where id = 4";

        //4.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        
        try {
            //开启事务
            conn.setAutoCommit(false);
            //5.执行sql
            int count = stmt.executeUpdate(sql);
            //6.处理结果
            System.out.println(count);
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            conn.rollback();
            e.printStackTrace();
        }

Statement

作用

执行SQL语句

int executeUpdate(sql):执行DML、DDL语句

返回值:

(1) DML语句影响的行数

(2) DDL语句执行后,执行成功也可能返回0(删除数据库后,虽然删除成功也返回0)

    //3.定义SQL
//        String sql = "update a set score=100 where id = 4";
//        String sql = "create database abc";
        String sql = "drop database abc";

        //4.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();

        //5.执行sql
        int count = stmt.executeUpdate(sql);
        //6.处理结果
//        System.out.println(count);
        if (count>0){
            System.out.println("修改成功!");
        }else {
            System.out.println("修改失败!");
        }

ResultSet executeQuery(sql):执行DQL语句

返回值:ResultSet结果集对象

ResultSet 结果集对象

作用

封装了DQL查询语句的结果

ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象

获取查询结果

boolean next():(1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行

返回值:

true:有效行,当前行有数据.

false:无效行,当前行没有数据

xxx  getXxx(参数):获取数据

xxx:数据类型;如:int getlnt(参数) ; String getString(参数)

参数:

  • int:列的编号,从1开始.
  • String:列的名称
        //3.定义SQL
        String sql = "select * from a";

        //4.获取Statement对象
        Statement stmt = conn.createStatement();

        //5.执行sql
        ResultSet rs = stmt.executeQuery(sql);

        //6.处理结果,遍历rs中的所有数据
        //6.1光标向下移动一行,并且判断当前行是否有效数据
        while (rs.next()) {
            //6.2 获取数据
//            int id =rs.getInt(1);
//            String score  = rs.getString(2);
            int id = rs.getInt("id");
            String score = rs.getString("score");

            System.out.println(id);
            System.out.println(score);
            System.out.println("--------");
        }

输出结果

PreparedStatement

作用

预编译SQL语句并执行:预防SQL注入问题

SQL注入:通过操作输入来修改事先定义的SQL语句,用以表达执行代码对服务器进行攻击的方法

sql注入示例

String pwd = "'  or '1' = '1";

 //接收用户输入的用户名密码
        String name ="zhangsan";
//        String pwd = "123";
        String pwd = "'  or '1' = '1";

        //定义sql
        String sql = "select * from user where name ='"+name+"' and pwd ='"+pwd+"'";

        //获取stmt对象
        Statement stmt = conn.createStatement();

        //执行sql
        ResultSet rs = stmt.executeQuery(sql);

使用

①获取 PreparedStatement对象

//SQL语句中的参数值,使用?占位符替代

String sql = "select * from user where username = ? and password = ?";

//通过Connection对象获取,并传入对应的sql语句

PreparedStatement pstmt = conn.prepareStatement(sql);

②设置参数值

PreparedStatement对象: setXxx(参数1,参数2):给﹖赋值

Xxx:数据类型;如setInt (参数1,参数2)

参数:

参数1:?的位置编号,从1开始

参数2:?的值

③执行SQL

executeUpdate(); / executeQueryo(); :不需要再传递sql

        //接收用户输入的用户名密码
        String name ="zhangsan";
//        String pwd = "123";
        String pwd = "'  or '1' = '1";

        //定义sql
        String sql = "select * from user where name = ? and pwd = ?";

        //获取pstmt对象
        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.预编译SQL,性能更高

2.防止SQL注入:将敏感字符进行转义

原理

1.在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)

2执行时就不用再进行这些步骤了,速度更快

3.如果sql模板一样,则只需要进行一次检查、编译

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值