天天看点

《若依ruoyi》第八章:后端CRUD 增删改查详解

作者:源码解析
大部分java开发人员在项目过程中,做得最多重复搬砖的动作就是对数据库表对CRUD,因此在很多开源脚手架或者在公司的内容架构系统中,都实现了一些工具,这些工具就是一键生成CRUD代码,在使用spring boot+mybaits-plus的项目中,CRUD主要分为几类文件,control(控制类),entity(实体类),mapper(mybatis-plusDAO操作类),service(服务类,服务类包含服务定义,服务实现类),本文章分析ruoyi的增删改差实现方式,有兴趣的朋友可以一起参与,也可以知识星球搜索《老张开源项目解析(Ruoyi)》

1.ruoyi的模块说明

《若依ruoyi》第八章:后端CRUD 增删改查详解

若依代码目录结构

从上图可以看出来,控制层代码放在ruoyi-admin模块,service和dao放在ruoyi-system模块里面。ruoyi-admin通过pom依赖ruoyi-system模块。

2.控制层详解

下面以用户表作为详解

控制层类

com.ruoyi.web.controller.system.SysUserController           

若依统一封装了一个BaseController,所有的业务控制类都继承这个类,这个类实现了

1)类型转换

2)设置请求分页数据

3)设置请求排序数据

4)响应请求分页数据

5)统一封装返回成功和异常数据结构

接口统一返回的数据格式是一个json,json是由code(处理结果编码),msg(处理结果描述),data(返回数据)

下面是SysUserController代码片段

@Autowired
    private ISysUserService userService;           

这个时候spirng 自动加载ISysUserService对的服务,实现数据库对增删改差

/**
     * 获取用户列表
     */
    @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectUserList(user);
        return getDataTable(list);
    }           

@PreAuthorize("@ss.hasPermi('system:user:list')") 这个是权限认证,实现原理是通过spring AOP来判断登录的用户是否拥有这个权限标识,如果没有拥有权限标识,那么接口拒绝访问。

@GetMapping("/list") restful请求路径,服务路径

startPage(); 分页函数

List<SysUser> list = userService.selectUserList(user); 调用接口服务层,查询数据库返回列表

3.服务层详解

服务层代码放在ruoyi-system模块里面

其中service的路径是com.ruoyi.system.service.impl.SysUserServiceImpl ,这个类是实现类
com.ruoyi.system.service.ISysUserService 这个类是接口类           

下面针对SysUserServiceImpl代码片段进行详细解析

@Autowired
    private SysUserMapper userMapper;           

上面是引入mybatis的dao操作,实现数据库增删改差

/**
     * 根据条件分页查询用户列表
     * 
     * @param user 用户信息
     * @return 用户信息集合信息
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<SysUser> selectUserList(SysUser user)
    {
        return userMapper.selectUserList(user);
    }
           

这个服务是提供给contorl调用

userMapper.selectUserList(user) 查询数据库返回列表

4.mybtais增删改差映射配置

mapper类存放在ruoyi-admin 模块下面的com.ruoyi.system.mapper包里面

下面以SysUserMapper为例,SysUserMapper是一个接口类定义

/**
 * 根据条件分页查询用户列表
 * 
 * @param sysUser 用户信息
 * @return 用户信息集合信息
 */
public List<SysUser> selectUserList(SysUser sysUser);           

这个函数对应的关联sql在resource目录下面的mapper/system

《若依ruoyi》第八章:后端CRUD 增删改查详解
<mapper namespace="com.ruoyi.system.mapper.SysUserMapper">           

这个xml将映射dao类

<resultMap type="SysUser" id="SysUserResult">
        <id     property="userId"       column="user_id"      />
        <result property="deptId"       column="dept_id"      />
        <result property="userName"     column="user_name"    />
        <result property="nickName"     column="nick_name"    />
        <result property="email"        column="email"        />
        <result property="phonenumber"  column="phonenumber"  />
        <result property="sex"          column="sex"          />
        <result property="avatar"       column="avatar"       />
        <result property="password"     column="password"     />
        <result property="status"       column="status"       />
        <result property="delFlag"      column="del_flag"     />
        <result property="loginIp"      column="login_ip"     />
        <result property="loginDate"    column="login_date"   />
        <result property="createBy"     column="create_by"    />
        <result property="createTime"   column="create_time"  />
        <result property="updateBy"     column="update_by"    />
        <result property="updateTime"   column="update_time"  />
        <result property="remark"       column="remark"       />
        <association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
        <collection  property="roles"   javaType="java.util.List"           resultMap="RoleResult" />
    </resultMap>           

xml里面的字段对应mapper的实体对象

<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
		left join sys_dept d on u.dept_id = d.dept_id
		where u.del_flag = '0'
		<if test="userId != null and userId != 0">
			AND u.user_id = #{userId}
		</if>
		<if test="userName != null and userName != ''">
			AND u.user_name like concat('%', #{userName}, '%')
		</if>
		<if test="status != null and status != ''">
			AND u.status = #{status}
		</if>
		<if test="phonenumber != null and phonenumber != ''">
			AND u.phonenumber like concat('%', #{phonenumber}, '%')
		</if>
		<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
			AND date_format(u.create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
		</if>
		<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
			AND date_format(u.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
		</if>
		<if test="deptId != null and deptId != 0">
			AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))
		</if>
		<!-- 数据范围过滤 -->
		${params.dataScope}
	</select>           

上面定义了一个查询的sql语句,其中id跟mapper里面的接口定义的方法是一致

id="selectUserList"

public List<SysUser> selectUserList(SysUser sysUser);

总结:ruoyi将单独的业务模块独立成为一个maven模块方面ruoyi-admin引用,也方便其他模块引入。ruoyi使用了mybatis没有使用mybatisplus,每次增加表字段都需要在xml里面修改,这样不方便,xml的文件内容也增大,不方便维护,下一次文章介绍如何改成mybatis-plus,敬请期待

继续阅读