文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Mybatis实现SQL存储流程详解

2023-03-10 08:37

关注

今天学习了Mybatis执行存储,感觉不是那么好用,可能是我没用习惯。

我先在SQLSERVER创建存储

alter procedure usp_user_getUser
	@username varchar(30)='',
	@groupid varchar(10)=''
as

begin
	select * from TB_USER with(nolock)
	where 1=1
		and ((@username='') or (@username<>'' and username=@username))
		and ((@groupid='') or (@groupid<>'' and groupid=@groupid))
end

我创建这个存储,是想查询用户数据,但是我设置了两个条件@username,@groupid。

理想情况是即使没有入参值,也能够查询出来。这个暂且不先考虑,先执行存储成功再说。

我现在mapper接口定义两个查询,返回类型为map类型。一个参数必传,一个参数不用必传。代码如下:

    List<Map<String,User>> getProcUser(String username, String groupid);
    List<Map<String,Object>> getProcUsers(String username, String groupid);

getProcUser方法返回 List<Map<String,User>> 类型,我是考虑只返回需要的字段,但实际中是,是不知道存储返回的字段有变化没,所以在getProcUsers中返回 List<Map<String,Object>> 类型.

在mapper文件中,其实执行存储是一样的,但是id不一样,代码如下:

    <select id="getProcUser" statementType="CALLABLE" resultType="java.util.Map">
        {
            call usp_user_getUser (
                #{username,mode=IN,jdbcType=VARCHAR},
                #{groupid,mode=IN,jdbcType=VARCHAR}
            )
        }
    </select>
    <select id="getProcUsers" statementType="CALLABLE" resultType="java.util.Map">
        {
            call usp_user_getUser(
                #{username,mode=IN,jdbcType=VARCHAR},
                #{groupid,mode=IN,jdbcType=VARCHAR}
            )
        }
    </select>

那么我在controller中增加方法调用,代码如下,由于我使用了Swagger2,注解较多,代码如下:

@PostMapping("/user/getProcUser")
    @ApiOperation(value = "存储-获取账号信息",notes = "存储-获取账号信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "username", value = "账号", dataType = "string", paramType = "query", example = "", required = true),
            @ApiImplicitParam(name = "groupid", value = "组类别", dataType = "string", paramType = "query", example = "", required = true)
    })
    //这种方式 入参必须有值
    public List<Map<String,User>> getProcUser(String username, String groupid){
        List<Map<String,User>> list= null;
        SqlSession sqlSession= null;
        try{
            sqlSession= MybatisUtils.getSqlSession();
            UserMapper mapper= sqlSession.getMapper(UserMapper.class);
            list= mapper.getProcUser(username,groupid);
            System.out.println(list);
        } catch(Exception e){
            e.printStackTrace();
        } finally {
            if (sqlSession!= null){
                sqlSession.close();
            }
        }
        return list;
    }
    @PostMapping("/user/getProcUsers")
    @ApiOperation(value = "存储-获取账号信息",notes = "存储-获取账号信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "username", value = "账号", dataType = "string", paramType = "query", example = "", required = false),
            @ApiImplicitParam(name = "groupid", value = "组类别", dataType = "string", paramType = "query", example = "", required = false)
    })
    public List<Map<String,Object>> getProcUsers(String username, String groupid){
        List<Map<String,Object>> list= null;
        SqlSession sqlSession= null;
        if (username==null){username= "";}
        if (groupid==null){groupid= "";}
        try{
            sqlSession= MybatisUtils.getSqlSession();
            UserMapper mapper= sqlSession.getMapper(UserMapper.class);
            list= mapper.getProcUsers(username,groupid);
            System.out.println(list);
        } catch(Exception e){
            e.printStackTrace();
        } finally {
            if (sqlSession!= null){
                sqlSession.close();
            }
        }
        return list;
    }

调用 getProcUser 方法,username和groupid是设置的必传,所以返回值正常。

调用 getProcUsers 方法,username和groupid不是必传的,所以这个入参是null值。

如果有任意一个参数是不传,接口调用返回“[]”数组。也就是没有查询出来。

哪怕是在方法中加入@RequestParam设置默认值也无用,因为调用传的就是null

所以上面代码,可以看到我加入了参数判断, 代码如下(上面代码有,此处我标注下):

        if (username==null){username= "";}
        if (groupid==null){groupid= "";}

我去判断了参数是否null,如果是,定义空字符串。然后调用就正常了。

到此这篇关于Mybatis实现SQL存储流程详解的文章就介绍到这了,更多相关Mybatis SQL存储内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