MybatisPlus+Postgresql整合的几个坑及解决

 更新时间:2023年03月30日 10:08:56   作者:xuruilll  
这篇文章主要介绍了MybatisPlus+Postgresql整合的几个坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

最近把用户管理服务切换成PostgreSql数据库,和Mybatis整合时遇到了几个坑,记录一下。

基础设置

application.yml设置,注意schema的设置

spring:
  datasource:
    platform: postgres
    url: jdbc:postgresql://192.188.1.245:5432/uum?currentSchema=uum
    schemaName: uum
    username: xxxx
    password: xxxx
    driver-class-name: org.postgresql.Driver

自增字段

关于自增字段,postgresql中没有自增字段,用的是sequence,比如user表中的主键id字段:

create sequence uum.userid_seq start with 1 increment by 1 no minvalue no maxvalue cache 1;
alter sequence uum.userid_seq owner to smartsys;
 
alter table uum.user alter column id set default nextval('uum.userid_seq');

插入时的sql,id不传入。

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="com.sifang.uum.model.Cuser">
    insert into cuser(uname, realname, password, phone, email, user_type, deleted, birthday) values(#{uname}, #{realname}, #{password}, #{phone}, #{email}, #{userType}, #{deleted}, #{birthday})
</insert>

service层中获取插入的id:

baseMapper.insertUser(user);
int id= user.getId();

递归获取单位树列表

获取一个单位所有子单位,company表中含有cid和pcid,分别是单位的id和父单位的id,最顶层的单位id为null。想查询出树列表。

class Company是直接根据数据库生成的model,class CompanyVo在Company基础上加了字段

private List<CompanyVo> children;

通过递归调用获取单位的树列表:

public List<CompanyVo> companyTree() {
    // 调用mybatisplus的默认函数获取所有单位
    List<Company> list = this.list(); 
 
    // 获取所有最顶层的单位
    List<CompanyVo> parentList = getParentList(list);
 
    // 递归调用填充子单位
    List<CompanyVo> allList = getChildrenList(list, parentList);
 
    return allList;
}
 
private List<CompanyVo> getParentList(List<Company> list) {
    List<CompanyVo> parentList = new ArrayList<>();
 
    list.forEach(comp ->{
        if(comp.getPcid() == null) {
            parentList.add(new CompanyVo((comp)));
        }
    });
 
    return parentList;
}
 
private List<CompanyVo> getChildrenList(List<Company> list, List<CompanyVo> parentList) {
    parentList.forEach(parent -> {
        List<CompanyVo> childrenList = new ArrayList<CompanyVo>();
        list.forEach(comp -> {
            if(parent.getCid() == comp.getPcid()) {
                childrenList.add(new CompanyVo(comp));
            }
        });
 
        parent.setChildren(getChildrenList(list, childrenList));
    });
 
    return parentList;
}

Swagger页面测试:

获取一个单位及其子单位下所有用户列表

每个单位通过一个rel_comp_user关系表和用户表做了关联,想获取一个单位及其所有子单位的人员列表。

service层代码

public Page<Cuser> listAllUser(Page<Cuser> page, int cid) {
    // 获取编号为cid的单位的所有子单位的列表
    List<Integer> allChile = baseMapper.listAllChildComp(cid);
 
    if(allChile.size() > 0) {
        String str = "'";
        for(int i=0; i<allChile.size(); i++) {
            str += allChile.get(i).toString();
 
            if(i != allChile.size() - 1) {
                str += ",";
            }
        }
        str += "'";
 
        System.out.println(str);
 
        // 获取所有这些单位的人员列表
        return baseMapper.listAllChildUser(page, str);
    }
    else {
        return null;
    }
}

Mapper层,不能直接写in语句,需要用where position,把获取的所有单位编号转换成一个字符串传入:

<select id="listAllChildComp" parameterType="java.lang.Integer" resultType="java.lang.Integer">
    WITH RECURSIVE T ( cid, pcid ) AS (
        SELECT
            A.cid,
            A.pcid
        FROM
            company A
        WHERE
            A.cid = #{cid} UNION ALL
        SELECT
            b.cid,
            b.pcid
        FROM
            company b,
            T
        WHERE
            b.pcid = T.cid
    ) SELECT cid FROM T
</select>
 
<select id="listAllChildUser" resultType="com.sifang.uum.model.Cuser">
    select cuser.id id, cuser.uname uname
    from cuser
        left join rel_comp_user on cuser.id=rel_comp_user.uid
    where position(','||rel_comp_user.cid||',' in ','||${childComp}||',')>0
</select>

swagger页面测试:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java多线程中断机制三种方法及示例

    Java多线程中断机制三种方法及示例

    这篇文章主要介绍了Java多线程中断机制三种方法及示例,向大家分享了这三种方法的介绍几代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java对Excel表格的上传和下载处理方法

    Java对Excel表格的上传和下载处理方法

    这篇文章主要介绍了Java对Excel表格的上传和下载处理方法,需要的朋友可以参考下
    2017-08-08
  • java基于移位操作实现二进制处理的方法示例

    java基于移位操作实现二进制处理的方法示例

    这篇文章主要介绍了java基于移位操作实现二进制处理的方法,结合实例形式分析了java针对二进制的移位操作处理技巧,需要的朋友可以参考下
    2017-02-02
  • 浅谈java常用的几种线程池比较

    浅谈java常用的几种线程池比较

    下面小编就为大家带来一篇浅谈java常用的几种线程池比较。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 分享java中设置代理的两种方式

    分享java中设置代理的两种方式

    有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http、https、ftp、socks代理。比如在IE浏览器设置代理,这里简单介绍下,需要的朋友可以参考下
    2015-12-12
  • 详解Maven打包和运行

    详解Maven打包和运行

    这篇文章主要介绍了Maven打包和运行的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Spring如何基于Proxy及cglib实现动态代理

    Spring如何基于Proxy及cglib实现动态代理

    这篇文章主要介绍了Spring如何基于Proxy及cglib实现动态代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 高并发环境下安全修改同一行数据库数据的策略分享

    高并发环境下安全修改同一行数据库数据的策略分享

    随着互联网技术的发展,越来越多的应用需要在高并发环境中运行,数据库的并发控制成为了业务的关键,本文将介绍如何在高并发情况下,安全地修改数据库中的同一行数据,需要的可以参考一下
    2023-06-06
  • Java String类和StringBuffer类的区别介绍

    Java String类和StringBuffer类的区别介绍

    这篇文章主要介绍了Java String类和StringBuffer类的区别, 关于java的字符串处理我们一般使用String类和StringBuffer类有什么不同呢,下面我们一起来看看详细介绍吧
    2022-03-03
  • Java线程中的interrupt方法解读

    Java线程中的interrupt方法解读

    这篇文章主要介绍了Java线程中的interrupt方法解读,Java中的interrupt是一种线程间通信的机制,用于请求中断线程的执行。当一个线程调用另一个线程的interrupt()方法时,被调用线程会收到一个中断信号,可以根据需要做出相应的处理,需要的朋友可以参考下
    2023-10-10

最新评论