SQLyog基础操作(十四)-JDBC连接优化、SQL语句测试

10.6 Statement对象

  JDBC中的statement对象用于向数据库发送SQL语句,想完成数据的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

  • Statement对象的executeUpdate方法用于向数据库发送增删改查的SQL语句,executeUpdate执行完成后,将会返回一个整数,即增删改语句导致了数据库几行数据发生了变化。

  • Statement对象的executeQuery方法用于向数据库发送查询语句,executeUpdate方法返回代表查询结果的ResultSet对象。

10.6.1 JDBC连接优化

1.在src包下新建db.properties文件存储driver、username、password等信息,用于后续资源加载

 driver = com.mysql.jdbc.Driver
 url = jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
 username = root
 password = 123456

注意:每条语句结束后不能有“;”

2.在src下新建包utils,在包里面新建类JdbcUtils,用于加载db.properties文件资源、加载驱动、获取连接、释放连接资源等。

 package utils;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Properties;
 
 /**
  * 用于加载db.properties文件资源、加载驱动、获取连接、释放连接资源等
  */
 public class JdbcUtils {
     //属性信息
     private static String driver = null;
     private static String url = null;
     private static String username = null;
     private static String password = null;
 
     static {
         try{
             //加载资源
             InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
 
             //获取资源
             Properties properties = new Properties();
             properties.load(in);
 
             //获取详细信息
             driver = properties.getProperty("driver");
             url = properties.getProperty("url");
             username = properties.getProperty("username");
             password = properties.getProperty("password");
 
             //1.驱动只用加载一次
             Class.forName(driver);
 
        } catch(IOException | ClassNotFoundException e){
             e.printStackTrace();
        } catch(Exception e){
             e.printStackTrace();
        }
    }
 
     /**
      * 获取连接
      * @return
      * @throws SQLException
      */
     public static Connection getConnection() throws SQLException {
         return DriverManager.getConnection(url,username,password);
    }
 
     /**
      * 释放连接资源
      * @param connection
      * @param statement
      * @param resultSet
      */
     public static void release(Connection connection, Statement statement, ResultSet resultSet){
         //关闭资源的顺序依次为resultSet、statement、connection
         if(resultSet!=null){
             try {
                 resultSet.close();
            } catch (SQLException e) {
                 e.printStackTrace();
            } catch(Exception e){
                 e.printStackTrace();
            }
        }
         if(statement!=null){
             try {
                 statement.close();
            } catch (SQLException e) {
                 e.printStackTrace();
            } catch(Exception e){
                 e.printStackTrace();
            }
        }
         if(connection!=null){
             try {
                 connection.close();
            } catch (SQLException e) {
                 e.printStackTrace();
            } catch(Exception e){
                 e.printStackTrace();
            }
        }
    }
 }
 

文件层级如下:

10.6.2 测试sql语句在Java中的实现

