我是 Spring Boot 的新手,我在尝试设置我的项目以便它可以与 SQL Server 通信时遇到了问题 - 更具体地说,我的 JDBCTemplate 实例变量为 null 并且由于某种原因不是 '使用我在 application.properties 文件中指定的数据源 Autowiring '。这些是我到目前为止采取的步骤:
- 使用 STS,我使用 Spring Start 项目模板创建了一个新的 Spring Boot 项目。
- 我通过“类型”选择了 Gradle,并勾选了 JDBC。
- 然后我按照以下教程创建了一个到 SQL Server 的抽象接口(interface) (DAO) (http://www.tutorialspoint.com/spring/spring_jdbc_example.htm)。
- 如果您将教程页面向下滚动到 MainApp.java 位,我没有使用 main 方法的前 4 行 - 因为我没有 beans.xml 文件。这就是我认为 Spring Boot 的 @Autowired 注释出现并为我创建 bean 的地方?
- 我从 Microsoft 下载了 SQL Server jar 文件,并通过右键单击我的项目 -> 构建路径 -> 配置构建路径 -> 添加外部 JAR 将其作为外部 JAR 添加到我的项目中。这样做消除了我的一个错误,该错误指示找不到我在 application.properties 文件中指定的 driverClassName。
我将从显示“application.properties”文件的内容开始:
spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb
spring.datasource.username=sa
spring.datasource.password=myPassword
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerConnection
spring.datasource.initialize=true
下面是我的“JDBCTemplate.java”类,其中包含我的 CRUD 方法:
package demo;
import java.util.List;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
public class BranchJDBCTemplate implements BranchDAO {
private DataSource dataSource;
@Autowired
protected JdbcTemplate jdbcTemplateObject;
@Autowired
@Override
public void setDataSource(DataSource ds) {
this.dataSource = ds;
this.jdbcTemplateObject = new JdbcTemplate(dataSource);
}
@Override
public void create(String name) {
String SQL = "insert into branches (name) values (?)";
jdbcTemplateObject.update(SQL, name);
System.out.println("Created Record Name = " + name);
return;
}
@Override
public Branch getBranch(Integer id) {
String SQL = "select * from branches where id = ?";
Branch student = jdbcTemplateObject.queryForObject(SQL,
new Object[]{id}, new BranchMapper());
return student;
}
@Override
public List<Branch> listBranches() {
String SQL = "select * from branches";
List <Branch> branches = jdbcTemplateObject.query(SQL, new BranchMapper());
return branches;
}
@Override
public void delete(Integer id) {
String SQL = "delete from branches where id = ?";
jdbcTemplateObject.update(SQL, id);
System.out.println("Deleted Record with ID = " + id );
return;
}
@Override
public void update(Integer id, String name) {
String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update(SQL, id);
System.out.println("Updated Record with ID = " + id );
return;
}
}
最后,这是我的“CustController.java”类,其中包含我使用 JDBCTemplate 类执行数据库操作的请求映射:
package demo;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CustController {
@RequestMapping("/customer")
public Cust customer(@RequestParam(value="name", required=false, defaultValue="World") String name) {
BranchJDBCTemplate branchTemplate = new BranchJDBCTemplate();
List<Branch> branchesList = branchTemplate.listBranches();
for (Branch branch : branchesList) {
System.out.print("ID : " + branch.getId());
}
return new Cust(12, "Test", "Test");
}
}
如前所述,我遇到的问题是我的 jdbcTemplateObject 实例 ...
protected JdbcTemplate jdbcTemplateObject;
为 null,因此在以下行中抛出异常:
List <Branch> branches = jdbcTemplateObject.query(SQL, new BranchMapper());
它没有自动初始化,谁能指出我做错了什么?
非常感谢!
托尼
最佳答案
你是对的,你需要有配置数据源的 beans.xml。
在 CustController 类的 customer() 方法中,您使用新的运算符作为:
BranchJDBCTemplate branchTemplate = new BranchJDBCTemplate();
所以这个 branchTemplate 实例不是 spring 管理的,因此数据源不是 Autowiring 的,导致 jdbctemplate 的值为 null。
而是使用注释作为:
@Repository("branchDao")
public class BranchJDBCTemplate implements BranchDAO {
...
}
并访问 CustController 中的 branchTemplate 作为:
@RestController
public class CustController {
@Autowired
@Qualifier("branchDao")
BranchJDBCTemplate branchTemplate;
...
}
关于java - 将 Spring Boot JDBCTemplate 连接到 SQL Server (MSSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25729844/