1. 用户列表分页查询实现
核心
- 使用pageHelper实现分页
@GetMapping(value = "api/users")
//分页的参数可以不传, 不传就默认设置为1
public R userPage(@RequestParam(value = "current", required = false) Integer current) {
if (current == null) {
current = 1;
}
PageInfo<TUser> pageInfo = userService.getUserByPage(current);
return R.OK(pageInfo);
}
PageInfo<TUser> getUserByPage(Integer current);
//用户列表分页查询实现
@Override
public PageInfo<TUser> getUserByPage(Integer current) {
//每个方法前用startPage设置一下分页参数
PageHelper.startPage(current, Constants.PAGE_SIZE);
List<TUser> list = tUserMapper.selectUserByPage();
//用户对象封装到list , list进一步封装到PageInfo里并返回
//pageInfo可以获得一些分页参数,如总页数、总记录数、当前页数
PageInfo<TUser> tUserPageInfo = new PageInfo<>(list);
return tUserPageInfo;
}
<select id="selectUserByPage" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from dlyk.t_user
</select>
2. 查询用户详情
核心:
-
将这个用户在表中的所有字段展示出来(密码除外)
-
相应地带来第二个问题, 如果只是简单查询一次用户表, 只能得到创建人, 编辑人的id, 这当然不合理 , 我们想要直接看到创建人的姓名. 这就需要多表一对一查询.
2.1 先获得所有信息
//查询用户详情, 路径传参
@GetMapping(value = "api/user/{id}")
public R userDetail(@PathVariable(value = "id") Integer id) {
TUser tUser = userService.getUserById(id);
return R.OK(tUser);
}
TUser getUserById(Integer id);
@Override
public TUser getUserById(Integer id) {
return tUserMapper.selectByPrimaryKey(id);
}
这个方法已经自动生成好了, mapper接口和mapperxml都已经有了
TUser selectByPrimaryKey(Integer id);
2.2 解决一对一映射
既然MB生成的mapper接口方法和mapperxml无法实现需求, 就手动写
- 修改UserServiceImpl中的mapper接口方法调用
@Override
public TUser getUserById(Integer id) {
//selectDetailById是自定义的方法
return tUserMapper.selectDetailById(id);
}
- mapper接口和mapperxml
<select id="selectDetailById" parameterType="java.lang.Integer" resultMap="BaseResultMap">
<!--@mbg.generated-->
select
tu.*,
tu2.name createByName,
tu3.name editByName
<!-- 一(user)对一(user), 只知道创建人的id, 要查创建人的姓名, 当然还是要从user表中查
一-->
from dlyk.t_user tu left join dlyk.t_user tu2 on tu.create_by = tu2.id
left join dlyk.t_user tu3 on tu.edit_by = tu3.id
where id = #{id,jdbcType=INTEGER}
</select>
对于上述SQL语句, 提前测试执行, 可以发现确实能查出创建者和编辑者的姓名
此外, 既然查询结果多了两列, resultMap映射也要修改, 在这里我们不修改原有的base映射, 而是新建一个映射
分析 : 这是一对一映射, 故用association标签
<!--id由BaseResultMap改为UserResultMap-->
<resultMap id="UserResultMap" type="com.sunsplanter.model.TUser">
<!--@mbg.generated-->
<!--@Table dlyk.t_user-->
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="login_act" jdbcType="VARCHAR" property="loginAct"/>
<result column="login_pwd" jdbcType="VARCHAR" property="loginPwd"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="phone" jdbcType="VARCHAR" property="phone"/>
<result column="email" jdbcType="VARCHAR" property="email"/>
<result column="account_no_expired" jdbcType="INTEGER" property="accountNoExpired"/>
<result column="credentials_no_expired" jdbcType="INTEGER" property="credentialsNoExpired"/>
<result column="account_no_locked" jdbcType="INTEGER" property="accountNoLocked"/>
<result column="account_enabled" jdbcType="INTEGER" property="accountEnabled"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="create_by" jdbcType="INTEGER" property="createBy"/>
<result column="edit_time" jdbcType="TIMESTAMP" property="editTime"/>
<result column="edit_by" jdbcType="INTEGER" property="editBy"/>
<result column="last_login_time" jdbcType="TIMESTAMP" property="lastLoginTime"/>
</resultMap>