NO.3 MyBatis获取参数的两种方式

目录

1、两种方式的区别

2、单个字面量类型的参数

2.1 在映射文件中,用#{}加任意名称获取参数的值:

2.2 在映射文件中,用${}加任意名称获取参数的值:

2.3 小结

3、在map集合类型的参数

3.1 使用MyBatis默认的map映射集合

3.2 实验:使用自定义map集合

3.2 结果

4、实体类类型的参数

4.1 实验

4.2 结果

 5、使用@Param标识参数

 5.1 @Param注解使用方法

 5.2 使用@Param注解单(多)个字面类型的参数

 5.3 其他情况


MyBatis获取参数有两种方式,分别为#{}和${}。下面Sql语句以t_user表为例,mapper接口、映射文件、表结构等参考博客:NO.2 MyBatis框架:创建Mapper接口和映射文件,实现基本增删改查_qq_46053741的博客-CSDN博客

1、两种方式的区别

${}:${}的本质就是字符串拼接,${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;

例如:

select *from t_user where id='${id}'

#{}:#{}的本质就是占位符赋值,但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时, 可以自动添加单引号。

例如:

select *from t_user where id=#{id}

2、单个字面量类型的参数

在UserMapper接口中定义了多个数据库操作方法,对于只有一个字面量类型的参数,此时可以使用${}和#{}以任意的名称获取参数的值

以UserMapper接口中的User getUserByUsername(String username)方法为例,使用两种方式在Sql语句中获取参数值。

2.1 在映射文件中,用#{}加任意名称获取参数的值:

<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username=#{arg0}
    </select>

<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username=#{abc}
    </select>

2.2 在映射文件中,用${}加任意名称获取参数的值:

<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username='${arg0}'
    </select>

<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username='${abc}'
    </select>

因为是以${}方式获取字面量参数的值,因此要在${}外面手动加上单引号,拼接Sql语句。

2.3 小结

 对于以上两种方式,因为getUserByUserBname方法只有一个字面量类型参数,因此可以通过任意的名称获取username参数的值。代码中使用的arg0是MyBatis自动将参数放在一个map映射集合中,以arg0、arg1...(或param1、param2...)为键,以参数为值存储的。因此只需要通过${}和#{}访问map集合的键就可以获取相对应的参数值。以arg0、arg1...(或param1、param2...)为键,获取参数值的方式在多个字面量类型的参数中也可使用。

如果方法中有多个字面量类型的参数,可以通过MyBatis默认的map映射集合获取对应的参数的值,此时不能通过任意的名称获取参数的值。

3、在map集合类型的参数

3.1 使用MyBatis默认的map映射集合

使用MyBatis默认的map映射集合,通使用${}或#{}方法,访问map集合中的arg或param键获取对应的参数值。

3.2 实验:使用自定义map集合

在Sql语句中获取参数的值可以通过MyBatis默认的map集合,同样的也可以使用自定义的map集合访问map集合的键获取参数的值,此时需要我们手动设置key-value。

在UserMapper接口中创建以下方法:

    //通过自定义Map集合获取用户信息,String对应用户名,Object对应用户密码
    User getUserByMap(Map<String,Object> map);

在UserMapper.xml文件中创建该方法的sql语句:

<!--    void getUserByMap(Map<String,Object> map);-->
    <select id="getUserByMap" resultType="User" >
        select *from t_user where username=#{username} and password=#{password}
    </select>

在测试类中测试getUserByMap方法:

    @Test
    public void getUserByMap() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //创建map集合
        Map<String,Object> map=new HashMap<String,Object>();
        //向集合中添加元素
        map.put("username","小黑子");
        map.put("password","123456");
        User user=userMapper.getUserByMap(map);

        System.out.println(user);

        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

3.2 结果

 数据库中数据如下:

 查询结果如下:

4、实体类类型的参数

若mapper接口中的方法参数为实体类对象时,此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。

4.1 实验

以UserMapper接口中的int insertUser(User user)方法为例:

    //添加用户
    int insertUser(User user);

UserMapper.xml配置文件中sql语句如下:

<!--    int insertUser(User user);-->
    <insert id="insertUser" >
        insert into t_user(id,userName,password,age,gender) values(null,#{userName},#{password},#{age},#{gender})
    </insert>

 在测试类中测试insertUser方法:

    @Test
    public void insertUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isInsert=0;
        isInsert=userMapper.insertUser(new User(null,"李斯","daqinwangchao",34,'男'));
        if(isInsert>0){
            System.out.println("数据添加成功");
        }else{
            System.out.println("数据添加失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

4.2 结果

控制台输出结果:

数据库数据: 

 

 5、使用@Param标识参数

 5.1 @Param注解使用方法

@Param标识参数适用于以上所有情况,通过@Param注解标识mapper接口中的方法参数,此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值。此时只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

 5.2 使用@Param注解单(多)个字面类型的参数

在UserMapper接口中以User getUserByUsername(String username)、int deleteUser(String username,String password)方法为例:

    //根据用户名查询用户信息
    User getUserByUsername(@Parameter("username") String username);
    //根据用户名和密码删除用户
    int deleteUser(@Param("username") String username,@Param("password") String password);

在UserMapper.xml配置文件中sql语句如下,通过注解的value属性值获取参数的值:

<!--    User getUserByUsername(@Param("username") String username);-->
<!--使用#{}方式获取参数的值-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username=#{username}
    </select>
<!--
    使用${}方式获取参数的值
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username='${username}'
    </select>
-->




<!--    int deleteUser(@Param("username") String username,@Param("password") String password);-->
    <delete id="deleteUser">
        delete from t_user where username=#{username} and password=#{password}
    </delete>
<!--
    使用${}方式获取参数的值
    <delete id="deleteUser">
        delete from t_user where username='${username}' and password='${password}'
    </delete>
-->

 在测试类中测试该方法:

    @Test
    public void getUserByUsername() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=userMapper.getUserByUsername("小黑子");
        System.out.println(user);
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }
    @Test
    public void deleteUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isDelete=0;
        isDelete=userMapper.deleteUser("小黑子","1234");
        if(isDelete>0){
            System.out.println("数据删除成功");
        }else{
            System.out.println("数据删除失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

 结果如下:

 5.3 其他情况

对于实体类类型的参数也可以通过@Param()注解的方式获取参数属性的值,一般情况下不这样使用,因为实体类类型的参数可以直接使用${}和#{}访问实体类对象中的属性名获取属性值。

对于Map集合只需要使用${}或#{},访问map集合中的的键获取对应的参数值,不需要设置@Param()注解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值