• JDBC中对象的解释和statement对象详解


    DriverManager

            推荐使用 Class.forName("com.mysql.jdbc.Driver");​编写加载驱动(固定写法)

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

    URL

    • mysql默认端口3306
    • 协议://主机地址:端口号/数据库名?参数1&参数2&参数3
    • oracle默认端口1521
    • jdbc:oracle:thin:@localhost:1521:sid
    1. //2.用户信息和url
    2. //useUnicode=true 支持中文编码
    3. //&charactEncoding=utf8 设定它的中文字符集
    4. //&useSSL=true 使用安全连接
    5. String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&charactEncoding=utf8&useSSL=true";
    6. String username = "root";
    7. String password = "123456";
    8. // mysql默认端口3306
    9. // 协议://主机地址:端口号/数据库名?参数1&参数2&参数3
    10. // oracle默认端口1521
    11. // jdbc:oracle:thin:@localhost:1521:sid
    • useUnicode=true 支持中文编码
    • &charactEncoding=utf8 设定它的中文字符集
    • &useSSL=true 使用安全连接

    数据库对象Connection

    1. //3.连接成功,数据库对象 Connection代表数据库
    2. Connection connection = DriverManager.getConnection(url, username, password);
    3. // connection.rollback();
    4. // connection.commit();
    5. // connection.setAutoCommit();

    Statement执行sql对象、PreparedStatement执行sql对象

    • 执行SQL对象
      • Statement statement = connection.createStatement();
    • 执行SQL的对象去执行sql,可能存在结果,查看返回结果
      • String sql = "SELECT * FROM `users`";
      • ResultSet resultSet = statement.executeQuery(sql);
    1. String sql = "SELECT * FROM users";//编写SQL
    2. // statement.executeQuery();//查询操作返回ResultSet
    3. // statement.execute();//执行任何SQL
    4. // statement.executeUpdate();//更新、插入、删除。都是用这个,返回一个受影响的行数

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

    1. while (resultSet.next()) {
    2. System.out.println("id=" + resultSet.getObject("id"));
    3. System.out.println("name=" + resultSet.getObject("NAME"));
    4. System.out.println("pwd=" + resultSet.getObject("PASSWORD"));
    5. System.out.println("email=" + resultSet.getObject("email"));
    6. System.out.println("birth=" + resultSet.getObject("birthday"));
    7. System.out.println("===========================================");
    8. }

    (1)获得指定的数据类型 

    1. //在不知道列类型的情况下使用
    2. resultSet.getObject();
    3. //如果知道列的类型就使用指定的类型
    4. resultSet.getString();
    5. resultSet.getInt();
    6. resultSet.getFloat();
    7. resultSet.getDate();

    (2)遍历,指针

    1. //移动到最前面
    2. resultSet.beforeFirst();
    3. //移动到最后面
    4. resultSet.afterLast();
    5. //移动到下一个数据
    6. resultSet.next();
    7. //移动到前一行
    8. resultSet.previous();
    9. //移动到最前面
    10. resultSet.absolute(row);

    (3)释放资源

    1. //6.释放连接
    2. resultSet.close();
    3. statement.close();
    4. connection.close();//消耗资源

    statement对象详解

    • JDBC中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删查改,只需要通过这个对象向数据库发送增删改查语句即可
    • Statement对象的executeUpdate方法,用于向数据库发送增、删、改的SQL语句, executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发送了变化)       
    • Statement.executeQuery方法用于向数据库发送查询语句
    • executeQuery方法返回代表查询结果的ResultSet对象

    CRUD操作-create

    (增) 例子:

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

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

     CRUD操作-delete

    (删)例子:

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

     CRUD操作-update

    (改)例子:

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

     CRUD操作-read

    (查)例子:

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

    代码实现

    (1)提取工具类

    1. package com.gt.lesson02.utils;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.sql.*;
    5. import java.util.Properties;
    6. public class JdbcUtils {
    7. private static String driver = null;
    8. private static String url = null;
    9. private static String username = null;
    10. private static String password = null;
    11. static {
    12. try {
    13. InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
    14. Properties properties = new Properties();
    15. properties.load(in);
    16. driver = properties.getProperty("driver");
    17. url = properties.getProperty("url");
    18. username = properties.getProperty("username");
    19. password = properties.getProperty("password");
    20. //1.驱动只用加载一次
    21. Class.forName(driver);
    22. } catch (Exception e) {
    23. e.printStackTrace();
    24. }
    25. }
    26. //获取连接
    27. public static Connection getConnection() throws SQLException {
    28. return DriverManager.getConnection(url, username, password);
    29. }
    30. //释放连接资源
    31. public static void release(Connection conn, Statement st, ResultSet rs) {
    32. if (rs!=null){
    33. try {
    34. rs.close();
    35. } catch (SQLException throwables) {
    36. throwables.printStackTrace();
    37. }
    38. }
    39. if (st!=null){
    40. try {
    41. st.close();
    42. } catch (SQLException throwables) {
    43. throwables.printStackTrace();
    44. }
    45. }
    46. if (conn!=null){
    47. try {
    48. conn.close();
    49. } catch (SQLException throwables) {
    50. throwables.printStackTrace();
    51. }
    52. }
    53. }
    54. }

     配置文件db.properties

     

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

    (2)编写增的方法,executeUpdate

    1. package com.gt.lesson02;
    2. import com.gt.lesson02.utils.JdbcUtils;
    3. import java.sql.Connection;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.sql.Statement;
    7. public class Testlnsert {
    8. public static void main(String[] args) {
    9. Connection conn = null;
    10. Statement st = null;
    11. ResultSet rs = null;
    12. try {
    13. conn = JdbcUtils.getConnection();//获取数据库连接
    14. st = conn.createStatement();//获得SQL的执行对象
    15. String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,`email`,`birthday`)" +
    16. "VALUES(4,'git','123456','123456@qq.com','2022-8-7')";
    17. int i = st.executeUpdate(sql);
    18. if (i > 0) {
    19. System.out.println("插入成功!");
    20. }
    21. } catch (SQLException e) {
    22. e.printStackTrace();
    23. } finally {
    24. JdbcUtils.release(conn, st, rs);
    25. }
    26. }
    27. }

    输出结果:

     

     

    (3)编写删的方法,executeUpdate

    1. package com.gt.lesson02;
    2. import com.gt.lesson02.utils.JdbcUtils;
    3. import java.sql.Connection;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.sql.Statement;
    7. public class TestDelete {
    8. public static void main(String[] args) {
    9. Connection conn = null;
    10. Statement st = null;
    11. ResultSet rs = null;
    12. try {
    13. conn = JdbcUtils.getConnection();//获取数据库连接
    14. st = conn.createStatement();//获得SQL的执行对象
    15. String sql = "DELETE FROM users WHERE id = 4;";
    16. int i = st.executeUpdate(sql);
    17. if (i > 0) {
    18. System.out.println("删除成功!");
    19. }
    20. } catch (SQLException e) {
    21. e.printStackTrace();
    22. } finally {
    23. JdbcUtils.release(conn, st, rs);
    24. }
    25. }
    26. }

    输出结果:

     

     

    (4)编写改的方法,executeUpdate

    1. package com.gt.lesson02;
    2. import com.gt.lesson02.utils.JdbcUtils;
    3. import java.sql.Connection;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.sql.Statement;
    7. public class TestUpdate {
    8. public static void main(String[] args) {
    9. Connection conn = null;
    10. Statement st = null;
    11. ResultSet rs = null;
    12. try {
    13. conn = JdbcUtils.getConnection();//获取数据库连接
    14. st = conn.createStatement();//获得SQL的执行对象
    15. String sql = "UPDATE users SET `NAME`='lisi',`email`='2366546@qq.com' WHERE id=2";
    16. int i = st.executeUpdate(sql);
    17. if (i > 0) {
    18. System.out.println("更新成功!");
    19. }
    20. } catch (SQLException e) {
    21. e.printStackTrace();
    22. } finally {
    23. JdbcUtils.release(conn, st, rs);
    24. }
    25. }
    26. }

    输出结果:

     

     

    (5)查询

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

    输出结果:


    sql注入问题 

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

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

    输出结果:

            错误的用户名或者密码可以获取到全部的用户信息

      

  • 相关阅读:
    10.Async异步函数
    199、在RabbitMQ管理控制台中管理 Exchange(充当消息交换机的组件) 和 Queue(消息队列),以及对默认Exchange的讲解
    局域网内vue2 配置本地IP地址访问项目
    windows 调用 static lib
    mysql事务
    关于xlrd.biffh.XLRDError: Excel xlsx file; not supported的解决方法
    Java Stream流的详解
    windows系统手把手教你安装python虚拟环境
    极智Paper | 多任务统一网络 YOLOR
    【rust】cargo的概念和使用方法
  • 原文地址:https://blog.csdn.net/qq_46423017/article/details/126220759