首页 > 解决方案 > 我的 java spring boot 代码有什么问题

问题描述

现在我想将 java spring boot 连接到 mysql 所以我尝试了这段代码

package com.tutorial.springboot;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import lombok.var;
import java.io.FileInputStream;
import java.io.IOException;

import java.util.Properties;


import java.sql.Driver;



public class Application {
    public static void main(String[] args) throws IOException, ClassNotFoundException{
        var prop = new Properties();
        prop.load(new FileInputStream("src/main/resources/Application.properties"));
        var ds = new SimpleDriverDataSource();

        ds.setDriverClass(((Class<Driver>) Class.forName(prop.getProperty("jdbc.driver"))));
        ds.setUrl(prop.getProperty("jdbc.url"));
        ds.setUsername(prop.getProperty("jdbc.username"));
        ds.setPassword(prop.getProperty("jdbc.password"));

        var sql = "SELECT COUNT(*) FROM ked_error_nonumber";

        var jtm = new JdbcTemplate(ds);
        int numOfCars = jtm.queryForObject(sql, Integer.class);

        System.out.format("There are %d", numOfCars);
    }
}

这工作得很好

但是当我运行这段代码时

package com.tutorial.springboot;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import lombok.var;
import java.io.FileInputStream;
import java.io.IOException;

import java.util.Properties;


import java.sql.Driver;



public class Application {
    public static void main(String[] args) throws IOException, ClassNotFoundException{
        var prop = new Properties();
        prop.load(new FileInputStream("src/main/resources/Application.properties"));
        var ds = new SimpleDriverDataSource();

        ds.setDriverClass(((Class<Driver>) Class.forName(prop.getProperty("jdbc.driver"))));
        ds.setUrl(prop.getProperty("jdbc.url"));
        ds.setUsername(prop.getProperty("jdbc.username"));
        ds.setPassword(prop.getProperty("jdbc.password"));

        var sql = "SELECT * FROM ked_error_nonumber";

        var jtm = new JdbcTemplate(ds);
        var rows = (List<Map<String, Object>>) jtm.queryForList(sql);

        rows.forEach(System.out::println);
    }
}

此代码引发错误:(30、13)java:无法在此处使用“var”,因为初始化表达式没有可表示的类型:无法解析类型

那么问题是什么?如果有人知道请教我谢谢!

标签: javaspring-boot

解决方案


关键字var意味着您委托编译器猜测变量的正确类型,而不是首先声明它。

这使得代码编写起来不那么冗长,并且可能更快地阅读和理解。

var并不总是可用,只是当变量的类型很清楚,编译器可以猜测时。

如果不是,那么您必须将类型声明为正常。

在你的情况下,我认为违规行是:

    var rows = (List<Map<String, Object>>) jtm.queryForList(sql);

List<T>并且Map<K, V>不是真正的类型,只是用于方法签名和变量声明的接口,以告诉编译器要使用的接口。

但是当我们实例化对象时,我们需要一个具体的类型,一个实现正确接口的类的对象。例如:

List<String> myList = ArrayList<>();

这里我声明了一个字符串列表,但是为了初始化变量我实例化了一个 ArrayList<>。

要解决此问题,您只需更改代码:

List<Map<String, Object>> rows = (List<Map<String, Object>>) jtm.queryForList(sql);

更新

我刚才注意到您正在从 Project Lombok 导入以使用var.

我认为这可能是编译器无法在错误行中获取正确类型的原因,并且您的 IDE 没有首先提示错误。

在 Java 10+ 上,你有var一个关键字,然后它应该可以工作。

我想您的 IDE 是var从 Lombok 导入的,因为您使用的是 Java 8 或低于 10 的 Java 版本。

如果是这种情况,那么您必须遵循类型声明。

如果您使用 java 10+ 并且导入是一种意外,或者您可以使用 Java 10,那么您可以尝试删除导入并使用该语言。

在这种情况下,如果 IDE 未编译,则应立即突出显示。


推荐阅读