Spring Boot + MyBatis 電商專案 -04- 使用 Spring MVC 讀取使用者資訊、篩選欄位
阿新 • • 發佈:2019-01-13
Spring Boot + MyBatis 電商專案 -04- 使用 Spring MVC 讀取使用者資訊、篩選欄位
前幾篇文章:
(如果不是新手,建議至少看完第 3 篇,因為整個專案是基於第三篇建立的很多檔案進行的)
- Spring Boot + MyBatis 電商專案 - 01- 開題 + 建立專案
- Spring Boot + MyBatis 電商專案 - 02- 引入 Spring Boot 依賴包
- Spring Boot + MyBatis 電商專案 - 03- MySQL 連線、DRUID、MyBatis-generator 配置及測試
本篇功能:
(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