(1)插入操作:使用executeUpdate(String sql)方法完成数据添加操作

 package com.study.lesson;
 
 import utils.JdbcUtils;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 
 /**
  * 测试insert
  */
 public class JdbcDemo02 {
     public static void main(String[] args) {
         //属性信息
         Connection connection = null;
         Statement statement = null;
         ResultSet resultSet = null;
         try {
             //连接驱动,获得数据库
             connection = JdbcUtils.getConnection();
 
             //创建执行SQL语句的对象
             statement = connection.createStatement();
 
             //SQL插入语句
             String sql ="INSERT INTO `users`(`id`,`name`,`password`,`email`,`birthday`)" +
                     "VALUES(4,'zhaoliu','123456','123456789@qq.com','2019-02-03')";
 
             //执行SQL语句,返回代码执行后受影响的行数
             int i = statement.executeUpdate(sql);
             if(i>0){
                 System.out.println("插入成功!");
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             //释放连接资源
             JdbcUtils.release(connection,statement,resultSet);
        }
 
    }
 }
 

输出结果:在SQLyog中可查看对应变化

 插入成功!

(2)删除操作:使用executeUpdate(String sql)方法完成数据删除操作

 package com.study.lesson;
 
 import utils.JdbcUtils;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 
 /**
  * 测试delete
  */
 public class JdbcDemo03 {
     public static void main(String[] args) {
         Connection connection = null;
         Statement statement = null;
         ResultSet resultSet = null;
         try {
             connection = JdbcUtils.getConnection();
             statement = connection.createStatement();
             String sql ="DELETE FROM `users` WHERE `id` = 4;";
             int i = statement.executeUpdate(sql);
             if(i>0){
                 System.out.println("删除成功!");
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             JdbcUtils.release(connection,statement,resultSet);
        }
    }
 }
 

输出结果:在SQLyog中可查看对应变化

 删除成功!

(3)更新操作:使用executeUpdate(String sql)方法完成数据更新操作

 package com.study.lesson;
 
 import utils.JdbcUtils;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 
 /**
  * 测试update
  */
 public class JdbcDemo04 {
     public static void main(String[] args) {
         Connection connection = null;
         Statement statement = null;
         ResultSet resultSet = null;
         try {
             connection = JdbcUtils.getConnection();
             statement = connection.createStatement();
             String sql ="UPDATE `users` SET `password`='111111' WHERE `id`=1;";
             int i = statement.executeUpdate(sql);
             if(i>0){
                 System.out.println("更新成功!");
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             JdbcUtils.release(connection,statement,resultSet);
        }
    }
 }
 

输出结果:在SQLyog中可查看对应变化

 更新成功!

(4)查询操作:使用executeUpdate(String sql)方法完成数据查询操作

 package com.study.lesson;
 
 import utils.JdbcUtils;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 
 /**
  * 测试select
  */
 public class JdbcDemo05 {
     public static void main(String[] args) {
         Connection connection = null;
         Statement statement = null;
         ResultSet resultSet = null;
         try {
             connection = JdbcUtils.getConnection();
             statement = connection.createStatement();
             String sql ="SELECT * FROM `users` WHERE `id`=1;";
             resultSet = statement.executeQuery(sql);
             while (resultSet.next()){
                 System.out.println(resultSet.getString("name"));
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             JdbcUtils.release(connection,statement,resultSet);
        }
    }
 }
 

输出结果:

 zhangsan

10.6.3 使用Statement对象时存在SQL注入问题

SQL存在漏洞,会被攻击导致数据泄露。

测试代码

 package com.study.lesson;
 
 import utils.JdbcUtils;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 
 /**
  * sql注入问题
  */
 public class JdbcDemo06 {
     public static void main(String[] args) {
         //login("zhangsan","111111");//正常情况下,当用户名和密码输入正确后,输出用户信息
         //存在是SQL注入问题时,用户名或密码任一输入or'1=1,均会输出所有用户信息,导致信息泄露
         //login("'or'1=1","123456");
         //login("zhangsan","'or'1=1");
         login("'or'1=1","'or'1=1");
    }
     public static void login(String username,String password){
         Connection connection = null;
         Statement statement = null;
         ResultSet resultSet = null;
         try {
             connection = JdbcUtils.getConnection();
             statement = connection.createStatement();
             String sql ="SELECT * FROM `users` WHERE `name`='"+username+"' AND `password`='"+password+"';";
             resultSet = statement.executeQuery(sql);
             while (resultSet.next()){
                 System.out.println(resultSet.getString("name"));
                 System.out.println(resultSet.getString("password"));
                 System.out.println();
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             JdbcUtils.release(connection,statement,resultSet);
        }
    }
 }
 

输出结果:

 zhangsan
 111111
 
 lisi
 123456
 
 wangwu
 123456
posted @ 2021-07-13 18:26  Coder_Cui  阅读(367)  评论(0编辑  收藏  举报