1. 程式人生 > >SpringBoot進階之訪問資料庫(含原始碼)

SpringBoot進階之訪問資料庫(含原始碼)

本文介紹在Spring Boot基礎下配置資料來源和通過JdbcTemplate編寫資料訪問的示例。

簡單介紹一下
@Controller:修飾class,用來建立處理http請求的物件
@RestController:Spring4之後加入的註解,原來在@Controller中返回json需要@ResponseBody來配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,預設返回json格式。
@RequestMapping:配置url對映

資料來源配置

首先,為了連線資料庫需要引入jdbc支援,在pom.xml中引入如下配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

以MySQL資料庫為例,先引入MySQL連線的依賴包,在pom.xml中加入:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId
>
<version>5.1.21</version> </dependency>

配置資料來源資訊

在application.yml配置資料來源資訊

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

使用JdbcTemplate操作資料庫

編寫實體類Student.java

package com.javazhan.domain;

public class Student {
    private int id ;
    private String name ;
    private int age ;
    private String address ;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }


}

編寫StudentService.java

package com.javazhan.service;

import java.util.List;

import com.javazhan.domain.Student;

public interface StudentService {

    /**
     * 新增一個學生
     * @param student
     */
    void create(Student student) ;

    /**
     * 根據id刪除一個學生
     * @param id
     */
    void deleteById(int id) ;

    /**
     * 查出所有學生
     * @return
     */
    List<Student> getAllStudent() ;

    /**
     * 根據id查出學生
     * @return
     */
    Student getStudentById(int id) ;

    /**
     * 根據Id更新一個學生
     */
    void updateStudentById(Student student) ;
}

編寫實現類StudentServiceImpl.java

package com.javazhan.service.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;

import com.javazhan.domain.Student;
import com.javazhan.service.StudentService;

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private JdbcTemplate jdbcTemplate  ;

    @Override
    public void create(Student student) {
        // TODO Auto-generated method stub
        jdbcTemplate.update("insert into student(name, age, address) value(?,?,?)", student.getName(), student.getAge(), student.getAddress()) ;
    }

    @Override
    public void deleteById(int id) {
        // TODO Auto-generated method stub
        jdbcTemplate.update("delete from student where id = ?", id) ;
    }

    @Override
    public List<Student> getAllStudent() {
        // TODO Auto-generated method stub
        return jdbcTemplate.query("select * from student", new RowMapper()
        {
            @Override
            public Object mapRow(ResultSet rs, int rowNum) throws SQLException
            {
                Student student = new Student();
                student.setId(rs.getInt("id"));
                student.setName(rs.getString("name"));
                student.setAge(rs.getInt("age"));
                student.setAddress(rs.getString("address"));
                return student;
            }
        }) ;
    }

    @Override
    public Student getStudentById(int id) {
        // TODO Auto-generated method stub
        return (Student) jdbcTemplate.query("select * from student where id=?", new ResultSetExtractor() {  
            @Override  
            public Student extractData(ResultSet rs) throws SQLException {  
                while (rs.next()) {
                    Student student = new Student();
                    student.setId(rs.getInt("id"));
                    student.setName(rs.getString("name"));
                    student.setAge(rs.getInt("age"));
                    student.setAddress(rs.getString("address"));
                    return student ;
                }
                return null ;
            }  
        }, id);  
    }

    @Override
    public void updateStudentById(Student student) {
        // TODO Auto-generated method stub
        jdbcTemplate.update("update student set name=?, age=?, address=? where id =?", student.getName(), student.getAge(), student.getAddress(),student.getId()) ;
    }

}

我們嘗試使用Spring MVC來實現一組對Student物件操作的RESTful API,配合註釋詳細說明在Spring MVC中如何對映HTTP請求、如何傳參、如何編寫單元測試。

請求型別 URL 功能說明
GET /student 查詢所有學生
POST /student 新增一個學生
GET /student/id 根據id查詢一個學生
PUT /student/id 根據id更新一個學生
DELETE /student/id 根據id刪除一個學生

編寫StudentRestController .java

package com.javazhan.web.rest;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.javazhan.domain.Student;
import com.javazhan.service.StudentService;

@RestController
@RequestMapping(value="student")
public class StudentRestController {

    @Autowired
    private StudentService stuService ;
    /**
     * 查出所有學生
     * @return
     */
    @RequestMapping(value="/", method=RequestMethod.GET) 
    public List<Student> getAllStudent() {
        return stuService.getAllStudent() ;
    }

    /**
     * 根據id查出學生
     * @return
     */
    @RequestMapping(value="/{id}", method=RequestMethod.GET)
    public Student getStudentById(@PathVariable Integer id) {
        return stuService.getStudentById(id) ;
    }

    /**
     * 根據id刪除學生
     * @return
     */
    @RequestMapping(value="/{id}", method=RequestMethod.DELETE)
    public String deleteById(@PathVariable Integer id) {
        stuService.deleteById(id) ;
        return "success" ;
    }

