• Day23-JDBC


    Day23

    JDBC(重点)

    数据库驱动

    驱动:声卡、显卡、数据库

    在这里插入图片描述

    我们的程序会通过数据库驱动,和数据库打交道。

    JDBC

    • SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(java操作数据库的)规范,俗称JDBC

    • 这些规范的实现由具体的厂商去做

    • 对于开发人员来说,我们只需要掌握JDBC接口的操作即可!

    在这里插入图片描述

    需要导入两个包

    java.sql

    javax.sql

    还需要导入一个数据库驱动包 mysql-connector-java-5.1.47.jar(下载对应数据库版本)

    第一个JDBC程序

    1. 使用idea创建一个新的普通项目

    在这里插入图片描述

    1. 使用SQLyog

    创建数据库和其中的表

    -- 创建数据库
    CREATE DATABASE jdbcstudy CHARACTER SET utf8 COLLATE utf8_general_ci;
    
    USER jdbcstudy;
    -- 创建用户表
    CREATE TABLE users(
      `id` INT PRIMARY KEY,
      `name` VARCHAR(40),
      `password` VARCHAR(40),
      `email` VARCHAR(60),
      `birthday` DATE
    );
    -- 插入数据
    INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`)
    VALUES(1,'张三','123456','zs@sina.com','1980-12-04'),
    (2,'李四','123456','lisi@sina.com','1981-12-04'),
    (3,'王五','123456','wangwu@sina.com','1982-12-04');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 导入数据库驱动

    首先创建一个lib目录

    在这里插入图片描述

    复制mysql-connector-java-5.1.47.jar粘贴到该目录下

    在这里插入图片描述

    右键,添加到库里面

    在这里插入图片描述

    成功

    在这里插入图片描述

    1. 编写测试代码
    package com.ghy.lesson01;
    import com.sun.java.browser.plugin2.liveconnect.v1.Result;
    import java.sql.*;
    
    // 我的第一个JDBC程序
    public class JdbcFirstDemo {
        public static void main(String[] args) throws SQLException, ClassNotFoundException {
            //1. 加载驱动
            Class.forName("com.mysql.jdbc.Driver");//固定写法,加载驱动
            //2.用户信息和url
            /**
             * useUnicode=true   支持中文编码
             * characterEncoding=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 connection = DriverManager.getConnection(url,username,password);
    
            //4.执行SQL的对象
            Statement statement =connection.createStatement();
    
            //5.执行SQL的对象去执行SQL,可能存在结果,查看返回结果
            String sql = "SELECT * FROM users";//sql语句
            ResultSet resultSet =statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部的查询出来的结果
            //输出查询的结果,要一一对应
            while(resultSet.next()){
                System.out.println("id=" + resultSet.getObject("id"));
                System.out.println("name=" + resultSet.getObject("name"));
                System.out.println("password=" + resultSet.getObject("password"));
                System.out.println("email=" + resultSet.getObject("email"));
                System.out.println("birthday=" + resultSet.getObject("birthday"));
            }
    
            //6.释放连接
            resultSet.close();
            statement.close();
            connection.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    测试成功输出

    id=1
    name=张三
    password=123456
    email=zs@sina.com
    birthday=1980-12-04
    id=2
    name=李四
    password=123456
    email=lisi@sina.com
    birthday=1981-12-04
    id=3
    name=王五
    password=123456
    email=wangwu@sina.com
    birthday=1982-12-04
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    JDBC中对象解释

    DriverManager

    //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    //推荐这种写法加载驱动
    Class.forName("com.mysql.jdbc.Driver");
    
    Connection connection = DriverManager.getConnection(url, userName, passWord);
    // connection代表数据库
    connection.setAutoCommit(true);// 数据库设置自动提交
    connection.commit();// 事务提交
    connection.rollback();// 事务回滚
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    URL

    String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
    
    // mysql默认端口3306
    // jdbc:mysql(协议)://主机地址:端口号/数据库名?参数1&参数2&参数3
    
    // oracle默认端口1521
    // jdbc:oracle:thin:@localhost:1521:sid
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Statement执行SQL的对象 PreparedStatement 执行SQL对象

    String sql = "SELECT * FROM users";//编写SQL
    
    statement.executeQuery();//执行查询 返回ResultSet
    statement.executeUpdate();//执行更新,新增,删除,修改,都用这个,返回受影响的行数
    statement.execute();//执行任何SQL
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ResultSet 查询的结果集,封装了所有的查询结果

    • 获得指定的数据类型
    //在不知道列类型的情况下使用
    resultSet.getObject();
    //知道列类型的情况下使用指定的类型
    resultSet.getString();
    resultSet.getInt();
    resultSet.getDouble();
    resultSet.getBigDecimal();
    resultSet.getFloat();
    resultSet.getDate();
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 遍历,指针
    resultSet.beforeFirst();//移动到最前面
    resultSet.afterLast();//移动到最后面
    resultSet.next();//移动到下一个数据
    resultSet.previous();//移动到前一行
    resultSet.absolute(row);//移动到指定行
    
    • 1
    • 2
    • 3
    • 4
    • 5

    释放资源(必须做)

    resultSet.close();
    statement.close();
    connection.close();//消耗资源
    
    • 1
    • 2
    • 3

    statement对象

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

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

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

    CRUD操作 create

    使用executeUpdate(String sql)方法完成数据添加操作,示例操作:

    Statement st = connection.createStatement();
    String sql = "insert into user(...) values(...)";
    int num = st.executeUpdate(sql);
    if (num > 0) {
        System.out.println("插入成功!!!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    CRUD操作-delete

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

    Statement st = connection.createStatement();
    String sql = "delete from user where id=1";
    int num = st.executeUpdate(sql);
    if (num > 0) {
        System.out.println("删除成功!!!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    CRUD操作-update

    使用executeUpdate(String sql)方法完成数据修改操作,示例操作:

    Statement st = connection.createStatement();
    String sql = "update user set name='' where name =''";
    int num = st.executeUpdate(sql);
    if (num > 0) {
        System.out.println("修改成功!!!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    CRUD操作-read

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

    Statement st = connection.createStatement();
    String sql = "SELECT * FROM users";
    ResultSet resultSet = st.executeQuery(sql);
    while (resultSet.next()) {
        //根据获取列的数据类型,分别调用resultSet的相应方法映射到java对象中
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代码实现

    • 配置文件
    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
    username=root
    password=123456
    
    • 1
    • 2
    • 3
    • 4
    • 工具类
    package com.ghy.lesson02.utils;
    
    import javax.xml.transform.Result;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.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 pro=new Properties();
                pro.load(in);
    
               driver = pro.getProperty("driver");
               url = pro.getProperty("url");
               username = pro.getProperty("username");
               password = pro.getProperty("password");
    
               //1.驱动只用加载一次
                Class.forName(driver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        //获取连接
        public static Connection getConnection() throws SQLException{
            return DriverManager.getConnection(url,username,password);
        }
    
        //释放连接资源
        public static void release(Connection conn, Statement st, ResultSet rs){
            if(rs!=null){
                try{
                    rs.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
    
            if(st!=null){
                try{
                    st.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try{
                    conn.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • Insert
    package com.ghy.lesson02;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class TestInsert {
        public static void main(String[] args) throws SQLException {
            Connection conn=null;
            Statement st=null;
            ResultSet rs=null;
            //利用工具类获取连接
            try{
                conn = JdbcUtils.getConnection();//获取数据库连接
                st =conn.createStatement();//获得SQL的执行对象
                String sql="INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`)" +
                        "VALUES(5,'小赵','123456','xiaozhao@qq.com','2022-12-04')";//sql语句,主键不能重复,不然会报错
                int i=st.executeUpdate(sql);
                //if判断影响行数,大于0说明成功
                if(i>0){
                    System.out.println("插入成功!!!");
                }
            }catch(SQLException e){
                e.printStackTrace();
            }finally{
                //释放资源
                JdbcUtils.release(conn,st,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    输出

    在这里插入图片描述

    查看

    在这里插入图片描述

    • Delete
    package com.ghy.lesson02;
    
    import com.ghy.lesson02.utils.JdbcUtils;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class TestDelete {
        public static void main(String[] args) {
            Connection conn=null;
            Statement st=null;
            ResultSet rs=null;
            //利用工具类获取连接
            try{
                conn = JdbcUtils.getConnection();//获取数据库连接
                st =conn.createStatement();//获得SQL的执行对象
                String sql="DELETE FROM users WHERE id =4";//sql语句
                int i=st.executeUpdate(sql);
                //if判断影响行数,大于0说明成功
                if(i>0){
                    System.out.println("删除成功!!!");
                }
            }catch(SQLException e){
                e.printStackTrace();
            }finally{
                //释放资源
                JdbcUtils.release(conn,st,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    输出

    在这里插入图片描述

    查看

    在这里插入图片描述

    • Update
    package com.ghy.lesson02;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class TestUpdate {
        public static void main(String[] args) {
            Connection conn=null;
            Statement st=null;
            ResultSet rs=null;
            //利用工具类获取连接
            try{
                conn = JdbcUtils.getConnection();//获取数据库连接
                st =conn.createStatement();//获得SQL的执行对象
                String sql="UPDATE users SET `name`='小龚',`email`='xiaogong@qq.com' WHERE id=3";//sql语句
                int i=st.executeUpdate(sql);
                //if判断影响行数,大于0说明成功
                if(i>0){
                    System.out.println("修改成功!!!");
                }
            }catch(SQLException e){
                e.printStackTrace();
            }finally{
                //释放资源
                JdbcUtils.release(conn,st,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    输出

    在这里插入图片描述

    查看

    在这里插入图片描述

    • Select
    package com.ghy.lesson02;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class TestSelect {
        public static void main(String[] args) {
            Connection conn=null;
            Statement st=null;
            ResultSet rs=null;
    
            try{
                conn = JdbcUtils.getConnection();
                st =conn.createStatement();
                //SQL
                String sql ="SELECT * FROM users WHERE id =5";
                rs = st.executeQuery(sql);//查询完毕会返回有个结果集
                if(rs.next()){
                    System.out.println(rs.getString("name"));
                }
            }catch(SQLException e){
                e.printStackTrace();
            }finally {
                JdbcUtils.release(conn,st,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    输出

    在这里插入图片描述

    SQL注入问题

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

    • 正确输入
    package com.ghy.lesson02;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class SQL注入 {
        public static void main(String[] args) {
            login("小赵","123456");
        }
        //登录业务
        public static void login(String username,String password){
            Connection conn=null;
            Statement st=null;
            ResultSet rs=null;
    
            try{
                conn = JdbcUtils.getConnection();
                st =conn.createStatement();
                //SQL
                //SELECT * FROM users WHERE `name` = '小赵' AND `password` = '123456'
                String sql ="SELECT * FROM users WHERE `name` = '"+username+"' AND `password` = '"+password+"'";
                rs = st.executeQuery(sql);//查询完毕会返回有个结果集
                while(rs.next()){
                    System.out.println(rs.getString("name"));
                    System.out.println(rs.getString("password"));
                }
            }catch(SQLException e){
                e.printStackTrace();
            }finally {
                JdbcUtils.release(conn,st,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    输出

    在这里插入图片描述

    • 错误输入
    package com.ghy.lesson02;
    
    import com.ghy.lesson02.utils.JdbcUtils;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class SQL注入 {
        public static void main(String[] args) {
            login(" 'or ' 1=1"," ' or '1=1");
        }
        //登录业务
        public static void login(String username,String password){
            Connection conn=null;
            Statement st=null;
            ResultSet rs=null;
    
            try{
                conn = JdbcUtils.getConnection();
                st =conn.createStatement();
                //SQL
                //SELECT * FROM users WHERE `name` = '小赵' AND `password` = '123456'
                String sql ="SELECT * FROM users WHERE `name` = '"+username+"' AND `password` = '"+password+"'";
                rs = st.executeQuery(sql);//查询完毕会返回有个结果集
                while(rs.next()){
                    System.out.println(rs.getString("name"));
                    System.out.println(rs.getString("password"));
                }
            }catch(SQLException e){
                e.printStackTrace();
            }finally {
                JdbcUtils.release(conn,st,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    输出

    在这里插入图片描述

    PreparedStatement对象

    • Insert
    package com.ghy.lesson03;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.*;
    public class TestInsert {
        public static void main(String[] args) {
            Connection conn=null;
            PreparedStatement pst=null;
            ResultSet rs=null;
    
            try {
                conn = JdbcUtils.getConnection();
    
                //区别
                //可以使用问号代替参数
                String sql="INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`) VALUES(?,?,?,?,?)";
    
                pst = conn.prepareStatement(sql);//预编译,先写SQL然后不执行
    
                // 手动给参数赋值
                pst.setInt(1,6);
                pst.setString(2,"中赵");
                pst.setString(3,"123456");
                pst.setString(4,"zhongzhao@qq.com");
                //注意点:sql.Date   数据库  最后通过java.sql.Date转换
                //util.Date   Java   new Date().getTime()获得时间戳
                pst.setDate(5,new java.sql.Date(new java.util.Date().getTime()));
    
                //执行SQL
                int i=pst.executeUpdate();//没有传参
                if(i>0){
                    System.out.println("插入成功!!!");
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                JdbcUtils.release(conn,pst,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    输出

    在这里插入图片描述

    查看

    在这里插入图片描述

    • Delete
    package com.ghy.lesson03;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class TestDelete {
        public static void main(String[] args) {
            Connection conn=null;
            PreparedStatement pst=null;
            ResultSet rs=null;
    
            try {
                conn = JdbcUtils.getConnection();
    
                //区别
                //可以使用问号代替参数
                String sql="DELETE FROM `users` WHERE `id`=?";
    
                pst = conn.prepareStatement(sql);//预编译,先写SQL然后不执行
    
                // 手动给参数赋值
                pst.setInt(1,6);
    
                //执行SQL
                int i=pst.executeUpdate();//没有传参
                if(i>0){
                    System.out.println("删除成功!!!");
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                JdbcUtils.release(conn,pst,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    输出

    在这里插入图片描述

    查看

    在这里插入图片描述

    • Update
    package com.ghy.lesson03;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class TestUpdate {
        public static void main(String[] args) {
            Connection conn=null;
            PreparedStatement pst=null;
            ResultSet rs=null;
    
            try {
                conn = JdbcUtils.getConnection();
    
                //区别
                //可以使用问号代替参数
                String sql="UPDATE users SET `password`=? WHERE id=?";
    
                pst = conn.prepareStatement(sql);//预编译,先写SQL然后不执行
    
                // 手动给参数赋值
                pst.setString(1,"654321");
                pst.setInt(2,5);
    
                //执行SQL
                int i=pst.executeUpdate();//没有传参
                if(i>0){
                    System.out.println("修改成功!!!");
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                JdbcUtils.release(conn,pst,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    输出

    在这里插入图片描述

    查看

    在这里插入图片描述

    • Select
    package com.ghy.lesson03;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class TestSelect {
        public static void main(String[] args) {
            Connection conn=null;
            PreparedStatement pst=null;
            ResultSet rs=null;
            try {
                conn =JdbcUtils.getConnection();
                String sql="select * from users where id=?";
                pst = conn.prepareStatement(sql);
                pst.setInt(1,5);//传递参数
                rs = pst.executeQuery();//执行,获取返回值
    
                if(rs.next()){
                    System.out.println(rs.getString("name"));//输出名字
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            finally {
                JdbcUtils.release(conn,pst,rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    输出

    在这里插入图片描述

    PreparedStatement防止了SQL注入

    • 正确输入
    package com.ghy.lesson03;
    import com.ghy.lesson02.utils.JdbcUtils;
    import java.sql.*;
    public class SQL注入 {
        public static void main(String[] args) {
            login("小赵","654321");
            //login(" 'or ' 1=1"," ' or '1=1");
        }
        //登录业务
        public static void login(String userName, String password) {
            Connection conn = null;
            PreparedStatement st = null;
            ResultSet rs = null;
            try {
                conn = JdbcUtils.getConnection();
                // PreparedStatement 防止SQL注入的本质,把传递进来的参数当做字符
                // 假设其中存在转义字符,比如说'会被直接转义
                String sql = "SELECT * FROM users WHERE `name`=? AND `password`=?";
                st = conn.prepareStatement(sql);
                st.setString(1, userName);
                st.setString(2, password);
                rs = st.executeQuery();
                while (rs.next()) {
                    System.out.println(rs.getString("name"));
                    System.out.println(rs.getString("password"));
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtils.release(conn, st, rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    输出

    在这里插入图片描述

    • 拼接字符串
    package com.ghy.lesson03;
    
    import com.ghy.lesson02.utils.JdbcUtils;
    
    import java.sql.*;
    
    public class SQL注入 {
        public static void main(String[] args) {
            //login("小赵","654321");
            login(" 'or ' 1=1"," ' or '1=1");
        }
        //登录业务
        public static void login(String userName, String password) {
            Connection conn = null;
            PreparedStatement st = null;
            ResultSet rs = null;
            try {
                conn = JdbcUtils.getConnection();
                // PreparedStatement 防止SQL注入的本质,把传递进来的参数当做字符
                // 假设其中存在转义字符,比如说'会被直接转义
                String sql = "SELECT * FROM users WHERE `name`=? AND `password`=?";
                st = conn.prepareStatement(sql);
                st.setString(1, userName);
                st.setString(2, password);
                rs = st.executeQuery();
                while (rs.next()) {
                    System.out.println(rs.getString("name"));
                    System.out.println(rs.getString("password"));
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtils.release(conn, st, rs);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    输出

    在这里插入图片描述

    没有输出

    PreparedStatement防止了SQL注入的本质:把传递进来的参数当作字符。

    *** 假设其中存在转义字符,就直接忽略,比如数引号就会被直接转义***

    使用idea连接数据库

    1. 打开DB

    在这里插入图片描述

    1. 选择MySQL

    在这里插入图片描述

    1. 登录

    在这里插入图片描述

    1. 连接成功

    在这里插入图片描述

    在这里插入图片描述

    1. 编写SQL代码

    在这里插入图片描述

    1. 创建数据库
    CREATE TABLE account(
        id Int PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(40),
        money FLOAT
    );
    
    /*插入测试数据*/
    insert into account(name,money) values('A',1000);
    insert into account(name,money) values('B',1000);
    insert into account(name,money) values('C',1000);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    使用idea连接数据库出现的问题

    找不到Database

    解决办法:

    可能缺失插件,下载插件

    1. 找到设置

    在这里插入图片描述

    1. 下载插件

    在这里插入图片描述

    IDEA连接Mysql时候报错 The server time zone value ‘�й���׼ʱ��‘ is unrecognized or represents

    1. 用命令行进入数据库

    在这里插入图片描述

    1. 输入set global time_zone=‘+0:00’;

    在这里插入图片描述

    1. 然后就可以连接成功了
  • 相关阅读:
    玻色量子入选2022年北京市科协“企业创新联合体”建设支持名单
    游戏寻路算法:A星算法
    科技的成就(二十七)
    “摸鱼”就能得出设计灵感?他的经验分享得看
    机器学习中的无监督学习是什么?
    学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)
    MATLAB算法实战应用案例精讲-【图像处理】Transformer
    1.1 安装配置CentOS
    token的使用
    CF750C (1600)
  • 原文地址:https://blog.csdn.net/GHY0911/article/details/126169090