1. 程式人生 > >Spring Boot + MyBatis 電商專案 -04- 使用 Spring MVC 讀取使用者資訊、篩選欄位

Spring Boot + MyBatis 電商專案 -04- 使用 Spring MVC 讀取使用者資訊、篩選欄位

Spring Boot + MyBatis 電商專案 -04- 使用 Spring MVC 讀取使用者資訊、篩選欄位

前幾篇文章:

(如果不是新手,建議至少看完第 3 篇,因為整個專案是基於第三篇建立的很多檔案進行的)

本篇功能:


(1)基於上一篇的內容,完成獲取兩個表全部資訊,和只顯示部分欄位
(2)在使用 Spring MVC 時,如何在隱藏資料庫中的部分欄位,也就是 User 的部分屬性?
(3)本篇思想是通過下面這種方式轉換資料物件:

BeanUtils.copyProperties(userModel,userVO);

將含有全部屬性的 userModel,轉換為含有部分屬性的 userVO

在這裡插入圖片描述

一、先在資料庫插入幾條資料

上一次,只有一條,我們可以連線了,多插入幾條:

二、構建專案,配置檔案原始碼

(1)先構建專案結構,建立目錄,建立類,介面以及配置檔案,內容下面會有

老規矩,先看一下,整個的專案結構:

熟悉 Spring 的話,應該會知道,這裡找兩個包,controller 和 service 我們手動建立專案結構。

(2)pom.xml 檔案(第 2 篇介紹過,可以在對照一下):


<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <
scope
>
test</scope> </dependency> <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>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> </dependencies>

(3)application.properties 檔案:

#自定義埠
server.port=8090

mybatis.mapper-locations=classpath:mapping/*.xml

spring.datasource.name=miaosha
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/miaosha?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=xiaopengwei

# 使用 druid 資料來源

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

(3)generatorConfig.xml 檔案(自動生成 DO,DAO,Mapping.xml 檔案,不想用自動生成工具也可以,下面會貼出原始碼,但是最好學會如何生成,因為每個專案,都是根據相應的資料庫欄位生成的,還是非常方便的):

使用步驟: mybatis-generator 詳細配置及使用,爬坑記錄

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

    <!-- context 是逆向工程的主要配置資訊 -->
    <!-- id:起個名字 -->
    <!-- targetRuntime:設定生成的檔案適用於那個 mybatis 版本 -->
    <context id="default" targetRuntime="MyBatis3">


        <!--jdbc的資料庫連線-->
        <!--這裡是以變數的形式定義,具體的值在 application.properties 檔案中-->
        <!--jdbc:mysql://localhost:3306/資料庫名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/miaosha?serverTimezone=UTC"
                        userId="root"
                        password="xiaopengwei">
        </jdbcConnection>

        <!-- targetPackage:生成的實體類所在的包 -->
        <!-- targetProject:生成的實體類所在的硬碟位置 -->
        <!-- DataObject 類存放位置 -->
        <javaModelGenerator targetPackage="com.miaoshapro.dataobject"
                            targetProject=".\src\main\java">
            <!-- 是否允許子包 -->
            <property name="enableSubPackages" value="false" />
            <!-- 是否對modal新增建構函式 -->
            <property name="constructorBased" value="true" />
            <!-- 是否清理從資料庫中查詢出的字串左右兩邊的空白字元 -->
            <property name="trimStrings" value="true" />
            <!-- 建立modal物件是否不可改變 即生成的modal物件不會有setter方法,只有構造方法 -->
            <property name="immutable" value="false" />
        </javaModelGenerator>

        <!-- targetPackage 和 targetProject:生成的 mapper 檔案的包和位置 -->
        <sqlMapGenerator targetPackage="mapping"
                         targetProject=".\src\main\resources">
            <!-- 針對資料庫的一個配置,是否把 schema 作為字包名 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- targetPackage 和 targetProject:生成的 interface 檔案的包和位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.miaoshapro.dao" targetProject=".\src\main\java">
            <!-- 針對 oracle 資料庫的一個配置,是否把 schema 作為字包名 -->
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!--生成對應表及類名-->
        <table tableName="user_info" domainObjectName="UserDO"
               enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
        enableSelectByExample="false">
        </table>
        <table tableName="user_pwd" domainObjectName="UserPwdDO"
               enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false">
        </table>
    </context>
</generatorConfiguration>

三、src/main/java 下檔案原始碼

(1)Controller/UserController.java 檔案:

package com.miaoshapro.controller;

import com.miaoshapro.controller.viewobject.UserVO;
import com.miaoshapro.service.UserService;
import com.miaoshapro.service.model.UserModel;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller("user")
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    //關聯查詢,獲取使用者資訊表和密碼錶全部資訊
    @RequestMapping("/getall")
    @ResponseBody
    public UserModel getUser(@RequestParam(name = "id")Integer id){
        //呼叫 service 服務獲取對應 id 的使用者物件並返回給前端
        UserModel userModel = userService.getUserById(id);

        //將核心領域模型使用者物件轉化為可供 UI 使用的 viewobject
        return userModel;
    }

    //通過轉換成只含有部分屬性的 userModel
    @RequestMapping("/get")
    @ResponseBody
    public UserVO getUserVo(@RequestParam(name = "id")Integer id){
        //呼叫 service 服務獲取對應 id 的使用者物件並返回給前端
        UserModel userModel = userService.getUserById(id);

        //將核心領域模型使用者物件轉化為可供 UI 使用的 viewobject
        return convertFormModel(userModel);
    }


    //userModel 擁有資料庫中的所有欄位,但是前端顯示不能顯示所有欄位
    //所以在 controller/viewobject 中新建了一個 UserVO 模型,只存放部分欄位對應的屬性
    private UserVO convertFormModel(UserModel userModel){
        if (userModel == null){
            return null;
        }
        UserVO userVO = new UserVO();

        //轉換的方法
        BeanUtils.copyProperties(userModel,userVO);
        return userVO;

    }

}

(2)controller/viewobject/UserVO.java 檔案:

package com.miaoshapro.controller.viewobject;

public class UserVO {

    private Integer id;
    private String uname;
    private Byte gender;
    private Integer age;
    private String phone;

    public Integer getId() {
        return id;
    }

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

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Byte getGender() {
        return gender;
    }

    public void setGender(Byte gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

(3)service/UserService.java 檔案:

package com.miaoshapro.service;

import com.miaoshapro.service.model.UserModel;

public interface UserService {

    //通過使用者 id 獲取使用者物件的方法
    UserModel getUserById(Integer id);


}

(4)service/impl/UserServiceImpl.java 檔案:

package com.miaoshapro.service.impl;

import com.miaoshapro.dao.UserDOMapper;
import com.miaoshapro.dao.UserPwdDOMapper;
import com.miaoshapro.dataobject.UserDO;
import com.miaoshapro.dataobject.UserPwdDO;
import com.miaoshapro.service.UserService;
import com.miaoshapro.service.model.UserModel;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDOMapper userDOMapper;

    @Autowired
    private UserPwdDOMapper userPwdDOMapper;

    @Override
    public UserModel getUserById(Integer id) {

        //通過 userDOMapper 獲取到對應的使用者 dataObject
        UserDO userDO = userDOMapper.selectByPrimaryKey(id);
        if (userDO == null){
            return null;
        }
        //通過使用者 id 獲取密碼資訊
        UserPwdDO userPwdDO = this.userPwdDOMapper.selectByUserId(userDO.getId());
        return convertFromDataObject(userDO,userPwdDO);

    }

    //
    private UserModel convertFromDataObject(UserDO userDO, UserPwdDO userPwdDO){

        if (userDO == null){
            return null;
        }
        UserModel userModel = new UserModel();
        BeanUtils.copyProperties(userDO,userModel);

        if (userPwdDO != null){
            userModel.setEncrptPassword(userPwdDO.getUpwd());
        }
        return userModel;
    }

}

(5)service/model/UserModel.java 檔案:

package com.miaoshapro.service.model;

public class UserModel {

    private Integer id;
    private String uname;
    private Byte gender;
    private Integer age;
    private String phone;
    private String registerMode;
    private String thirdPartyId;

    private String encrptPassword;

    public Integer getId() {
        return id;
    }

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

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Byte getGender() {
        return gender;
    }

    public void setGender(Byte gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getRegisterMode() {
        return registerMode;
    }

    public void setRegisterMode(String registerMode) {
        this.registerMode = registerMode;
    }

    public String getThirdPartyId() {
        return thirdPartyId;
    }

    public void setThirdPartyId(String thirdPartyId) {
        this.thirdPartyId = thirdPartyId;
    }

    public String getEncrptPassword() {
        return encrptPassword;
    }

    public void setEncrptPassword(String encrptPassword) {
        this.encrptPassword = encrptPassword;
    }
}

四、mybatis-generator 自動生成的檔案原始碼

更多文章連結

支援博主

我正在參加 CSDN 2018 年部落格之星評選,希望大家能支援我,
我是【No. 001】號 肖朋偉 ,感謝大家寶貴的一票 ^_^/
投票地址:https://bss.csdn.net/m/topic/blog_star2018/index