【MyBatis】如何使用“注解”来获取参数,以及其他方式?(底层原理解释)

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 【MyBatis】如何使用“注解”来获取参数,以及其他方式?(底层原理解释),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

一、获取参数办法

1.1、多个参数时,直接传参,通过arg0…或param1…实现

1.2、通过传入map实现

1.3、实体化类对象传参

二、使用注解获取参数(最实用!建议经常使用)

三、建议!!!


一、获取参数办法

1.1、多个参数时,直接传参,通过arg0…或param1…实现

使用注解获取参数之前,先来想想我们以往是如何获取参数的;

假设:现在一个场景是用户登录验证功能,通过查询数据库中是否存在该用户信息,若存在返回用户信息,不存在返回null;

        那么此时就可以用 #{}占位符 或 ${}字符串拼接 的方式输入参数, 当然这里更建议使用#{}占位符的方式(省去了加引号的操作,有效防止了sql注入)如下代码:(注意:获取SqlSession以被封装)

    //验证登录
    User checkLogin(String username, String password);
    @Test
    public void testCheckLogin() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.checkLogin("root", "123");
        System.out.println(user);
    }
    <select id="checkLogin" resultType="User">
        select * from user where username = #{username} and password = #{password};
    </select>

注意:这是一个易错点,会报如下错误!

【MyBatis】如何使用“注解”来获取参数,以及其他方式?(底层原理解释)

 解释:

        如何解决呢,这就需要我们对MyBatis底层有所了解,当我们的接口中需要传入多个参数的时候(如果只是一个参数的话,就不用管了),MyBatis就会把参数存储到Map中,存储的方式有两种:“(a)、以arg0、arg1…为键,以传入的参数为值;(b)、以param1、param2…为键,以传入的参数为值;”, 所以映射文件中#{}大括号里面的值就不能随便写啦~,而是依次写成上述两种方式(都可以):如下

    <select id="checkLogin" resultType="User">
        select * from user where username = #{arg0} and password = #{arg1};
    </select>

以上这种方式就没有问题啦~

1.2、通过传入map实现

        既然他底层存储参数是以键值对的方式实现的,那么我们可不可以不按照它规定的key值进行传参?当然,这里我们是可以手动指定的!

如下代码:

    //验证登录(通过map实现)
    User checkLoginByMap(Map<String, Object> map);
    @Test
    public void testCheckLoginByMap() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("username", "root");
        map.put("password", "123");
        User user = mapper.checkLoginByMap(map);
        System.out.println(user);
    }
    <select id="checkLoginByMap" resultType="User">
        select * from user where username = #{username} and password = #{password};
    </select>

通过以上方式就可以实现啦~

1.3、实体化类对象传参

如下代码:

    //添加用户信息功能
    void insertUser(User user)
    @Test
    public void testInsertUser() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user  = new User(1, "lisi", "1234");
        mapper.insertUser(user);
    }
    <insert id="insertUser">
        insert into user values(#{id}, #{username}, #{password});
    </insert>

二、使用注解获取参数(最实用!建议经常使用)

        刚刚我们提到了,若接口中需要传入多个参数时,有两种实现方式:“1.直接向接口传入参数,MyBatis会将参数以Map的方式进行存储,并且key为底层设计好的,value为传入的参数;2.自己设一个map,直接向接口传入map”;你会发现,以上两种方式都不是很好,这时候用注解来处理就方便多了!

使用注解的底层原理:

        我们在设计接口的时候就可以写入注解,例如@Param(“username”) String username,这时候我们若传入直接传入参数,MyBatis还是会以Map的方式进行存储,只不过是以“注解的value”为键,以传入的参数为值;

实际上,Mybatis处理的时候,用Map以两种key方式进行存储:1.如果#{}大括号中,我们写的参数是注解中的参数,那么就是以注解为key,以参数为value进行存储;2.另外#{}中还可以写一种方式就是param1、param2…这样写,就是我们刚刚所讲的1.1中获取参数的办法,会以param1、param2…为key,以参数为value;不过既然我们都用注解了,建议写的时候还是以注解中的参数为key值;

相比较于之前两种方式的优点:不用再按照MyBatis规定的Map键进行存放参数,另外,如果我们也不用自己再去写一个Map,手动指定键值对;

如下代码:

    //验证登录(注解)
    //这种方式,仍然是用Map进行存储,只是这个时候是以“注解”为键,参数为值
    User checkLoginByParam(@Param("username") String username, @Param("password") String password);
    <select id="checkLoginByParam" resultType="User">
        select * from user where username = #{username} and password = #{password};
    </select>
    @Test
    public void testCheckLoginByParam() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.checkLoginByParam("root", "123");
        System.out.println(user);
    }

三、建议!!!

真正在获取参数的时候,建议直接整合为一下两种使用情况:

        1.若mapper接口中的参数是实体类类型,就直接传入实体类类型;

        2.若mapper接口中的参数是字面量类型,无论是一个还是多个,都建议使用注解,方便使用,不用去思考是否使用注解,直接用就完了!

最后建议这里多加练习,否则之后使用动态SQL时候,你就会发现MyBatis废了……


【MyBatis】如何使用“注解”来获取参数,以及其他方式?(底层原理解释)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/130399.html

(0)

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!