Java 如何为 List<Car> 构建 SQL SELECT 语句?

Posted

技术标签:

【中文标题】Java 如何为 List<Car> 构建 SQL SELECT 语句?【英文标题】:Java How to build SQL SELECT statement for List<Car>? 【发布时间】:2021-05-02 17:31:12 【问题描述】:

假设我们有一个 Car 类,其属性代表 oracle 数据库中的字段,仅允许具有主键年份、品牌和型号的唯一汽车:

private int year
private String make
private String model
private String color

那么我们的示例List&lt;Car&gt; 可能是:

Car car1 = new Car(2015, "Toyota", "Camry", "Blue")
Car car2 = new Car(2017, "Honda", "Corolla", "White")
Car car3 = new Car(2011, "Honda", "Civic", "Red")
 

假设oracle数据库中有多个条目, 如果我想要一个从List&lt;Car&gt; 获取属性的选择语句来选择数据库中具有 3 个主键的相同汽车,我想要类似的东西:

select * from cars_table where year in (2015,2011,2017) and make in (“Toyota”,”Honda”) and model in (“Camry”,”Corolla”,”Civic”)

我相信这个 sql 语句有效,但我不知道如何在 Java 中构建这个语句。我的算法技能不是最好的,我尝试使用 for 循环作为列表,但我无法拼凑第二个获取参考。非常感谢!

【问题讨论】:

哦我知道如何使用 jdbc 我的意思是我正在努力使用 List 构建实际的 select 语句 那么你尝试了什么? SQL 语句是一个字符串。因此,您的第一次尝试应该从您的列表值中创建这样一个字符串。这应该很容易。挑战在于确保一切安全,以防止 SQL 注入。如果你不想使用 Hibernate 等重量级的东西,你可以使用MyBatis。查看 foreach 部分。 @abra 是的,我在上面发布了一个现有的 sql 语句,但我想不出在 java 中构建它的方法 【参考方案1】:

您的查询将带回太多行,因为它会带回 2011 Toyota Corolla(以及许多其他不需要的组合)。

要获取仅包含这些值组合的值,您需要查询:

SELECT *
FROM   cars_table
WHERE  ( year, make, model ) IN (
         ( 2015, 'Toyota', 'Camry' ),
         ( 2017, 'Honda', 'Corolla' ),
         ( 2011, 'Honda', 'Civic' )
       )

db小提琴here


在 Java 中:

StringBuilder query = new StringBuilder();
query.append( "SELECT * FROM cars_table WHERE (year, make, model) IN (" );
boolean first = true;
for ( final Car car: carList )

  if ( first )
  
    first = false;
   else 
    query.append(',');
  
  query.append('(');
  query.append(car.getYear());
  query.append(",'");
  query.append(car.getMake());
  query.append("','");
  query.append(car.getModel());
  query.append("')");

query.append(')');
System.out.println(query);

注意:这假设不会发生 SQL 注入;如果您正在接受用户输入,那么您应该确保在从字符串构建查询或制定查询之前清理输入,以便您可以通过代表 SQL 对象集合的绑定变量传递数组。

【讨论】:

您能用更简单的术语解释一下您的 Note: 是什么意思吗? @stackerstack 当用户告诉你他们想要一个名为"camry')) OR EXISTS( select 1 FROM passwords WHERE username = 'Admin' AND password_hash = 'A34F64DC') OR (year, make, model) IN (" 的汽车模型时,你需要清理你的输入数据,否则你会遇到问题。注释的后半部分是alternate method of solving the problem,通过将 Java 类数组直接传递给 Oracle 对象集合。 布尔值的意义何在? @stackerstack 它告诉你是否正在处理列表的第一个元素。 因此,与原始海报相比,您的选择声明,我可以看到他如何返回多个不同的行。如果您要对多个条目执行更新语句,就像您选择多个条目一样,它会是什么样子?

以上是关于Java 如何为 List<Car> 构建 SQL SELECT 语句?的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何为 List<T> 动态分配内存?

如何为 List<T> 应用异步和等待?

如何为绑定到 List<T> 的 dataGridView 设置 columnNames?

如何为 List<List<List<Integer>>> nums = new ArrayList<List<List<Integer>&

如何为ListBox项提供有意义的名称

如何为列表创建JSONArray