我的java spring引导代码有什么问题

时间:2019-12-30 05:32:29

标签: 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',因为初始化器表达式没有可表示的类型:类型无法解析

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

2 个答案:

答案 0 :(得分:2)

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

这使代码的编写不再那么冗长,而且可能更易于阅读和理解。

但是var并不总是可用的,只是当变量的类型明确供编译器猜测时。

如果不是,则必须将类型声明为普通类型。

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

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

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

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

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

在这里我声明一个String列表,但是要初始化变量,我实例化了ArrayList <>。

要解决此问题,您可以更改代码:

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

更新

我刚刚注意到您正在从Lombok项目导入以便使用var

我认为这可能是导致编译器无法在错误行中获取正确类型并且您的IDE最初未提示错误的原因。

在Java 10+上,您将var作为关键字,然后它应该可以工作。

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

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

如果您使用的是Java 10+,并且导入是偶然的,或者可以使用Java 10,则可以尝试删除导入并使用该语言。

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

答案 1 :(得分:1)

不确定为什么要尝试导入SQL并以这种方式进行操作,Spring使用休眠模式,基本上,您只需要按照以下方式设置数据库属性即可 资源/application.properties

spring.datasource.url = jdbc:mysql://url
spring.datasource.username = username
spring.datasource.password = pass
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

创建您的bean

@Entity
@Table(name = "SOMETABLE")
@EntityListeners(AuditingEntityListener.class)
public class Example {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;
  @Column(name = "EXAMPLE", nullable = false)

  //getters and setters 
}

然后是一个类似

的存储库
@Repository
public interface IncidentRepository extends JpaRepository<Example, Long> {

  Optional<List<Example>> findByExampleContaining(String param);
}

和休眠将自动神奇地为此生成查询,您也可以自定义查询

这非常粗糙,但是有很多教程可以指导您完成Spring Boot