SpringBoot + Mybatis搭建完整的項目架構


准備工作:

  • Java開發環境 
  • 已安裝 springboot 插件(STS)的 Eclipse
  • MySQL服務

 一、 創建 springboot 項目

1. 打開Eclipse  --> 左上角 File --> New --> Other ,到如下界面

如果沒有 Spring Starter Project 這個選項,說明 Eclipse 的 springboot 插件沒安裝成功。本人win10系統,用 Eclipse 4.10、4.12 版本,

各嘗試過在線安裝、離線安裝,都沒有安裝成功(有Spring/Spring Boot選項,但是沒有Spring Starter Project)。最后使用Eclipse 4.7版

本才成功裝上,找遍網上都沒發現有人遇到過這個問題,真是服啦。

 2. 選擇Spring Starter Project ,點擊 Next,進入如下界面

 

3. 填寫項目名稱--Name選項,我這里改為 SpringBootDemo;

    填寫包名--Package,我這里填寫的是com.delav,其他的可以默認,點擊 Next,進入如下界面

 

4. 勾選 Spring Web Starter 復選框,點擊 Finish,可以看到項目的目錄如下(忽略 log 目錄)

如果發現 pom.xml 有個紅叉,打開 pom.xml 文件后,紅叉提示在第一行。這是 maven 的版本導致的,

解決方法是指定 maven 的版本,在 pom.xml 中找到如下這個標簽

    <properties>
        <java.version>1.8</java.version>
    </properties>

添加一行來指定版本,添加后如下

    <properties>
        <maven-jar-plugin.version>3.0.0</maven-jar-plugin.version>
        <java.version>1.8</java.version>
    </properties>

然后紅叉就沒了,不然項目運行不了。

好了,一個 springboot 空項目創建好了,接下來就是在這個空的項目中填充東西進去了。

 

二、 完善詳細目錄結構與編碼

如下圖,在 com.delav (包)下,創建四個子包 controller、entity、mapper、service.

controller:接收請求

entity:存放 Java Bean 類

mapper:關聯 SQL 語句

service:處理業務邏輯

純屬個人理解,處理流程:controller --> service --> mapper (entity的bean類用來存放和獲取數據)

 

1.創建數據表

一個項目的第一步,都應該是先設計數據庫,先設計一個表 user。

create table user(
    id int(16) not null auto_increment
    ,userName varchar(32) not null
    ,passWord varchar(32) not null
    ,realName varchar(64)
    ,primary key(id)
 ) engine=myisam default charset=utf8;           

然后插入幾條數據

insert into user 
    (userName,passWord,realName) 
    values
    ("aaa","111","admin")
....

最后表的數據是這樣,它位於名叫 'java' 的數據庫中

 

2.修改配置文件 

修改 pom.xml。在這個配置文件中引入 mybatis、mysql 等依賴包,整個文件全部配置如下

<?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>com.delav</groupId>
    <artifactId>SpringBootDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootDemo</name>
    <description>Demo project for Spring Boot</description>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <maven-jar-plugin.version>3.0.0</maven-jar-plugin.version>
        <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>
        
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>    
            <artifactId>mybatis-spring-boot-starter</artifactId>   
            <version>1.3.1</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

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

</project>

修改 resource 目錄下 application.properties 文件。由於現在流行使用 .yml 來配置,就嘗試一下這種配置,刪除 application.properties,

並新建一個 application.yml 和  application-dev.yml 文件。

 application.yml文件內容如下。通過修改 active 的值可配多套環境,這里表示使用 application-dev.yml 的配置。如果再新建一個 application-test.yml ,

再把 dev 改為 test ,就表示使用 application-test.yml 的配置。

spring:
  profiles:
    active: dev

 application-dev.yml文件的內容如下,四個大塊分別配置了端口號、MySQL數據庫信息、mybatis信息、日志信息

server:
  port: 8080
  
spring:
  datasource:
    username: root
    password: 666666
    url: jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:com/delav/mapper/*Mapper.xml
  type-aliases-package: com.delav.entity
  
logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n"    
    file: "%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n"     
  file: log/info.log
  level:
    com: 
      delav: 
        info

 

3. 在 com.delav.entity 包下新建 User.java,內容如下

package com.delav.entity;

/**
 * @author Delav
 * @date   2019/06/27
 */
public class User {
    private Integer id;
    private String userName;
    private String passWord;
    private String realName;
    
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    public String getUserName() {
        return userName;
    }
    
    public void setUserName(String userName) {
        this.userName = userName;
    }
    
    public String getPassWord() {
        return passWord;
    }
    
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    
    public String getRealName() {
        return realName;
    }
    
    public void setRealName(String realName) {
        this.realName = realName;
    }
}

 

4.在 com.delav.mapper包下新建 UserMapper.java 和 UserMapper.xml

UserMapper.java

package com.delav.mapper;

import com.delav.entity.User;

//import com.delav.mapper.IBaseMapper;

public abstract interface UserMapper {
    
    public abstract int InsertUser(User params);
    
    public abstract User SelectUser(int id);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.delav.mapper.UserMapper">
    
    <resultMap id="BaseResultMap" type="com.delav.entity.User">
        <result column="id" jdbcType="INTEGER" property="id" />
        <result column="userName" jdbcType="VARCHAR" property="userName" />
        <result column="passWord" jdbcType="VARCHAR" property="passWord" />
        <result column="realName" jdbcType="VARCHAR" property="realName" />
    </resultMap>
    
    <select id="SelectUser" resultType="com.delav.entity.User">
        select * from user where id = #{id}
    </select>
    
    <insert id="InsertUser" parameterType="com.delav.entity.User" useGeneratedKeys="true" keyProperty="id">
        insert into user (userName,passWord,realName) 
                         values
                         (#{userName},#{passWord},#{realName})
    </insert>
    
</mapper>

 

5. 在 com.delav.service 包下新建 UserService.java,內容如下

package com.delav.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.delav.entity.User;
import com.delav.mapper.UserMapper;

/**
 * @author Delav
 * @date   2019/06/27
 */
@Service
public class UserService {
    
    // 日志器
    private static final Logger logger = LoggerFactory.getLogger(UserService.class);
    
    @Autowired
    UserMapper userMapper;
    
    public String Sel(int id) {
        logger.info("開始查詢數據");
        User user = userMapper.SelectUser(id);
        String result = "{" +
                "id=" + user.getId().toString() +
                ", userName='" + user.getUserName() + '\'' +
                ", passWord='" + user.getPassWord() + '\'' +
                ", realName='" + user.getRealName() + '\'' +
                '}';
                
        return result;
    }
    
    public int Ins(User params) {
        logger.info("開始提交數據");
        Integer result = userMapper.InsertUser(params);
        //能獲取插入的id是因為UserMapper.xml的insert語句新增了useGeneratedKeys和keyProperty參數
        Integer insertId = params.getId();
        System.out.println("插入數據的ID: " + insertId);
        System.out.println("insert結果: " + result);
        // insert返回結果為 1,表示插入了一條數據
        if (result == 1) {
            return insertId;
        } else {
            return 0;
        }
    }
}

 

6. 在 com.delav.controller包下新建 UserController.java,內容如下

package com.delav.controller;

import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.JsonNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

import com.delav.service.UserService;
import com.delav.entity.User;


/**
 * @author Delav
 * @date   2019/06/27
 */
@RestController
@RequestMapping("/testSpring")
public class UserController {
    
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);
    @Autowired
    private UserService userService;
    
    @RequestMapping(value= {"getUser/{id}"}, method={org.springframework.web.bind.annotation.RequestMethod.GET})
    public String GetUser(@PathVariable int id) {
        logger.info("查詢數據ID為: " + id);
        String result = userService.Sel(id);
        logger.info("查詢數據成功");
        return result;
    }

    @RequestMapping(value= {"postUser"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
    public String PostUser(@RequestBody String params) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = mapper.readTree(params);
        logger.info("解析數據成功");
        User user = new User();
        // user.setId(rootNode.path("id").asInt());
        user.setUserName(rootNode.path("userName").asText());
        user.setPassWord(rootNode.path("passWord").asText());
        user.setRealName(rootNode.path("realName").asText());
        logger.info("數據轉為實體bean成功");
        Integer result = userService.Ins(user);
        if (result != 0) {
            logger.info("數據入庫成功");
            return "Commit Success";
        } else {
            logger.info("數據入庫失敗");
            return "Commit Fail";
        }
        
    }
}

 

7. 在 com.delav包下的啟動文件SpringBootDemoApplication.java,添加一個注解,讓項目啟動的時候掃描 mapper 的路徑,內容如下

package com.delav;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages="com.delav.mapper")
public class SpringBootDemoApplication {

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

}

添加了 @MapperScan(basePackages="com.delav.mapper")

 

整個項目已經完成了。現在可以啟動項目,然后測試一下它的兩個接口。我這里使用的是 Postman 來測試

啟動: 選中該項目 --> 單擊右鍵 --> Run As --> Spring Boot App,啟動成功如下。輸出格式這樣是因為在application-dev.yml的日志信息配置中改了輸出格式

 

Postman測試 get 請求如下:

 控制台輸出:

 

Postman測試 post 請求如下:

 

控制台輸出:

看下數據庫是否新增了這條數據,確實新增了記錄

 

三、單元測試

 

1. 編寫單元測試代碼

沒有裝有Postman,那我們就寫個單元測試來測一下

進入 src 的 test 目錄,找到 com.delav 下的 SpringBootDemoApplicationTests.java,編寫內容如下

package com.delav;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import java.util.HashMap;

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.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoApplicationTests {
    
    @Autowired
    private WebApplicationContext wac;
    // 模擬對Controller發起請求的對象
    private MockMvc mvc;
    
    @Before
    public void Setup() throws Exception {
        // mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
        mvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }
    
    @Test
    public void getTest() throws Exception {
        
          HashMap<String, String> result = new HashMap<String, String>(); 
          // 請求ID和對應的預期結果
          result.put("1", "{id=1, userName='aaa', passWord='111', realName='admin'}");
          result.put("2", "{id=2, userName='bbb', passWord='222', realName='admin'}");
          result.put("3", "{id=3, userName='ccc', passWord='333', realName='admin'}");
          result.put("5", "{id=5, userName='tom', passWord='999', realName='delav'}");
          
          for (String key: result.keySet()) { 
              // 執行請求 
              String path ="/testSpring/getUser/" + key; 
              System.out.println("請求URL: " + path);
              mvc.perform(MockMvcRequestBuilders.get(path)
                              .contentType(MediaType.APPLICATION_JSON_UTF8)
                              .accept(MediaType.APPLICATION_JSON)
                      ) 
                      // 響應狀態 
                      .andExpect(status().isOk()) 
                      // 響應內容
                      .andExpect(content().string(equalTo(result.get(key)))); 
              }     
    }
    
    @Test
    public void postTest() throws Exception {
        
        String params = "{\"userName\":\"tom\", \"passWord\":\"999\", \"realName\":\"333\"}";
        
        mvc.perform(MockMvcRequestBuilders.post("/testSpring/postUser")
                        .accept(MediaType.APPLICATION_JSON_UTF8)
                        .content(params)
                )
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Commit Success")));
    }
        
}

 

2. 運行測試

選中該項目 --> 單擊右鍵 --> Run As --> JUnit Test ,結果如下

 

該Demo的github地址:https://github.com/delav/SpringBootDemo

這個項目會不斷更新,當你閱讀該文章時,可能會跟該文章不一樣。

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM