现在我想将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',因为初始化器表达式没有可表示的类型:类型无法解析
那是什么问题?如果有人知道,请教我谢谢!
答案 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