spring boot實現ssm(2)功能

来源:http://www.cnblogs.com/elvinle/archive/2017/12/09/7999094.html
-Advertisement-
Play Games

spring 和 mybatis 整合的那篇: ssm(2) . 配置文件比ssm(1) 更多, 在做項目的時候, 配置文件是一個讓人頭大的事情. 那麼在spring boot中, 實現相同功能, 需不需要做那麼多配置呢. 一. 從pom.xml 開始 pom.xml文件, 直觀的感覺, 就是非常的 ...


spring 和 mybatis 整合的那篇: ssm(2) . 配置文件比ssm(1) 更多, 在做項目的時候, 配置文件是一個讓人頭大的事情.

那麼在spring boot中, 實現相同功能, 需不需要做那麼多配置呢.

 

一. 從pom.xml 開始

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.elvin</groupId>
    <artifactId>boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>boot</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

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

        <!--view : thymeleaf模板-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

        <!--db : 資料庫相關-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

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

        <!--tools : joda-time-->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

pom.xml文件, 直觀的感覺, 就是非常的短, 非常的少. 簡潔

 

二. 配置文件

#配置項目埠和根路徑
server:
  port: 8080
  context-path: /boot

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///test?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  thymeleaf:
     cache: false
logging:
  level: warn
  file: ./boot.log

 

三. 實體類

package org.elvin.boot.pojo;

import javax.persistence.*;

/**
 * author: Elvin
 * Date: 2017/12/4 15:37
 * Description:
 */
@Entity
@Table(name="book")
public class Book {

    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    private String publishTime;

    private Integer price;

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", publishTime='" + publishTime + '\'' +
                ", price=" + price +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPublishTime() {
        return publishTime;
    }

    public void setPublishTime(String publishTime) {
        this.publishTime = publishTime;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }
}

通過註解, 可以映射到數據中的表.  由於在前面設置了 ddl-auto:update , 那麼在每次啟動的時候, 都會去檢測資料庫, 是否有這張表, 如果沒有, 則會新增, 如果有, 則會修改表.

 

四. Repository

package org.elvin.boot.repository;

import org.elvin.boot.pojo.Book;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

/**
 * author: Elvin
 * Date: 2017/12/5 16:58
 * Description:
 */
public interface BookRepository extends JpaRepository<Book, Integer>  {
/*
    @Query()
    public Page<Book> myQuery();*/
}

這裡使用的並不是 mybatis 的寫sql的方式, 但是很大一部分的表操作, jpa 標準 都可以完成, 如果想寫自定義sql, 可以通過方法上加 @Query 註解的方式來寫. 

 

五. service 和實現類

package org.elvin.boot.service;

import org.elvin.boot.pojo.Book;

import java.util.List;

public interface BookService {

    public List<Book> findAll();

    public Book findOne(Integer id);

    public void put(Book book);

    public void remove(Integer id);

}
package org.elvin.boot.serviceimpl;

import org.elvin.boot.pojo.Book;
import org.elvin.boot.pojo.PageInfo;
import org.elvin.boot.repository.BookRepository;
import org.elvin.boot.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * author: Elvin
 * Date: 2017/12/5 17:03
 * Description:
 */
@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookRepository;

    @Override
    public List<Book> findAll(){
       List<Book> list =  bookRepository.findAll();
       return list;
    }

    @Override
    public Book findOne(Integer id){
        Book book = bookRepository.findOne(id);
        return book;
    }

    @Override
    public void put(Book book) {
        bookRepository.save(book);
    }

    @Override
    public void remove(Integer id) {
        bookRepository.delete(id);
    }

}

put在這裡, 承擔 新增 和 修改 的責任. 不管是新增還是修改, 都是調用的 jpa的save方法.

區別在於, 是否傳入了id.

沒有傳id -> 直接新增

傳入了id -> 根據id進行查詢 -> 沒有數據 -> 新增

         |-> 有數據 -> 修改

 

六. controller

返回數據格式, 稍微做了一下封裝.

package org.elvin.boot.pojo;

public interface ResStatus {
   String SUCCESS = "success";
   String FAIL = "fail";
   String ERROR = "error";
}
package org.elvin.boot.pojo;

/**
 * author: Elvin
 * Date: 2017/12/6 10:40
 * Description:
 */
public class ResObj {
    private String msg;

    private Integer Code;

    private Object obj;

    public ResObj() {
    }

    public ResObj(String msg, Integer code, Object obj) {
        this.msg = msg;
        Code = code;
        this.obj = obj;
    }

    @Override
    public String toString() {
        return "ResObj{" +
                "msg='" + msg + '\'' +
                ", Code=" + Code +
                ", obj=" + obj +
                '}';
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Integer getCode() {
        return Code;
    }

    public void setCode(Integer code) {
        Code = code;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }
}

再來看controller.

package org.elvin.boot.controller;

import org.elvin.boot.pojo.Book;
import org.elvin.boot.pojo.ResObj;
import org.elvin.boot.pojo.ResStatus;
import org.elvin.boot.service.BookService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * author: Elvin
 * Date: 2017/12/6 10:36
 * Description:
 */
@RestController
@RequestMapping("third")
public class ThirdController {

