Anmerkungen zur JDBC-Studie 02 [Detaillierte ResultSet-Klasse, JDBC-Anmeldefallübungen, Detaillierte PreparedStatement-Klasse]

  1. Anmerkungen zur JDBC-Studie 01 [Schnellstart von JDBC, detaillierte Erläuterung der JDBC-Klassen, CRUD-Praxis von JDBC]
  2. Anmerkungen zur JDBC-Studie 02 [Detaillierte ResultSet-Klasse, JDBC-Anmeldefallübungen, Detaillierte PreparedStatement-Klasse]
  3. JDBC-Studiennotizen 03 [JDBC-Transaktionsverwaltung, Datenbankverbindungspool, JDBCTemplate]

Inhaltsverzeichnis

04 Detaillierte ResultSet-Klasse

Detaillierte Erläuterung der grundlegenden Verwendung der JDBC-Klassen _ResultSet_

Detaillierte JDBC-Klasse _ResultSet_ Traversal

05 JDBC-Anmeldefallübung

JDBC-Praxis _select-Anweisung

Emp.java // JavaBean, die Emp-Tabellendaten kapselt

JDBCDemo8.java

JDBC-Tools

JDBC-Praxis_Login-Fall

06 Detaillierte Erläuterung der PreparedStatement-Klasse

Detaillierte Erläuterung jeder Klasse von JDBC_PreparedStatement

Login-Fall - Lösen Sie das SQL-Injection-Problem


04 Detaillierte ResultSet-Klasse

Detaillierte Erläuterung der grundlegenden Verwendung der JDBC-Klassen _ResultSet_

4. ResultSet: Ergebnismengenobjekt, Abfrageergebnis kapseln
        * boolean next (): Bewegen Sie den Cursor eine Zeile nach unten, um festzustellen, ob die aktuelle Zeile das Ende der letzten Zeile ist (ob Daten vorhanden sind). Wenn dies der Fall ist, wird false zurückgegeben Wenn nicht, wird true zurückgegeben.
        * getXxx (Parameter): Daten
            abrufen * Xxx: Repräsentiert den Datentyp wie: int getInt (), String getString ()
            * Parameter:
                1. int: repräsentiert die Nummer der Spalte ab 1, wie zum Beispiel: getString ( 1)
                2. Zeichenfolge: Stellt den Spaltennamen dar, z. B.: GetDouble ("balance")

  

package cn.itcast.jdbc;

import java.sql.*;

/**
 * 执行DDL语句
 */
public class JDBCDemo6 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
            //3.定义sql
            String sql = "select * from account";
            //4.获取执行sql对象
            stmt = conn.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.处理结果
            //6.1 让游标向下移动一行
            rs.next();
            //6.2 获取数据
            int id = rs.getInt(1);
            String name = rs.getString("name");
            double balance = rs.getDouble(3);
            System.out.println(id + "---" + name + "---" + balance);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Detaillierte JDBC-Klasse _ResultSet_ Traversal

