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