    private Logger logger = LoggerFactory.getLogger(ThirdController.class);

    @Autowired
    private BookService bookService;

    @PostMapping("put")
    public ResObj put(Book book){
        ResObj res = new ResObj(ResStatus.FAIL, 0, null);
        try{
            bookService.put(book);
            res.setMsg(ResStatus.SUCCESS);
            res.setCode(1);
            res.setObj(book);
        }
        catch (Exception e){
            logger.error(e.getMessage());
        }

        return res;
    }

    @PostMapping("delete/{id}")
    public ResObj delete(@PathVariable Integer id){
        ResObj res = new ResObj(ResStatus.FAIL, 0, null);
        try{
            bookService.remove(id);
            res.setMsg(ResStatus.SUCCESS);
            res.setCode(1);
        }
        catch (Exception e){
            logger.error(e.getMessage());
        }

        return res;
    }

    @RequestMapping(value = "getAll", method = {RequestMethod.GET, RequestMethod.POST })
    public ResObj getAll(){
        ResObj res = new ResObj(ResStatus.FAIL, 0, null);
        try{
            res.setObj(bookService.findAll());
            res.setMsg(ResStatus.SUCCESS);
            res.setCode(1);
        }
        catch (Exception e){
            logger.error(e.getMessage());
        }

        return res;
    }

    @RequestMapping(value = "getById/{id}", method = {RequestMethod.GET, RequestMethod.POST })
    public ResObj getById(@PathVariable Integer id){
        ResObj res = new ResObj("fail", 0, null);
        try{
            res.setObj(bookService.findOne(id));
            res.setMsg(ResStatus.SUCCESS);
            res.setCode(1);

            /*int a = 0;
            int c = 1 / a;*/
        }
        catch (Exception e){
            logger.error(e.getMessage());
        }

        return res;
    }
}

 

七. 結果

 

 

首先新增一條數據, 然後再查詢出來, 沒有啥問題. 然後調用同樣的方法, 修改數據

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • //多個值同時變化function getStyle(obj, name)//函數幫助獲取不在行間樣式,不受非行間border,padding等得影響{ //style只獲取行間樣式。offset受非行間border,padding等得影響 if(obj.currentStyle) { return ...
  • 1.JS事件的基本知識 JS事件的學習和JS方法的學習揉雜在一起,JS相對於Java等語言,方法定義和使用上比較隨意和簡單,但是還是有一些區別,需要理清楚. 2.jQuery方式綁定事件 這裡多多贅述一點,由於jQuery可以理解為是對JS的一種高級封裝,這種封裝是單向的,所以我們可以在JS中加入j ...
  • 地圖與地理定位 定位在大部分項目中都需要實現,如何實現主要有如下的幾種方法 1. H5定位 在HTML5中navigator有很強大的功能,其中就有定位的方法 這個服務其實是谷歌提供的,在我們國內使用的可能性較低 2. 後端定位 前端調用一個後端提供的介面,後端進行定位操作,返回給前端 在工作中公司 ...
  • 基礎數據結構與演算法 現在有兩個不同的JSON,比較複雜,可以參考這裡的DEMO中返回的JSON。要比較它們的差異,除了用現成的工具如beyond compare以外,如果我們的機器上沒有安裝這個工具,能如何較快解決?作為一個程式員,一個個對比是不可行的,對比完也不會有什麼收穫。我會把之放進Excel ...
  • 跨域問題的產生: 因為瀏覽器有同源策略,只有在同功能變數名稱,同埠,同協議的情況下才可以進行數據交互;有的時候,例如:在公司開發項目的時候,前端開發的伺服器可能和後端伺服器不是同一個,因為可能是通過gulp、webpack搭建的開發伺服器,就需要解決跨域問題,再例如,在大公司數據伺服器不只有一個,所以跨域 ...
  • 大整數的四則運算已經是老生常談的問題了。很多的庫也已經包含了各種各樣的解決方案。 作為練習,我們從最簡單的加減法開始。 加減法的核心思路是用倒序數組來模擬一個大數,然後將兩個大數的利用豎式進行運算。 加法函數: 異符號相加時調用減法函數(減法函數後面給出) 同符號相加先確定符號 因為輸入輸出的為字元 ...
  • 作者根據JavaScript紅皮書,結合簡單的測試,比較全面的總結了JavaScript中Array(數組)類型的相關知識。 ...
  • 一、概念 將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。 二、模式動機 組合模式,通過設計一個抽像的組件類,使它既代表葉子對象,又代表組合對象,將葉子對象和組合對象統一起來。使得客戶端在操作時不再區分當前操作的是葉子對象還是組合對象,而是以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...