java - 将 Spring Boot JDBCTemplate 连接到 SQL Server (MSSQL)

标签 java spring spring-mvc spring-boot

我是 Spring Boot 的新手,我在尝试设置我的项目以便它可以与 SQL Server 通信时遇到了问题 - 更具体地说,我的 JDBCTemplate 实例变量为 null 并且由于某种原因不是 '使用我在 application.properties 文件中指定的数据源 Autowiring '。这些是我到目前为止采取的步骤:

  1. 使用 STS,我使用 Spring Start 项目模板创建了一个新的 Spring Boot 项目。
  2. 我通过“类型”选择了 Gradle,并勾选了 JDBC。
  3. 然后我按照以下教程创建了一个到 SQL Server 的抽象接口(interface) (DAO) (http://www.tutorialspoint.com/spring/spring_jdbc_example.htm)。
  4. 如果您将教程页面向下滚动到 MainApp.java 位,我没有使用 main 方法的前 4 行 - 因为我没有 beans.xml 文件。这就是我认为 Spring Boot 的 @Autowired 注释出现并为我创建 bean 的地方?
  5. 我从 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/

相关文章:

java - MVCS模式,创建服务时

java - 如何使用java修改特定数字列值后写入CSV文件

java - 无法点击 Android 移动应用程序上 textview 消息内的链接 - Appium

java - Spring Security登录中的无限循环

spring - 我如何将应用程序从 Tomcat 6.0.35 迁移到 JBoss AS 7.1.1

java - 我无法在 Windows 上运行 Spring Boot jar

java - 对于 if-else 条件,哪一种更好的做法?

Java 邮件 (TLS) : Erratic failure to validate certification path

Spring 和 Mybatis 多数据源设置

java - 如何在签名中没有 RedirectAttributes 的方法中访问 RedirectAttributes?