4. ResultSet: Ergebnismengenobjekt, das Abfrageergebnisse einkapselt
        * boolean next (): Bewegen Sie den Cursor eine Zeile nach unten, um festzustellen, ob die aktuelle Zeile das Ende der letzten Zeile ist (ob Daten vorhanden sind). Wenn dies der Fall ist, wird false zurückgegeben Wenn dies nicht der Fall ist, wird true zurückgegeben.
        * getXxx (Parameter): Daten
            abrufen * Xxx: repräsentiert den Datentyp, wie zum Beispiel: int getInt (), String getString ()
            * Parameter:
                1. int: repräsentiert die Nummer der Spalte, beginnend mit 1, wie zum Beispiel: getString (1)
                2. Zeichenfolge: Repräsentiert den Spaltennamen. Zum Beispiel: getDouble ("balance")
        
        * Hinweis:
            * Schritte:
                1. Bewegen Sie den Cursor eine Zeile nach unten.
                2. Stellen Sie fest, ob Daten vorhanden sind.
                3. Holen Sie sich Daten

               //6.1 Die Schleife bestimmt, ob sich der Cursor am Ende der letzten Zeile befindet.
                while (rs.next ()) {                     //6.2 Daten abrufen                     int id = rs.getInt (1);                     String name = rs.getString ("name");                     double balance = rs.getDouble (3);                     System.out. println (id + "---" + name + "---" + balance);                 }





Fehlercode:

package cn.itcast.jdbc;

import java.sql.*;

/**
 * 执行DDL语句
 */
public class JDBCDemo6 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
            //3.定义sql
            String sql = "select * from account";
            //4.获取执行sql对象
            stmt = conn.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.处理结果
            //6.1 让游标向下移动一行
            rs.next();
            //6.2 获取数据
            int id = rs.getInt(1);
            String name = rs.getString("name");
            double balance = rs.getDouble(3);
            System.out.println(id + "---" + name + "---" + balance);

            //6.1 让游标向下移动一行
            rs.next();
            //6.2 获取数据
            int id2 = rs.getInt(1);
            String name2 = rs.getString("name");
            double balance2 = rs.getDouble(3);
            System.out.println(id2 + "---" + name2 + "---" + balance2);

            //6.1 让游标向下移动一行
            rs.next();
            //6.2 获取数据
            int id3 = rs.getInt(1);
            String name3 = rs.getString("name");
            double balance3 = rs.getDouble(3);
            System.out.println(id3 + "---" + name3 + "---" + balance3);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

package cn.itcast.jdbc;

import java.sql.*;

/**
 * 执行DDL语句
 */
public class JDBCDemo7 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
            //3.定义sql
            String sql = "select * from account";
            //4.获取执行sql对象
            stmt = conn.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.处理结果
            //6.1 循环判断游标是否是最后一行末尾。
            while (rs.next()) {
                //6.2 获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                double balance = rs.getDouble(3);
                System.out.println(id + "---" + name + "---" + balance);
            }

           /* //6.1 让游标向下移动一行
            if(rs.next()){
                //判断是否有数据
                //6.2 获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                double balance = rs.getDouble(3);
                System.out.println(id + "---" + name + "---" + balance);
            }

            //6.1 让游标向下移动一行
            if(rs.next()){
                //判断是否有数据
                //6.2 获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                double balance = rs.getDouble(3);
                System.out.println(id + "---" + name + "---" + balance);
            }

            //6.1 让游标向下移动一行
            if(rs.next()){
                //判断是否有数据
                //6.2 获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                double balance = rs.getDouble(3);
                System.out.println(id + "---" + name + "---" + balance);
            }

            //6.1 让游标向下移动一行
            if(rs.next()){
                //判断是否有数据
                //6.2 获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                double balance = rs.getDouble(3);

                System.out.println(id + "---" + name + "---" + balance);
            }*/

          /*  //6.1 让游标向下移动一行
            rs.next();
            //6.2 获取数据
            int id2 = rs.getInt(1);
            String name2 = rs.getString("name");
            double balance2 = rs.getDouble(3);
            System.out.println(id2 + "---" + name2 + "---" + balance2);

            //6.1 让游标向下移动一行
            rs.next();
            //6.2 获取数据
            int id3 = rs.getInt(1);
            String name3 = rs.getString("name");
            double balance3 = rs.getDouble(3);
            System.out.println(id3 + "---" + name3 + "---" + balance3);*/
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

05 JDBC-Anmeldefallübung

JDBC-Praxis _select-Anweisung

4. ResultSet: Ergebnismengenobjekt, das Abfrageergebnisse einkapselt
        * boolean next (): Bewegen Sie den Cursor eine Zeile nach unten, um festzustellen, ob die aktuelle Zeile das Ende der letzten Zeile ist (ob Daten vorhanden sind). Wenn dies der Fall ist, wird false zurückgegeben Wenn dies nicht der Fall ist, wird true zurückgegeben.
        * getXxx (Parameter): Daten
            abrufen * Xxx: repräsentiert den Datentyp, wie zum Beispiel: int getInt (), String getString ()
            * Parameter:
                1. int: repräsentiert die Nummer der Spalte, beginnend mit 1, wie zum Beispiel: getString (1)
                2. Zeichenfolge: Repräsentiert den Spaltennamen. Zum Beispiel: getDouble ("balance")
        
        * Hinweis:
            * Schritte:
                1. Bewegen Sie den Cursor eine Zeile nach unten.
                2. Stellen Sie fest, ob Daten vorhanden sind.
                3. Holen Sie sich Daten

               //6.1 Die Schleife bestimmt, ob sich der Cursor am Ende der letzten Zeile befindet.
                while (rs.next ()) {                     //6.2 Daten abrufen                     int id = rs.getInt (1);                     String name = rs.getString ("name");                     double balance = rs.getDouble (3);                     System.out. println (id + "---" + name + "---" + balance);                 }





        * Übung:
            * Definieren Sie eine Methode, fragen Sie die Daten der emp-Tabelle ab und kapseln Sie sie als Objekt. Laden Sie dann die Sammlung und geben Sie sie zurück.
                1. Definieren Sie die Emp-Klasse.
                2. Definieren Sie die Methode public List <Emp> findAll () {}.
                3. Implementieren Sie die Methode select * from emp.

  

  

Emp.java // JavaBean, die Emp-Tabellendaten kapselt

package cn.itcast.domain;

import java.util.Date;

/**
 * 封装Emp表数据的JavaBean
 */
public class Emp {
    private int id;
    private String ename;
    private int job_id;
    private int mgr;
    private Date joindate;
    private double salary;
    private double bonus;
    private int dept_id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public int getJob_id() {
        return job_id;
    }

    public void setJob_id(int job_id) {
        this.job_id = job_id;
    }

    public int getMgr() {
        return mgr;
    }

    public void setMgr(int mgr) {
        this.mgr = mgr;
    }

    public Date getJoindate() {
        return joindate;
    }

    public void setJoindate(Date joindate) {
        this.joindate = joindate;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public int getDept_id() {
        return dept_id;
    }

    public void setDept_id(int dept_id) {
        this.dept_id = dept_id;
    }

    public double getBonus() {
        return bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", ename='" + ename + '\'' +
                ", job_id=" + job_id +
                ", mgr=" + mgr +
                ", joindate=" + joindate +
                ", salary=" + salary +
                ", bonus=" + bonus +
                ", dept_id=" + dept_id +
                '}';
    }
}

JDBCDemo8.java

package cn.itcast.jdbc;

import cn.itcast.domain.Emp;
import cn.itcast.util.JDBCUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
 */
public class JDBCDemo8 {

    public static void main(String[] args) {
        List<Emp> list = new JDBCDemo8().findAll();
        System.out.println(list);
        System.out.println(list.size());
        for (Emp x : list) {
            System.out.println(x);
        }
    }

    /**
     * 查询所有emp对象
     *
     * @return
     */
    public List<Emp> findAll() {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Emp> list = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
            //3.定义sql
            String sql = "select * from emp";
            //4.获取执行sql的对象
            stmt = conn.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.遍历结果集,封装对象,装载集合
            Emp emp = null;
            list = new ArrayList<Emp>();
            while (rs.next()) {
                //获取数据
                int id = rs.getInt("id");
                String ename = rs.getString("ename");
                int job_id = rs.getInt("job_id");
                int mgr = rs.getInt("mgr");
                Date joindate = rs.getDate("joindate");
                double salary = rs.getDouble("salary");
                double bonus = rs.getDouble("bonus");
                int dept_id = rs.getInt("dept_id");
                // 创建emp对象,并赋值
                emp = new Emp();
                emp.setId(id);
                emp.setEname(ename);
                emp.setJob_id(job_id);
                emp.setMgr(mgr);
                emp.setJoindate(joindate);
                emp.setSalary(salary);
                emp.setBonus(bonus);
                emp.setDept_id(dept_id);
                //装载集合
                list.add(emp);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }

}

JDBC-Tools

Extrahieren Sie die JDBC-Toolklasse: JDBCUtils

* Zweck: Vereinfachen Sie das Schreiben
* Analyse:
    1. Registrieren Sie den Treiber und extrahieren Sie ihn.
    2. Extrahieren Sie eine Methode, um das Verbindungsobjekt zu erhalten.
        * Anforderungen: Sie möchten keine Parameter (Probleme) übergeben, sondern auch die Universalität der Tools sicherstellen.
        * Lösung: Konfigurationsdatei
            jdbc.properties
                url = ...
                user = ...
                password = ...

    3. Extrahieren Sie eine Methode zum Freigeben von Ressourcen.
        * Code-Implementierung: ...

  

Java19-day10 [Standardeingabe- und Ausgabestream, Bytezeichen-Druckdatenstrom, Objektserialisierungs-Deserialisierungsdatenstrom, serialVersionUID & transient, Eigenschaften]

Einführung

  • Es ist eine Sammlungsklasse des Kartensystems.
  • Eigenschaften können im Stream gespeichert oder aus dem Stream geladen werden.
  • Jeder Schlüssel und sein entsprechender Wert in der Attributliste ist eine Zeichenfolge.

 

  

package cn.itcast.util;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具类
 */
public class JDBCUtils {

    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    /**
     * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
     * 静态代码块,随着类的加载而执行(只会执行一次)
     */
    static {
        //读取资源文件,获取值。
        try {
            //1. 创建Properties集合类。
            Properties pro = new Properties();
            //获取src路径下的文件的方式--->ClassLoader 类加载器:加载字节码文件进内存、获取src下资源文件的路径
            //获取ClassLoader要先获取其对应的字节码文件对象
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            //以src为相对的根路径 统一资源定位符URL
            URL res = classLoader.getResource("jdbc.properties"); // 传文件名,获取resource资源
            String path = res.getPath();
            // System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties
            //2. 加载文件
            // pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));
            pro.load(new FileReader(path));
            //3. 获取数据,赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //4. 注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     *
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

    /**
     * 释放资源
     *
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 释放资源
     *
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

JDBC-Praxis_Login-Fall

* Übung:
    * Anforderungen:
        1. Geben Sie den Benutzernamen und das Passwort über die Tastatur ein
        . 2. Stellen Sie fest, ob sich der Benutzer erfolgreich angemeldet hat.
            * Wählen Sie * aus dem Benutzer aus, bei dem Benutzername = "" und Passwort = "";
            * Wenn der SQL-Code vorhanden ist ein Abfrageergebnis, es wird erfolgreich sein, andernfalls schlägt es fehl

    * Schritte:
        1. Erstellen Sie den Datenbanktabellenbenutzer
            CREATE TABLE USER (
                ID INT PRIMARY KEY AUTO_INCREMENT,
                Benutzername VARCHAR (32),
                PASSWORD VARCHAR (32)
            );

            INSERT IN USER VALUES (NULL, 'zhangsan', '123');
            IN BENUTZERWERTE EINFÜGEN (NULL, 'lisi', '234');

        2. Code-Implementierung: ...

package cn.itcast.jdbc;

import cn.itcast.util.JDBCUtils;

import java.sql.*;
import java.util.Scanner;

/**
 * 练习:
 * * 需求:
 * 1. 通过键盘录入用户名和密码
 * 2. 判断用户是否登录成功
 */
public class JDBCDemo9 {

    public static void main(String[] args) {
        //1.键盘录入,接受用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();
        //2.调用方法 非静态方法,需要创建对象来调用
        boolean flag = new JDBCDemo9().login(username, password);
        //3.判断结果,输出不同语句
        if (flag) {
            //登录成功
            System.out.println("登录成功!");
        } else {
            System.out.println("用户名或密码错误!");
        }
    }

    /**
     * 登录方法
     */
    public boolean login(String username, String password) {
        if (username == null || password == null) {
            return false;
        }
        //连接数据库判断是否登录成功
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        //1.获取连接
        try {
            conn = JDBCUtils.getConnection();
            //2.定义sql
            String sql = "select * from user where username = '" + username + "' and password = '" + password + "' ";
            System.out.println(sql);
            //3.获取执行sql的对象
            stmt = conn.createStatement();
            //4.执行查询
            rs = stmt.executeQuery(sql);
            //5.判断
           /* if(rs.next()){//如果有下一行,则返回true
                return true;
            }else{
                return false;
            }*/
            return rs.next();//如果有下一行,则返回true
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, conn);
        }
        return false;
    }

}

06 Detaillierte Erläuterung der PreparedStatement-Klasse

Detaillierte Erläuterung jeder Klasse von JDBC_PreparedStatement

5. PreparedStatement: Das Objekt, das SQL ausführt.
        1. SQL-Injection-Problem: Beim Spleißen von SQL sind einige spezielle Schlüsselwörter von SQL am Spleißen von Zeichenfolgen beteiligt, was zu Sicherheitsproblemen führt.
            1. Geben Sie den Benutzer beiläufig ein, geben Sie das Passwort ein:
            a'or'a ' =' a 2. sql: Wählen Sie * vom Benutzer aus, wobei Benutzername = 'fhdsjkf' und Passwort = 'a' oder ' a ' = 'a' 

        2. Lösen Sie das SQL-Injection-Problem: Verwenden Sie das PreparedStatement-Objekt, um es zu lösen.
        3. Precompiled SQL: Parameter verwenden? Als Platzhalter.
        4. Schritte:
            1. Importieren Sie das Treiber-JAR-Paket mysql-connector-java-5.1.37-bin.jar.
            2. Registrieren Sie sich der Treiber
            3. Holen Sie sich das Datenbankverbindungsobjekt Verbindung
            4. Definieren Sie SQL
                * Hinweis: Was sind die Parameter von SQL? Als Platzhalter, z.
            B.: Wählen Sie * vom Benutzer aus, wobei Benutzername =? Und Kennwort = ?; 5. Rufen Sie das Objekt PreparedStatement Connection.prepareStatement (String sql) zum Ausführen der SQL-Anweisung ab. 
            6. Geben Sie? Zuordnung:
                * Methode: setXxx (Parameter 1, Parameter 2)
                    * Parameter 1:? Die Positionsnummer beginnt bei 1
                    * Parameter 2:? Der Wert
            7. Führen Sie SQL aus, akzeptieren Sie das zurückgegebene Ergebnis, müssen Sie die SQL-Anweisung nicht übergeben.
            8. Verarbeiten Sie das Ergebnis.
            9. Geben Sie Ressourcen frei

        5. Hinweis: PreparedStatement wird in einem späteren Zeitraum verwendet, um alle Vorgänge zum Hinzufügen, Löschen, Ändern und Überprüfen abzuschließen.
            1. Kann die SQL-Injection verhindern.
            2. Effizienter

  

Login-Fall - Lösen Sie das SQL-Injection-Problem

package cn.itcast.jdbc;

import cn.itcast.util.JDBCUtils;

import java.sql.*;
import java.util.Scanner;

/**
 * 练习:
 * * 需求:
 * 1. 通过键盘录入用户名和密码
 * 2. 判断用户是否登录成功
 */
public class JDBCDemo9 {

    public static void main(String[] args) {
        //1.键盘录入,接受用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();
        //2.调用方法 非静态方法,需要创建对象来调用
        boolean flag = new JDBCDemo9().login(username, password);
        //3.判断结果,输出不同语句
        if (flag) {
            //登录成功
            System.out.println("登录成功!");
        } else {
            System.out.println("用户名或密码错误!");
        }
    }

    /**
     * 登录方法
     */
    public boolean login(String username, String password) {
        if (username == null || password == null) {
            return false;
        }
        //连接数据库判断是否登录成功
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        //1.获取连接
        try {
            conn = JDBCUtils.getConnection();
            //2.定义sql
            String sql = "select * from user where username = '" + username + "' and password = '" + password + "' ";
            System.out.println(sql);
            //3.获取执行sql的对象
            stmt = conn.createStatement();
            //4.执行查询
            rs = stmt.executeQuery(sql);
            //5.判断
           /* if(rs.next()){//如果有下一行,则返回true
                return true;
            }else{
                return false;
            }*/
            return rs.next();//如果有下一行,则返回true
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, conn);
        }
        return false;
    }

    /**
     * 登录方法,使用PreparedStatement实现
     */
    public boolean login2(String username, String password) {
        if (username == null || password == null) {
            return false;
        }
        //连接数据库判断是否登录成功
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        //1.获取连接
        try {
            conn = JDBCUtils.getConnection();
            //2.定义sql
            String sql = "select * from user where username = ? and password = ?";
            //3.获取执行sql的对象
            pstmt = conn.prepareStatement(sql);
            //给?赋值
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            //4.执行查询,不需要传递sql
            rs = pstmt.executeQuery();
            //5.判断
           /* if(rs.next()){//如果有下一行,则返回true
                return true;
            }else{
                return false;
            }*/
            return rs.next();//如果有下一行,则返回true
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, pstmt, conn);
        }
        return false;
    }

}

Komm schon, komm schon, komm schon, ich würde lieber sterben als brechen ~~~

Ich denke du magst

Origin blog.csdn.net/weixin_44949135/article/details/113708612
Empfohlen
Rangfolge