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<Car>
可能是:
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<Car>
获取属性的选择语句来选择数据库中具有 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您的查询将带回太多行,因为它会带回 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 语句?的主要内容,如果未能解决你的问题,请参考以下文章
如何为绑定到 List<T> 的 dataGridView 设置 columnNames?
如何为 List<List<List<Integer>>> nums = new ArrayList<List<List<Integer>&