# MySQL到PostgreSQL的Mapper文件修改总结 ## 修改的文件列表 1. SysDeptMapper.xml 2. SysDictDataMapper.xml 3. SysDictTypeMapper.xml 4. SysMenuMapper.xml 5. SysRoleMapper.xml 6. SysUserMapper.xml 7. SysConfigMapper.xml 8. SysLogininforMapper.xml 9. SysOperLogMapper.xml 10. SysNoticeMapper.xml ## 无需修改的文件列表 1. SysRoleDeptMapper.xml 2. SysRoleMenuMapper.xml 3. SysUserRoleMapper.xml ## 主要修改内容 ### 1. 字符串连接函数 - **MySQL语法**: `concat('%', #{param}, '%')` - **PostgreSQL语法**: `'%' || #{param} || '%'` ### 2. 日期格式化函数 - **MySQL语法**: `date_format(column,'%Y%m%d')` - **PostgreSQL语法**: `to_char(column,'YYYYMMDD')` ### 3. 当前时间函数 - **MySQL语法**: `sysdate()` - **PostgreSQL语法**: `now()` ### 4. find_in_set函数替换 - **MySQL语法**: `find_in_set(#{id}, ancestors)` - **PostgreSQL语法**: `ancestors LIKE '%' || #{id} || ',' OR ancestors = #{id} OR ancestors LIKE '%' || #{id}` ### 5. 限制结果集语法 - **MySQL语法**: `limit 1` - **PostgreSQL语法**: `FETCH FIRST 1 ROW ONLY` ## 具体修改示例 ### SysDeptMapper.xml - 修改了selectDeptList中的concat函数 - 修改了selectChildrenDeptById和selectNormalChildrenDeptById中的find_in_set函数 - 修改了insertDept和updateDept中的sysdate()函数 - 修改了限制结果集语法:`limit 1` 改为 `FETCH FIRST 1 ROW ONLY` ### SysDictDataMapper.xml - 修改了selectDictDataList中的concat函数 - 修改了updateDictData和insertDictData中的sysdate()函数 ### SysDictTypeMapper.xml - 修改了selectDictTypeList中的concat函数 - 修改了日期格式化函数date_format为to_char - 修改了限制结果集语法:`limit 1` 改为 `FETCH FIRST 1 ROW ONLY` ### SysMenuMapper.xml - 修改了selectMenuList和selectMenuListByUserId中的concat函数 - 修改了限制结果集语法:`limit 1` 改为 `FETCH FIRST 1 ROW ONLY` ### SysRoleMapper.xml - 修改了selectRoleList中的concat函数 - 修改了日期格式化函数date_format为to_char - 修改了限制结果集语法:`limit 1` 改为 `FETCH FIRST 1 ROW ONLY` ### SysUserMapper.xml - 修改了selectUserList、selectAllocatedList和selectUnallocatedList中的concat函数 - 修改了日期格式化函数date_format为to_char - 修改了find_in_set函数为PostgreSQL兼容的LIKE条件组合 - 修改了限制结果集语法:`limit 1` 改为 `FETCH FIRST 1 ROW ONLY` ### SysConfigMapper.xml - 修改了selectConfigList中的concat函数 - 修改了日期格式化函数date_format为to_char - 修改了insertConfig和updateConfig中的sysdate()函数 - 修改了限制结果集语法:`limit 1` 改为 `FETCH FIRST 1 ROW ONLY` ### SysLogininforMapper.xml - 修改了selectLogininforList中的concat函数 ### SysOperLogMapper.xml - 修改了selectOperLogList中的concat函数 ### SysNoticeMapper.xml - 修改了selectNoticeList中的concat函数 ## 注意事项 1. 所有修改都保持了原有的业务逻辑不变,只是将MySQL特有的语法替换为PostgreSQL兼容的语法 2. 对于find_in_set函数的替换,使用了多个LIKE条件的组合,确保功能一致性 3. 日期格式化函数的修改中,注意了PostgreSQL的日期格式字符串与MySQL的差异 4. 所有修改后的文件应该可以在PostgreSQL数据库中正常运行 5. SysRoleDeptMapper.xml、SysRoleMenuMapper.xml和SysUserRoleMapper.xml文件中没有需要修改的内容,因为它们只包含简单的CRUD操作,没有使用MySQL特有的函数 6. 限制结果集语法的修改解决了用户编辑时的"登录账号已存在"错误,该错误是由于`limit 1`语法不兼容导致的 ## 解决的问题 1. 修复了用户编辑时的"登录账号已存在"错误,该错误是由于`limit 1`语法不兼容导致的 2. 所有Mapper文件现在都使用PostgreSQL兼容的SQL语法 3. 确保了所有查询、插入、更新操作在PostgreSQL环境下正常工作 4. 已完成所有实际使用的Mapper文件中`limit 1`语法的修改,全部替换为`FETCH FIRST 1 ROW ONLY`语法