    /**
     * 新增一個學生
     * @return
     */
    @RequestMapping(value="/", method=RequestMethod.POST)
    public String create(@ModelAttribute Student student) {
        stuService.create(student) ;
        return "success" ;
    }

    /**
     * 根據Id更新一個學生
     * @return
     */
    @RequestMapping(value="/", method=RequestMethod.PUT)
    public String updateStudentById(@ModelAttribute Student student) {
        stuService.updateStudentById(student) ;
        return "success" ;
    }
}

編寫測試RestTest.java

package com.java.test;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.javazhan.RunApplication;

@RunWith(SpringRunner.class)
@SpringBootTest(classes=RunApplication.class)
public class RestTest {
    @Autowired
    private WebApplicationContext context;

    // mock api 模擬http請求
    private MockMvc mvc; 

    @Before
    public void setUp() throws Exception {
        //整合Web環境測試(此種方式並不會整合真正的web環境,而是通過相應的Mock API進行模擬測試,無須啟動伺服器)
        mvc = MockMvcBuilders.webAppContextSetup(context).build();
    }
    @Test
    public void testUserController() throws Exception {
        RequestBuilder request = null ;
        MvcResult mvcResult = null ;
        int status = 500 ;
        // 新增學生
        request = post("/student/").param("name", "李四")
                .param("age", "20")
                .param("address", "哈爾濱") ;
        mvcResult = mvc.perform(request).andReturn() ;  
        status = mvcResult.getResponse().getStatus() ;
        if(status==200) {
            String content = mvcResult.getResponse().getContentAsString() ;  
            System.out.println("新增學生:"+content) ;
        }
        // 查出所有學生
        request = get("/student/") ;
        mvcResult = mvc.perform(request).andReturn() ;  
        status = mvcResult.getResponse().getStatus() ;
        if(status==200) {
            String content = mvcResult.getResponse().getContentAsString() ;  
            System.out.println("查出所有學生:"+content);
        }
        // 根據Id查詢學生
        request = get("/student/1") ;
        mvcResult = mvc.perform(request).andReturn() ;  
        status = mvcResult.getResponse().getStatus() ;
        if(status==200) {
            String content = mvcResult.getResponse().getContentAsString() ;  
            System.out.println("根據Id查詢學生:"+content) ;
        }

        // 根據Id更新一個學生
        request = put("/student/").param("id", "5")
                .param("name", "李四5")
                .param("age", "25")
                .param("address", "哈爾濱5") ;
        mvcResult = mvc.perform(request).andReturn() ;  
        status = mvcResult.getResponse().getStatus() ;
        if(status==200) {
            String content = mvcResult.getResponse().getContentAsString() ;  
            System.out.println("根據Id更新一個學生:"+content) ;
        }

        // 根據id刪除一個學生
        request = delete("/student/6") ;
        mvcResult = mvc.perform(request).andReturn() ;  
        status = mvcResult.getResponse().getStatus() ;
        if(status==200) {
            String content = mvcResult.getResponse().getContentAsString() ;  
            System.out.println("根據id刪除一個學生:"+content) ;
        }


    }
}

編寫RunApplication.java

package com.javazhan;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RunApplication {

    public static void main(String[] args) {
        SpringApplication.run(RunApplication.class, args) ;
    }
}

測試結果

原始碼下載

相關推薦

SpringBoot訪問資料庫原始碼

本文介紹在Spring Boot基礎下配置資料來源和通過JdbcTemplate編寫資料訪問的示例。 簡單介紹一下 @Controller:修飾class,用來建立處理http請求的物件 @RestController:Spring4之後加入的註解,原來在

c# 路-架構筆記1

介面: 只要是繼承了介面的類,都包含了接口裡面的方法。介面是一種類與類之間的規範,一種協議! 架構:通常更側重於巨集觀的設計; 一、物理架構:邏輯架構、開發架構..;要從不同的專案區分析 -----------------------------------------

SpringBoot統一異常處理原始碼

淺談異常處理 在J2EE專案的開發中,不管是對底層的資料庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的、不可預知的異常需要處理。每個過程都單獨處理異常,系統的程式碼耦合度高,工作量大且不好統一,維護的工作量也很大。

SpringBootweb2~使用AOP處理請求日誌

作為Spring兩大核心原理AOP和IOC,什麼是AOP?     eg:下雨了我打開了傘,java和c程式設計師程式設計的區別   AOP利用的是橫切的技術,將面向物件構建的龐大的類的體系進行水平的切割,並且會將影響到多個類的公共行為封

SpringBoot檔案上傳單檔案上傳/多檔案上傳

1.單檔案上傳 private String uploadPath="D:\\tomcat\\apache-tomcat-7.0.81-windows-x64\\apache-tomcat-7

PHP 抽象類abstract、接口interface、Trait特征

