簡體   English   中英

將Spring Boot JDBCTemplate連接到SQL Server(MSSQL)

[英]Connecting Spring Boot JDBCTemplate to SQL Server (MSSQL)

我是Spring Boot的新手,我在嘗試設置我的項目時遇到了麻煩,因此它可以與SQL Server進行通信 - 更具體地說,我的JDBCTemplate實例變量為null,並且由於某種原因沒有'自動裝配'我在application.properties文件中指定的數據源。 這些是我到目前為止采取的步驟:

  1. 使用STS我使用Spring Start Project模板創建了一個新的Spring Boot項目。
  2. 我通過'Type'選擇了Gradle,並勾選了JDBC。
  3. 然后,我按照以下教程創建了一個到SQL Server的抽象接口(DAO)( http://www.tutorialspoint.com/spring/spring_jdbc_example.htm )。
  4. 如果您將教程頁面向下滾動到MainApp.java位,我沒有使用主方法的前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()方法中,您使用new運算符:

    BranchJDBCTemplate branchTemplate = new BranchJDBCTemplate();

所以這個branchTemplate實例不是spring manged因此數據源不是自動裝配的,因此導致jdbctemplate的null值。

而是使用annotatioan作為:

    @Repository("branchDao")
    public class BranchJDBCTemplate implements BranchDAO {
    ...
    }

並在CustController中訪問branchTemplate:

    @RestController
    public class CustController {
        @Autowired
        @Qualifier("branchDao")
        BranchJDBCTemplate branchTemplate;  
        ...
    }   

嘗試在application.properties文件中使用以下內容

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb;integratedSecurity=false;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM