该系列为imooc Java数据库开发与实战应用中MyBatis课程笔记,跟随课程加入自己见解,同时也为项目中碰到一些问题做了解答
本章是演示处理实体类的属性与数据表中的字段不一致的情况
一、修改Users类准备实验数据,让问题出现
- 修改Users类中的username变为name
package com.damu.entity;
import java.util.Date;
public class Users {
private Integer id; // 用户编号
// private String username; // 登录账号
private String name; // 登录账号
private String userpass; // 登录密码
private String nickname; // 用户昵称
private Integer age; // 用户年龄
private String gender; // 用户性别
private String email; // 用户邮箱
private String phone; // 联系方式
private Date createTime; // 创建时间
private Date updateTime; // 账号最后修改时间
private Date lastLogTime; // 用户最后登录时间
private Integer userStatus; // 用户账号状态 0 正常 1 锁定 2 删除
private String remark; // 用户备注信息
public Users() {
}
public Users(Integer id) {
this.id = id;
}
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 getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Date getLastLogTime() {
return lastLogTime;
}
public void setLastLogTime(Date lastLogTime) {
this.lastLogTime = lastLogTime;
}
public Integer getUserStatus() {
return userStatus;
}
public void setUserStatus(Integer userStatus) {
this.userStatus = userStatus;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
- 修改detail.jsp中username变为name
<%--
Created by IntelliJ IDEA.
User: 35208
Date: 2021/4/7
Time: 0:58
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>慕课网用户管理中心</title>
<link rel="stylesheet" href="lib/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="lib/2.2.4/jquery-1.12.4.min.js"></script>
<script src="lib/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>慕课网管理后台<small>用户数据管理中心</small></h1>
</div>
</div>
<div class="row">
<div class="jumbotron">
<h1>MyBstis基础入门课程</h1>
<p>通过一个项目来完成基础部分学习</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">查看更多,请上慕课网</a></p>
</div>
</div>
<c:set var="user" value="${user}"></c:set>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<form class="form-horizontal">
<div class="form-group">
<label class="col-sm-2 control-label">用户账号</label>
<div class="col-sm-10">
<%-- <p class="form-control-static">${user.username}</p>--%>
<p class="form-control-static">${user.name}</p>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">登录密码</label>
<div class="col-sm-10">
<p class="form-control-static">******</p>
</div>
</div>
<div class="form-group">
<label for="nickname" class="col-sm-2 control-label">昵称</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="nickname" value="${user.nickname}" name="nickname" placeholder="请输入昵称">
</div>
</div>
<div class="form-group">
<label for="age" class="col-sm-2 control-label">年龄</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="age" value="${user.age}" name="age" placeholder="请输入年龄">
</div>
</div>
<div class="form-group">
<label for="gender" class="col-sm-2 control-label">性别</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="gender" value="${user.gender}" name="gender" placeholder="请输入性别">
</div>
</div>
<div class="form-group">
<label for="phone" class="col-sm-2 control-label">联系方式</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="phone" value="${user.phone}" name="phone" placeholder="请输入联系方式">
</div>
</div>
<div class="form-group">
<label for="email" class="col-sm-2 control-label">邮箱</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="email" value="${user.email}" name="email" placeholder="请输入邮箱">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">账号创建时间</label>
<div class="col-sm-10">
<p class="form-control-static">
<fmt:formatDate value="${user.createTime}" pattern="yyyy-MM-dd"></fmt:formatDate>
</p>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">最后修改时间</label>
<div class="col-sm-10">
<p class="form-control-static">
<fmt:formatDate value="${user.updateTime}" pattern="yyyy-MM-dd"></fmt:formatDate>
</p>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">最后登录时间</label>
<div class="col-sm-10">
<p class="form-control-static">
<fmt:formatDate value="${user.lastLogTime}" pattern="yyyy-MM-dd"></fmt:formatDate>
</p>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">用户状态</label>
<div class="col-sm-10">
<c:if test="${user.userStatus == 0}">
<td>正常</td>
</c:if>
<c:if test="${user.userStatus == 1}">
<td>锁定</td>
</c:if>
<c:if test="${user.userStatus == 2}">
<td>删除</td>
</c:if>
</div>
</div>
<div class="form-group">
<label for="remark" class="col-sm-2 control-label">备注</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="remark" value="${user.remark}" name="remark" placeholder="请输入备注">
</div>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
- 修改index.jsp中username变为name
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>慕课网用户管理中心</title>
<link rel="stylesheet" href="lib/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="lib/2.2.4/jquery-1.12.4.min.js"></script>
<script src="lib/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>慕课网管理后台<small>用户数据管理中心</small></h1>
</div>
</div>
<div class="row">
<div class="jumbotron">
<h1>MyBstis基础入门课程</h1>
<p>通过一个项目来完成基础部分学习</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">查看更多,请上慕课网</a></p>
</div>
</div>
<div class="row">
<table class="table table-hover table-striped">
<tr>
<th>用户编号</th>
<th>登录账号</th>
<th>用户昵称</th>
<th>邮箱</th>
<th>联系方式</th>
<th>账号创建时间</th>
<th>用户状态</th>
<th>操作</th>
</tr>
<c:forEach var="user" items="${usersList}">
<tr>
<td>${user.id}</td>
<%-- <td>${user.username}</td>--%>
<td>${user.name}</td>
<td>${user.nickname}</td>
<td>${user.email}</td>
<td>${user.phone}</td>
<td>${user.createTime}</td>
<c:if test="${user.userStatus == 0}">
<td>正常</td>
</c:if>
<c:if test="${user.userStatus == 1}">
<td>锁定</td>
</c:if>
<c:if test="${user.userStatus == 2}">
<td>删除</td>
</c:if>
<td>
<a href="${pageContext.request.contextPath}/detail?id=${user.id}">查看</a>
<a href="">修改</a>
<a href="">删除</a>
</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</body>
</html>
问题出现
这个时候启动项目,可以看见项目列表页与用户详情页中,其他信息都正常显示,只有属性与字段不一致的信息不显示了
二、查找原因
打开usersMapper
<?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属性是用来配置命名空间,主要进行session级别的缓存管理,命名空间默认情况下,使用我们当前操作的实体类的全路径
-->
<mapper namespace="com.damu.entity.Users">
<select id="findUsers" resultType="com.damu.entity.Users">
select * from users
<if test="id !=null">
where id =#{id}
</if>
</select>
<!-- <select id="findById" resultType="com.damu.entity.Users">-->
<!-- select * from users where id =#{id}-->
<!-- </select>-->
</mapper>
常规情况下resultType是与我们数据库中的表中字段名称一一对应,如果说出现不一致,则Mybatis则不会对该字段进行对应关系的配置(比如我们刚才发现的问题,登录账号显示不了),此时需要我们手工进行映射关系的配置
三、解决问题
修改usersMapper文件,添加resultMap标签配置
resultMap标签配置,自定义映射关系集合:主要包含对于一些自定义操作的配置,如不一致的属性和字段
id作为唯一识别,type表示在resultMap中保存的是什么数据
<resultMap id="forUsers" type="com.damu.entity.Users">
该标签下id标签,用于绑定id主键,将Users的id属性与数据库中users表的id主键绑定
<id property="id" column="id"></id>
该标签下result标签,用于配置普通属性,column表示配置的是数据库字段名称,property配置的是实体类的属性名称
<result column="username" property="name"></result>
column表示配置的是数据库字段名称 property配置的是实体类的属性名称
使用resultMap标签
把原来select标签中的resultType换成resultMap,resultType与resultMap同时只能出现一个
现在看看我们的usersMapper
<?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属性是用来配置命名空间,主要进行session级别的缓存管理,命名空间默认情况下,使用我们当前操作的实体类的全路径
-->
<mapper namespace="com.damu.entity.Users">
<!--<select id="findUsers" resultType="com.damu.entity.Users">-->
<!--resultType与resultMap同时只能出现一个-->
<select id="findUsers" resultMap="forUsers">
select * from users
<if test="id !=null">
where id =#{id}
</if>
</select>
<!-- 自定义映射关系集合:主要包含对于一些自定义操作的配置,如不一致的属性和字段 -->
<resultMap id="forUsers" type="com.damu.entity.Users">
<!-- 绑定id主键 -->
<!--<id property="id" column="id"></id>-->
<!-- result配置,主要配置普通属性,column表示配置的是数据库字段名称 property配置的是实体类的属性名称 -->
<result column="username" property="name"></result>
</resultMap>
<!-- <select id="findById" resultType="com.damu.entity.Users">-->
<!-- select * from users where id =#{id}-->
<!-- </select>-->
</mapper>
启动项目
此时登录账号的这个字段已经正常显示了