包含 中一 man ont 就是 類型 link array ike 抽象類 PHP 5 支持抽象類和抽象方法。定義為抽象的類不能被實例化。 抽象方法只能在抽象類中,抽象類中可以包含非抽象方法 被定義為抽象的方法只是聲明了其調用方式(參數),不能定義其具體的功能實現 繼承

Python學習----第七模塊筆記Web開發Django數據庫操作

long 機制 idt 4.5 gen git 表之間 protoc 小數 4、Django ORM 4.1、連接數據庫 創建Django工程後運行該工程,會在工程根目錄下創建db.sqlite3文件,為Django自帶的sqlite3數據庫(Django自帶的功能也需要數

區塊鏈技術-深入詳解以太坊智慧合約語言 solidity原始碼-熊麗兵-專題視訊課程...

區塊鏈技術進階-深入詳解以太坊智慧合約語言 solidity(含原始碼)—103人已學習 課程介紹         區塊鏈開發技術進階-深入詳解以太坊智慧合約語言 solidity視訊培訓教程:本課

SpringBootweb3~統一異常處理

規定返回結果Result類     我們為了解決邏輯在一個地方處理,另一個地方不需要再接收它返回的資訊,所以我們引入了異常。預設的Exception只接受message的欄位,但我們通常還有code, 所以自定義一個Exception如下:

阿里架構設計初體驗,送給準備架構的朋友個人總結

1 基本概念和目的 架構設計的目的是為了解決系統複雜度帶來的問題,並不是要面面俱到,不需要每個架構都具備高效能、高可用、高擴充套件等特點,而是要識別出實際業務實際情況的複雜點,然後有有針對性地解決問題,即:有的放矢,而不是貪大求全。 在實際情況中,不一定每個系統都要做架

Spring (10)訪問資源2

這裡講的是ClassPathResource類,這個類的好處是它找的資源是類載入路徑下的資源。尤其,尤其是在web應用之中,它可以自動搜尋位於WEB-INF/classes下的資原始檔,這就堪稱神器了。 在一般的java程式中,類載入路徑是不包括到包名的,例如下面這個例子把資原始檔放在c

Spring (9)訪問資源1

Spring提供了一個很膩害的資源訪問介面--Resource,注意,是提供了一個介面,而不是提供了一個類,實際上它提供了好多好多類,這種面向介面程式設計的思想是很酷的~~~~ 閒話少敘,說第一個Resource介面的實現類--UrlResource,這個類通過在構造方法中傳入需要獲取的

SpringBootWeb

一.表單驗證 1.為要校驗的物件新增對應的校驗註解 使用@Min(value=18,message="未成年少女金之入內")標記對應類中的屬性。註解表示age最小值為18,錯誤提示為:未成年少女禁止入內 Girl類例項程式碼 package com.st

SpringBootAOP統一處理http請求日誌

相關注解 1、@Aspect  放在類上面,把該類作為一個切面 2、@Pointcut  放在方法上面,定義一個可被別的方法引用的切入點表示式 3、@Before  放在方法上面,前置通知   方法執行前執行 4、@After   放在方法上面     後置最終通知    

SpringBootJPA實現分頁、排序

---------------repository類程式碼------------ public interface GirlRepository extends JpaRepository<G

學習springBoot 統一異常處理

在實際開發當中我們經常會遇到BUG,所以都會封裝一個異常返回類來使用,提示我們到底是那一步出了問題,方便於我們追蹤問題並且解決問題, 以下舉個新增女孩物件為例子,當新增的女孩物件年齡小於10歲時我們提示該女孩在上小學,大於10歲且小於16歲提示可能在上初中,通過例子說明我們如何對異常統一處理並返

學習springBoot AOP處理請求

AOP概述   如圖中顯示,當我們請求的操作繼續往下走的時候都是相類似的, 那這個時候我們就可以把具體的業務操作程式碼提取出來作為公共的操作,這樣就有了面向切面程式設計AOP       下面來舉例子說明 如何AOP統一處理請求日

學習springBoot 表單驗證

現在用一個新的springBoot專案來繼續學習,所有的配置都是和springBootdemo一樣只是名字換了一下 SpringBootUpgrade 新專案   現在修改一下新增的方法,不在直接傳數值,而是直接傳一個Girl物件到後臺新增 修改後 啟動專案去測

SpringBoot單元測試

1.測試方法 service程式碼 public Girl findOne(Integer id){ return girlRepository.findOne(id); //通過id查詢使用者資訊 } serviceTest程式碼 @RunWith(Sprin

Android使用multidex產生多個dex解決Dex超出方法數65535的限制

1 概述 1.1 為什麼要拆包 隨著應用不斷迭代,業務線的擴充套件,應用越來越大(比如集成了各種第三方sdk或者公共支援的jar包,專案耦合性高,重複作用的類越來越多),出現了一個 dex 包裝不下的情況,出現65536問題。 1.2 為什麼方法數不能