天天看點

《若依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,敬請期待

繼續閱讀