当前位置: 首页 > wzjs >正文

wordpress显示不正常宝塔wordpress优化

wordpress显示不正常,宝塔wordpress优化,重庆石柱网站设计公司,网店如何营销推广1. 引言 在 Java 数据库编程中,PreparedStatement 是一个非常重要的接口,用于执行预编译的 SQL 语句。与 Statement 相比,PreparedStatement 提供了更高的安全性和性能。本文将详细介绍 PreparedStatement 的基本用法、优势以及如何在实际项…

1. 引言

在 Java 数据库编程中,PreparedStatement 是一个非常重要的接口,用于执行预编译的 SQL 语句。与 Statement 相比,PreparedStatement 提供了更高的安全性和性能。本文将详细介绍 PreparedStatement 的基本用法、优势以及如何在实际项目中应用。

2. 什么是 PreparedStatement?

PreparedStatement 是 Java JDBC 中的一个接口,它是 java.sql.Statement 的子接口。与普通 Statement 相比,PreparedStatement 允许在 SQL 语句中使用 参数占位符(?),并在执行时动态赋值。这不仅提升了代码的可读性,还提高了数据库的执行效率。

2.1 继承关系

在 JDBC 结构中,PreparedStatement 继承自 Statement,并间接继承 AutoCloseableWrapper,这意味着它支持自动关闭资源(try-with-resources 语法)并允许包装其他对象。

2.2 防止 SQL 注入

SQL 注入是一种常见的安全漏洞,攻击者可以通过在输入中插入恶意 SQL 代码来操纵数据库查询。使用 PreparedStatement 可以有效防止 SQL 注入,因为参数值会被预编译,不会被解释为 SQL 代码。

2.3 提高性能

PreparedStatement 的 SQL 语句在首次执行时会被预编译,后续执行时可以直接使用编译好的语句,减少了编译次数,从而提高了执行效率。

2.4 代码可读性和维护性

使用 PreparedStatement 可以避免通过字符串拼接来构建 SQL 语句,减少了语法错误的可能性,并提高了代码的可读性和维护性。

3. PreparedStatement 的基本用法

3.1 部分方法:

 3.2 实例

package JDBC;import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;public class PerparedStatement {public static void main(String[] args) throws Exception {//        安全查询
//        Class.forName("com.mysql.jdbc.Driver");Scanner scanner = new Scanner(System.in);System.out.println("Enter SQL nameusr statement");String username =scanner.nextLine();System.out.println("Enter SQL pwd statement");String pwd =scanner.nextLine();Properties properties = new Properties();properties.load(new FileInputStream("src\\JDBC\\mysql.properties"));String url = (String) properties.get("url");String user =(String) properties.get("user");String password =(String) properties.get("password");String driver =(String) properties.get("driver");
//        实例化
//        Class.forName(driver); //注册驱动Connection connection = DriverManager.getConnection(url, user, password);//        组织sql语言String sql=  "select * from sql_injection where NAME=? and  pwd = ? ;";//        改用PerparedStatementPreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, username);preparedStatement.setString(2, pwd);
//        此时不用写sqlResultSet resultSet = preparedStatement.executeQuery();
//        得到statement
//        Statement statement = connection.createStatement();//        组织查询语句
//        String sql = "select * from sql_injection where NAME='"+username+"'and  pwd = '"+pwd+"';" ;//        ResultSet resultSet = statement.executeQuery(sql);if (resultSet.next()) {System.out.println("查询成功");}else {System.out.println("查询失败");}//        关闭连接,安全操作resultSet.close();preparedStatement.close();connection.close();}
}

3.3 插入数据示例

String insertSQL = "INSERT INTO users (username, password) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {pstmt.setString(1, "new_user");pstmt.setString(2, "secure_password");int affectedRows = pstmt.executeUpdate();System.out.println("插入成功,影响行数:" + affectedRows);
}

3.4 批量执行示例

String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, "user1");pstmt.setString(2, "pass1");pstmt.addBatch();pstmt.setString(1, "user2");pstmt.setString(2, "pass2");pstmt.addBatch();int[] result = pstmt.executeBatch();System.out.println("批量插入成功,影响行数:" + result.length);
}

 3.5 结合dml操作实例

