zoukankan      html  css  js  c++  java
  • 6 JDBC

    JDBC

    理解图

    image-20200613233047615

    需要mysql包

    下载官网:https://downloads.mysql.com/archives/c-j/

    第一个JDBC项目

    1. 创建一个java项目,一路next

    2. 导入jar包

      1. image-20200613235135213
    3. 编写测试代码

      步骤

      1. 加载驱动 ——打开SQLyog
      2. 用户信息和url——输入用户账号密码和url (localhost)
      3. 连接成功,数据库对象——点击连接
      4. 获得执行SQL的对象
      5. 获得返回结果集合——执行语句,返回结果
      6. 释放连接
      import java.sql.*;
      public class jdbc_01 {
          public static void main(String[] args) throws ClassNotFoundException, SQLException {
              //1. 加载驱动 ——打开SQLyog
              Class.forName("com.mysql.jdbc.Driver");//固定写法
              //2. 用户信息和url
              //useUnicode=true 支持中文编码 &characterEncoding=utf8 设置中文字符UTF8&useSSL=true 使用安全的连接
              String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
              String username="root";
              String password="123456";
              //3. 连接成功,数据库对象
              Connection connection = DriverManager.getConnection(url, username, password);
              //4. 获得执行SQL的对象
              Statement statement = connection.createStatement();
              //5. 获得返回结果集合
              String sql = "SELECT * FROM users";
              ResultSet resultSet = statement.executeQuery(sql);
      
              while(resultSet.next()){
                  System.out.println(resultSet.getObject("id"));
                  System.out.println(resultSet.getObject("name"));
              }
              //6.释放连接
              resultSet.close();
              statement.close();
              connection.close();
          }
      }
      

    DriverManager

    //加载驱动,不返回对象的原因(即不new的原因)
    Class.forName("com.mysql.jdbc.Driver");
    //com.mysql.jdbc.Driver类中存在了DriverManager.registerDriver(new Driver());
    

    URL

    String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
    //mysql 默认3306端口
    //jdbc:mysql 理解成https 就是连接Mysql 
    //localhost  理解成www.baidu.com
    //jdbcStudy 数据库名
    

    Connection

    Connection connection = DriverManager.getConnection(url, username, password);
    //connection 代表数据库
    //数据库设置自动提交connection.getAutoCommit();
    //事务提交connection.commit();
    //事务回滚connection.rollback();
    

    statement 执行SQL 的对象 prepareStatement

    statement用于向是数据库发送sql

    statement.executeQuery();//查询 返回ResultSet
    statement.executeUpdate();//更新 插入 删除 返回受影响的行数
    statement.execute();//SQL语句
    

    Resultset 查询的结果集

    resultSet.getString();
    resultSet.getFloat();
    resultSet.getInt();
    resultSet.getObject();//知道类的类型就使用指定类型
    
    resultSet.next();
    

    释放资源 不关耗资源

    resultSet.close();
    statement.close();
    connection.close();
    

    封装

    1. 编写配置

    2. 编写工具类

    3. 编写测试类

    文件结构

    image-20200614092625243

    db.properties(字符串不用加引号)

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

    工具类

    package cn.dj.www.lesson01;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    public class JdbcUtil {
        private static String driver=null;
        private static String url=null;
        private static String username=null;
        private static String password=null;
    
        static{
            try{
                //./ 表示上一级目录
                InputStream inputStream = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
                Properties properties = new Properties();
                properties.load(inputStream);
                driver=properties.getProperty("driver");
                url=properties.getProperty("url");
                username=properties.getProperty("username");
                password=properties.getProperty("password");
    
                //驱动只要加载一次
                Class.forName(driver);
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        //获取连接
        public static Connection getConnection() throws SQLException {
            return  DriverManager.getConnection(url, username, password);
        }
        //释放连接
        public static void release(Connection connection, Statement statement, ResultSet resultSet)  {
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    测试类

    package cn.dj.www.lesson01;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class Test {
        public static void main(String[] args) throws SQLException {
            Connection connection = JdbcUtil.getConnection();
            Statement statement = connection.createStatement();
            String name = "li%";//注意有''
            String sql = "SELECT * FROM users " +
                    "where name like '"+name+"'";
    
            ResultSet rs = statement.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString("name"));
                System.out.println(rs.getInt("id"));
            }
            JdbcUtil.release(connection,statement,rs);
    
        }
    
    }
    

    statement对象导致SQL注入

    典型例子

    String id = "1 or 1=1";
    String sql = "SELECT * FROM users " +"where id = "+id;
    

    prepareStatement

    更安全,效率更高

    package cn.dj.www.lesson01;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Date;
    
    public class PTest {
        public static void main(String[] args) {
            Connection conn = null;
            PreparedStatement pst =null;
            try {
                conn  = JdbcUtil.getConnection();
                String sql = "insert into users(id,`name`,`password`,`email`,`birthday`)"+
                       "values(?,?,?,?,?)";
                pst = conn.prepareStatement(sql);//预编译
                //传递参数
                pst.setInt(1,4);
                pst.setString(2,"DJ");
                pst.setString(3,"123456");
                pst.setString(4,"123@163.com");
                // java Date().getTime() 获得时间戳
                pst.setDate(5, new java.sql.Date(new Date().getTime()));
    
                int i = pst.executeUpdate();
                if(i>0){
                    System.out.println("插入成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                JdbcUtil.release(conn,pst,null);
            }
    
        }
    }
    

    解决1=1注入的例子

    //防止SQL注入的本质:把传递进来的参数当做字符就是外面再包了'',假设其中存在转移字符如(‘)就直接忽略了
    String name =" '' or 1=1";
    String sql = "SELECT * FROM users " +"where name = ?";
    pst.setString(1,name);        
    
  • 相关阅读:
    Theano入门笔记1:Theano中的Graph Structure
    [译博文]CUDA是什么
    一天一经典Efficient Estimation of Word Representations in Vector Space
    Generating a Random Sample from discrete probability distribution
    关于representation的理解
    git代码管理——克隆项目到本地仓库及上传本地项目到仓库
    yum管理——linux字符界面安装图形化及两种界面的切换(3)
    yum管理——yum常用配置(2)
    yum管理——搭建iso镜像私有yum源仓库(1)
    apche编译安装
  • 原文地址:https://www.cnblogs.com/10134dz/p/13150761.html
Copyright © 2011-2022 走看看