• Java-JDBC快速上手


    目录

    DriverManager(驱动管理类)

    connection(数据库连接对象)

    Statement(获取执行sql的对象)

    Result

    PreparedStatement (防止sql注入)

    数据库连接池(Druid)



    1. package com.clear;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.ResultSet;
    5. import java.sql.Statement;
    6. /**
    7. * jdbc快速入门
    8. */
    9. public class jdbc_demo1 {
    10. public static void main(String[] args) throws Exception{
    11. // 1、注册驱动
    12. Class.forName("com.mysql.jdbc.Driver");
    13. // 2、获取数据库连接
    14. String url = "jdbc:mysql://localhost:3306/douban?useSSL=false";
    15. String username = "root";
    16. String password = "123456";
    17. Connection connection = DriverManager.getConnection(url, username, password);
    18. // 3、获取sql执行者对象
    19. Statement statement = connection.createStatement();
    20. String sql = "select * from douban_top250 limit 10";
    21. // 4、执行sql
    22. ResultSet rs = statement.executeQuery(sql);
    23. while (rs.next()){
    24. System.out.println(rs.getString(4));
    25. }
    26. // 5、释放连接
    27. statement.close();
    28. connection.close();
    29. }
    30. }

    结果如下:

    DriverManager(驱动管理类)

            1.用于注册驱动

            2.获取数据库连接

    1.用于注册驱动

            

    右图可知,Driver类中个静态代码块,会自动执行

    DriverManager.registerDriver(new Driver())

     2.获取连接

    1. // 2、获取数据库连接
    2. String url = "jdbc:mysql://localhost:3306/douban?useSSL=false"; // useSSL=false关闭安全连接警告
    3. String username = "root";
    4. String password = "123456";
    5. Connection connection = DriverManager.getConnection(url, username, password);

    connection(数据库连接对象)

            1.获取执行sql的对象

            2.事务管理

    1. package com.clear;
    2. import java.sql.*;
    3. /**
    4. * jdbc快速入门
    5. */
    6. public class jdbc_connection {
    7. public static void main(String[] args) throws Exception {
    8. // 1、注册驱动
    9. Class.forName("com.mysql.jdbc.Driver");
    10. // 2、获取连接
    11. String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
    12. String username = "root";
    13. String password = "123456";
    14. Connection connection = DriverManager.getConnection(url, username, password);
    15. // 3、获取执行sql的对象
    16. Statement statement = connection.createStatement();
    17. // 4、定义sql
    18. String sql = "update account set money= 2000 where name = '张三'";
    19. String sql2 = "update account set money= 2000 where name = '李四'";
    20. try {
    21. connection.setAutoCommit(false); // 关闭自动提交事务
    22. // 5、执行sql
    23. int line = statement.executeUpdate(sql);
    24. int a = 10 / 0; // 人为制造错误
    25. int line2 = statement.executeUpdate(sql2); // 影响的行数
    26. connection.commit(); // 手动提交事务
    27. } catch (Exception throwables) {
    28. connection.rollback();
    29. throwables.printStackTrace();
    30. }
    31. // 6、释放连接
    32. statement.close();
    33. connection.close();
    34. }
    35. }

     

    Statement(获取执行sql的对象)

    Result

    PreparedStatement (防止sql注入

    开启预编译首先需要在数据库的 my.ini导入 以下

    1. log-output=FILE
    2. general-log=1
    3. general_log_file = "D:\mysql.log"
    4. slow-query-log = 1
    5. slow_query_log_file="D:\mysql_slow.log"
    6. long_query_time=2

    开启预编译

    useServerPrepStmts=true

     以下是使用statement对象执行sql,结果被注入成功

    1. package com.clear;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.ResultSet;
    5. import java.sql.Statement;
    6. public class jdbc_preparedStatement {
    7. public static void main(String[] args) throws Exception {
    8. // 1、注册驱动
    9. Class.forName("com.mysql.jdbc.Driver");
    10. // 2、获取连接
    11. String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false&useServerPrepStmts=true"; # 开启预编译
    12. String username = "root";
    13. String password = "123456";
    14. Connection connection = DriverManager.getConnection(url, username, password);
    15. // 3、获取执行sql对象
    16. Statement statement = connection.createStatement();
    17. // 4、定义sql
    18. String name = "zhangsan";
    19. String pw = "123";
    20. String pw_inject = "' or '1' = '1"; // 注入语句
    21. String sql = "select * from tb_user where username='"+name+"'and password='"+pw_inject+"'";
    22. // 5、执行sql
    23. ResultSet resultSet = statement.executeQuery(sql);
    24. // 处理
    25. if (resultSet.next()){
    26. System.out.println("查询成功~~~");
    27. } else{
    28. System.out.println("查询失败^v^");
    29. }
    30. // 6、释放资源
    31. resultSet.close();
    32. statement.close();
    33. connection.close();
    34. }
    35. }

     使用PreparedStatement对象后,sql注入失败

    1. package com.clear;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.ResultSet;
    5. import java.sql.PreparedStatement;
    6. public class jdbc_preparedStatement {
    7. public static void main(String[] args) throws Exception {
    8. // 1、注册驱动
    9. Class.forName("com.mysql.jdbc.Driver");
    10. // 2、获取连接
    11. String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
    12. String username = "root";
    13. String password = "123456";
    14. Connection connection = DriverManager.getConnection(url, username, password);
    15. // 3、定义sql
    16. String name = "zhangsan";
    17. String pw = "123";
    18. String pw_inject = "' or '1' = '1"; // 注入语句
    19. String sql = "select * from tb_user where username= ? and password=?";
    20. // 4、获取执行PreparedStatement对象(对sql语句有做转义处理)
    21. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    22. // 4.1、设置?的值
    23. preparedStatement.setString(1,name);
    24. preparedStatement.setString(2,pw_inject);
    25. // 5、执行sql
    26. ResultSet resultSet = preparedStatement.executeQuery(); // 注意:这里不在写传sql
    27. // 处理
    28. if (resultSet.next()){
    29. System.out.println("查询成功~~~");
    30. } else{
    31. System.out.println("查询失败^v^");
    32. }
    33. // 6、释放资源
    34. resultSet.close();
    35. preparedStatement.close();
    36. connection.close();
    37. }
    38. }

    数据库连接池(Druid)

     

    案例如下:

    首先配置druid.properties

         

    1. driverClassName=com.mysql.jdbc.Driver
    2. url=jdbc:mysql://127.0.0.1:3306/douban?useSSL=false&useServerPreStmts=true
    3. username=root
    4. password=123456
    5. # 初始化连接数量
    6. initialSize=5
    7. # 最大连接数
    8. maxActive=10
    9. # 最大等待时间 3s
    10. maxWait=3000

     代码如下:

    1. package com.clear;
    2. import com.alibaba.druid.pool.DruidDataSourceFactory;
    3. import javax.sql.DataSource;
    4. import java.io.FileInputStream;
    5. import java.sql.ResultSet;
    6. import java.sql.Connection;
    7. import java.sql.PreparedStatement;
    8. import java.sql.SQLOutput;
    9. import java.util.Properties;
    10. /**
    11. * 简单上手数据库连接池(Druid)
    12. */
    13. public class jdbc_druid {
    14. public static void main(String[] args) throws Exception {
    15. // 1、导入jar包
    16. // 2、定义配置文件
    17. // 3、加载配置文件
    18. Properties properties = new Properties();
    19. // System.out.println(System.getProperty("user.dir")); // 查看当前目录
    20. properties.load(new FileInputStream("src/druid.properties"));
    21. // 4、获取连接池对象
    22. DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    23. // 5、获取数据库连接
    24. Connection connection = dataSource.getConnection();
    25. // 6.获取PreparedStatement对象
    26. String sql = "select * from douban_top250 where id < ?";
    27. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    28. // 设置?的值
    29. preparedStatement.setInt(1, 10);
    30. // 7.执行sql
    31. ResultSet resultSet = preparedStatement.executeQuery();
    32. while(resultSet.next()){
    33. System.out.println( resultSet.getString(4));
    34. }
    35. }
    36. }

    测试结果

  • 相关阅读:
    工程建设行业智能供应链系统:优化产业链运作效率,实现全链路数字化建设
    自定义appbarTitle + TabBarView 实现类似安卓tabHost+Fragment
    Google Earth Engine(GEE)分析多个地区的植被覆盖趋势
    vue当中的收集表单数据以及过滤器
    2.2 Linux系统的目录结构与文件类型
    Huggingface开源模型使用学习
    《对比Excel,轻松学习Python数据分析》读书笔记------数据分组与数据透视表
    【Gitee】使用IDEA上传本地的项目到Gitee
    【JavaSE】继承那些事儿
    AI 时代的企业级安全合规策略
  • 原文地址:https://blog.csdn.net/weixin_56058578/article/details/127715968