package JDBC;import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import java.util.Scanner;public class PerparedstatementDML {public static void main(String[] args) throws Exception {//        安全查询
//        Class.forName("com.mysql.jdbc.Driver");Scanner scanner = new Scanner(System.in);System.out.println("Enter SQL nameusr statement");String username =scanner.nextLine();System.out.println("Enter SQL pwd statement");String pwd =scanner.nextLine();Properties properties = new Properties();properties.load(new FileInputStream("src\\JDBC\\mysql.properties"));String url = (String) properties.get("url");String user =(String) properties.get("user");String password =(String) properties.get("password");String driver =(String) properties.get("driver");
//        实例化
//        Class.forName(driver); //注册驱动Connection connection = DriverManager.getConnection(url, user, password);//        组织sql语言
//        String insert_sql=  "insert into sql_injection values (?,?);";
//        String update_sql=  "update sql_injection set pwd = ? where name = ?;";String delet_sql=  "delete from sql_injection  where name = ?;";//        改用PerparedStatementPreparedStatement preparedStatement = connection.prepareStatement(delet_sql);preparedStatement.setString(1, username);
//        preparedStatement.setString(2, username);
//        此时不用写sqlint i = preparedStatement.executeUpdate();//返回修改的行数if (i >0) {System.out.println("修改成功");}else {System.out.println("修改失败");}//        关闭连接,安全操作
//        resultSet.close();preparedStatement.close();connection.close();}
}

4. PreparedStatement 的优势

4.1 防止 SQL 注入

传统 Statement 需要拼接 SQL 语句,例如:

String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";

如果用户输入 admin' OR '1'='1,则 SQL 语句变为:

SELECT * FROM users WHERE username = 'admin' OR '1'='1'

这将导致 SQL 注入,绕过身份验证。而 PreparedStatement 通过 参数化查询,可以有效避免此问题。

4.2 提高性能

数据库可以 预编译 PreparedStatement,当相同的 SQL 语句多次执行时,数据库无需重复解析 SQL 语句,从而提高执行效率。

4.3 减少语法错误

由于 SQL 语句在 编写时 就已固定,避免了手动拼接 SQL 可能导致的 语法错误

4.4 结合数据库连接池

结合 数据库连接池(如 HikariCP、C3P0),可以进一步提高 PreparedStatement 的性能。连接池可以复用 PreparedStatement,避免数据库频繁解析 SQL 语句。

5.注意事项

作用:

  1. resultSet.close():关闭 结果集,释放查询结果所占用的内存资源。

  2. preparedStatement.close():关闭 预编译 SQL 语句对象,释放数据库的预编译缓存资源。

  3. connection.close():关闭 数据库连接,释放数据库连接资源,避免连接泄漏。

// 关闭连接,安全操作
resultSet.close();
preparedStatement.close();
connection.close();

为什么要关闭这些资源?

  • 防止内存泄漏:未关闭的 ResultSetPreparedStatementConnection 可能会占用大量内存,长期运行可能导致 内存溢出

  • 释放数据库连接:数据库连接是有限的,未及时关闭会导致 连接池资源耗尽,影响应用程序性能。

  • 提高应用程序的稳定性:避免出现 资源占用过多死锁 的情况,确保数据库操作的可持续性。

6. 总结

PreparedStatement 是 Java JDBC 中强烈推荐使用的 SQL 执行方式,它不仅提高了安全性,还提升了数据库的执行效率。开发者应 避免使用 Statement 拼接 SQL 语句,而是 始终使用 PreparedStatement 进行数据库操作

希望本文能帮助大家更好地理解和使用 PreparedStatement,提升 Java 数据库开发的质量和安全性!


文章转载自:

http://BFR2y6dI.ffrys.cn
http://vwuawqYM.ffrys.cn
http://GtQEFQm7.ffrys.cn
http://tmdk0ucU.ffrys.cn
http://nJInW4Yf.ffrys.cn
http://cWApsmWW.ffrys.cn
http://3zTfedVy.ffrys.cn
http://hkwgtKIB.ffrys.cn
http://tdJLIB08.ffrys.cn
http://rRtsG4R0.ffrys.cn
http://3k4i8fme.ffrys.cn
http://5ZpJeReE.ffrys.cn
http://8QUc0Lmo.ffrys.cn
http://wMMdVx7I.ffrys.cn
http://SH964lHS.ffrys.cn
http://FEMUXpYg.ffrys.cn
http://Vx01DvBr.ffrys.cn
http://mn3ZC93R.ffrys.cn
http://oBAd0LBH.ffrys.cn
http://7u7ZHAmS.ffrys.cn
http://IRxYliNT.ffrys.cn
http://6UMHKanr.ffrys.cn
http://rttOZVfY.ffrys.cn
http://J1QSkzIL.ffrys.cn
http://4H7Gis6Z.ffrys.cn
http://sqsQ9jVu.ffrys.cn
http://FpXU6YNs.ffrys.cn
http://kkRN0ySK.ffrys.cn
http://gro0rnIr.ffrys.cn
http://rifPrYsn.ffrys.cn
http://www.dtcms.com/wzjs/683104.html

相关文章:

  • 网站的建设和维护成本网站建设课程ppt
  • 旧宫网站建设东莞房价走势
  • 响应式的网站做优化好吗自己做的网站链接
  • 安徽建设厅网站官网黄骅市教育局
  • 网站空间商是什么中牟建设工程信息网站
  • 电商网站开发哪家好用来做问卷调查的网站
  • 网站的模板怎么做国税网站上如何做股权变更
  • 东莞网站营销p2p金融网站建设
  • 做国际贸易网站哪家好旅游网页素材
  • 如何免费创建一个个人网站衡水网站网站建设
  • 广告视频素材网站百度贴吧秦皇岛
  • 一尊网 又一个wordpress站点定制网站制作服务商
  • 杭州交易网站建设网络运营与维护主要做什么
  • 乐站_网站建设_自助建站慧聪网的网站建设策略
  • 济南seo网站优化公司经典的高端网站建设公司着陆页设计
  • 凡科建站的建站后如何管理江苏军民融合网站建设
  • 秦皇岛手机网站建设wordpress主题站
  • 如何做域名网站做网站主流网站
  • 叫别人做网站后怎么更改密码花都定制型网站建设
  • 商城网站用html做时尚女装网站模版
  • 建设银行网站能买手机wordpress主题 手机
  • 江西那家做网站公司好福州论坛建站模板
  • 网站设计与开发的基本步骤包括哪些?网站开发先找UI吗
  • 一站式装修公司排名网站没有域名
  • 谷歌外贸建站中国建设银行网站怎么登录不上去
  • 网站 购买网站论坛怎样建设
  • 惠州网站建设教程p2vr做的网站怎么再次打开
  • 做的比较好看的国内网站敬请期待还是说尽情期待
  • 做app要不要建网站佳木斯城乡建设局官方网站
  • 餐饮网站开发背景佛山建站怎么做