在 Java 中拼接 SQL 语句是一项常见的任务,但需要小心防止 SQL 注入攻击。以下是几种拼接 SQL 语句的方式,以及每种方式的步骤和示例代码。为了演示方便,我将使用一个简单的示例表 "users",包含 "id"、"username" 和 "password" 列。
假设我们要执行一个查询操作,根据给定的用户名获取用户信息。
这是最基本的拼接方式,但也是最不安全的,容易受到 SQL 注入攻击。
String username = userInput; // 用户提供的输入
String query = "SELECT * FROM users WHERE username = '" + username + "'";
PreparedStatement
是 Java 提供的一种预编译的语句,可以有效地防止 SQL 注入攻击。
String username = userInput; // 用户提供的输入
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username);
Maven 依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
Gradle 依赖:
implementation 'mysql:mysql-connector-java:8.0.27'
QueryDSL 是一个强大的 SQL 查询构建器,它允许您以类型安全的方式构建和执行 SQL 查询。
String username = userInput; // 用户提供的输入
QUser user = QUser.user;
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
User result = queryFactory.selectFrom(user)
.where(user.username.eq(username))
.fetchOne();
Maven 依赖:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
</dependency>
Gradle 依赖:
implementation 'com.querydsl:querydsl-jpa:5.0.0'
最后,强烈建议使用预编译的语句(如 PreparedStatement)或类似 QueryDSL 这样的工具来构建和执行 SQL 查询,以减少 SQL 注入攻击的风险。