栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【JAVA】JDBC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【JAVA】JDBC

目录

【JDBC】

【JDBC——项目示例】

【JDBC-API】

【DriverManager】——驱动管理类

【Connection】——数据库连接对象

【Statement】——执行

【ResultSet】——结果集对象

【ResultSet——项目示例】

【PreparedStatement】——预编译


【JDBC】

【概述】:

  • JDBC 就是使用Java语言操作关系型数据库的一套API
  • 全称:( Java DataBase Connectivity ) Java 数据库连接

【本质】:

  • 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

【JDBC——项目示例】

调用MySQL数据库修改数据

        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username="root";
        String password="root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //定义sql语句
        String sql = "UPDATe account SET money = 2000 WHERe id = 1;";
        //获取执行sql的对象Statement
        Statement stmt =conn.createStatement();
        //执行sql
        int count = stmt.executeUpdate(sql);
        //处理结果
        System.out.println(count);
        //释放资源
        stmt.close();
        conn.close();

【JDBC-API】

【DriverManager】——驱动管理类

【作用】:

1、注册驱动

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

 【注意】:

  • MySQL 5之后的驱动包,可以省略注册驱动的步骤
  • 自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

2、获取数据库连接

static Connection  getConnection(String url, String user, String password)

例:

        Connection conn = DriverManager.getConnection(url, username, password);

【参数】

1、url:连接路径

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

例:jdbc:mysql://127.0.0.1:3306/db1

【注意】:

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

2、user:用户名

3、password:密码

【Connection】——数据库连接对象

【作用】:

1、获取执行SQL的对象

  • 普通执行SQL对象
Statement    createStatement()
  • 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement    prepareStatement​ (sql)
  • 执行存储过程的对象
CallableStatement   prepareCall​​ (sql)

2、管理事务

  • JDBC事务管理:Connection接口中定义了3个对应的方法
//开启事务:true为自动提交事务;false为手动提交事务,即为开启事务
public void setAutoCommit(boolean autoCommit)
//提交事务
public void commit()
//回滚事务
public void rollback()

例: 

        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //定义sql语句
        String sql1 = "UPDATE account SET money = 2000 WHERe id = 1;";
        String sql2 = "UPDATE account SET money = 2000 WHERe id = 2;";
        //获取执行sql的对象Statement
        Statement stmt = conn.createStatement();
        try {
            //开启事务
            conn.setAutoCommit(false);
            //执行sql
            int count1 = stmt.executeUpdate(sql1);
            //处理结果
            System.out.println(count1);
            int i = 3 / 0;
            //执行sql
            int count2 = stmt.executeUpdate(sql2);
            //处理结果
            System.out.println(count2);
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            conn.rollback();
        }
        //释放资源
        stmt.close();
        conn.close();

【Statement】——执行

【作用】

1、执行SQL语句

//执行DML、DDL语句
public int executeUpdate(sql)
//返回值:(1) DML语句影响的行数 
//       (2) DDL语句执行后,执行成功也可能返回0

//执行DQL 语句
public ResultSet executeQuery(sql)
//返回值:ResultSet 结果集对象

例:

        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //定义sql语句
        //DML语句
        String sql1 = "create database db2";
        //获取执行sql的对象Statement
        Statement stmt = conn.createStatement();
        try {
            //开启事务
            conn.setAutoCommit(false);
            //执行sql
            int count1 = stmt.executeUpdate(sql1);
            //处理结果
            if (count1>0) {
                System.out.println("修改成功");
            }else {
                System.out.println("修改失败");
            }
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            conn.rollback();
        }
        //释放资源
        stmt.close();
        conn.close();

【ResultSet】——结果集对象

【作用】

1、封装了DQL查询语句的结果

//执行DQL 语句,返回 ResultSet 对象
ResultSet stmt.executeQuery(sql)
  • 获取查询结果
//(1) 将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
boolean next();
//返回值:
//true:有效行,当前行有数据    false:无效行,当前行没有数据

xxx getXxx(参数):获取数据
//xxx:数据类型;如:int getInt(参数) ; String getString(参数)
//参数:int:列的编号,从1开始    String:列的名称

【使用步骤】

  1. 游标向下移动一行,并判断该行否有数据:next()
  2. 获取数据:getXxx(参数)

例:

        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //定义sql语句
        String sql = "select * from account";
        //获取执行sql的对象Statement
        Statement stmt = conn.createStatement();
        //执行sql
        ResultSet rs = stmt.executeQuery(sql);
        //数据处理
        while (rs.next()){
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);
            System.out.println(id);
            System.out.println(name);
            System.out.println(money);
            System.out.println("----------------");
        }
        //释放资源
        rs.close();
        stmt.close();
        conn.close();

【ResultSet——项目示例】

查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中

        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //定义sql语句
        String sql = "select * from account";
        //获取执行sql的对象Statement
        Statement stmt = conn.createStatement();
        //执行sql
        ResultSet rs = stmt.executeQuery(sql);
        //创建集合
        List list=new ArrayList<>();
        //数据处理
        while (rs.next()){
            Account account=new Account();
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);
            //赋值
            account.setId(id);
            account.setName(name);
            account.setMoney(money);
            //存入数组
            list.add(account);
        }
        System.out.println(list);
        //释放资源
        rs.close();
        stmt.close();
        conn.close();

【PreparedStatement】——预编译

【作用】

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

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

【方法】

1、获取PreparedStatement对象

// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);

2、设置参数值

//给 ? 赋值
PreparedStatement对象:setXxx(参数1,参数2)
//Xxx:数据类型 ; 如 setInt (参数1,参数2)
//参数:
//参数1:?的位置编号,从1 开始
//参数2:?的值

3、执行SQL

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

例:

        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //接收用户名和密码
        String name = "ss";
        String pwd = "'or'1'='1";
        //sql语句
        String sql = "select * from tb_user where username = ? and password =? ";
        //获取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("登录失败");
        }
        //释放资源
        rs.close();
        pStmt.close();
        conn.close();

【优点】

  1. 预编译SQL,提高性能
  2. 防止SQL注入:将敏感字符转义

【原理】

  1. 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
  2. 执行时就不用再进行这些步骤了,速度更快
  3. 如果sql模板一样,则只需要进行一次检查、编译

【启用】

  1. 在url中加入:useServerPrepStmts=true
  2. 配置MySQL日志
log-output=FILE
general-log=1
general_log_file="G:JAVAmysql.log"
slow-query-log=1
slow_query_log_file="G:JAVAmysql_slow.log"
long_query_time=2

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/943429.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号