MyBatis向sql传参数

1. 传单个参数时

直接在sql语句中使用参数名字,其他的名字也是可以的
因为在处理单个参数时,mybatis是不会做特殊处理的。
看看具体的使用:
接口中的方法:

List<user>selectAll2(Integer id);

mapper文件:

<select id="selectAll2" resultType="cn.com.Ycy.mybatis.domain.user">
	select * from user where id =#{id};
</select>

在测试中:

	@Test
    public  void testSelectAll2(){
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        userDao user = sqlSession.getMapper(userDao.class);
        List<user> userList = user.selectAll2(50);
        for(user users: userList){
            System.out.println(users);
        }
        sqlSession.close();
    }

2. 传多个参数时

多个参数:mybatis会做特殊处理
什么特殊处理? 就是多个参数会被封装成一个map
这个map的key是param1、param2、param3…paramN。
这个对应的key的value就是传入的参数值

使用@Param

当dao接口中的方法有多个参数时,需要通过名称使用参数。
在方法的形参前面加入@Param(“自定义参数名称”),mapper文件中使用#{自定义名称}
例如:
         接口中的方法:

List<user>selectAll2(@Param("min")Integer min, @Param("max") Integer max);

              mapper文件:

<select id="selectAll2" resultType="cn.com.Ycy.mybatis.domain.user">
	select * from user where id between #{min} and #{max};
</select>
使用对象

使用Java对象属性值,作为参数的实际值
使用对象的语法:
#{属性名,javaType=类型名称,jdbcType=类型名称}
javaType是指Java中的属性数据类型
jdbcType是指数据库中的数据类型
例如:
#{username,javaType=java.lang.String,jdbcType=VARCHAR}
比较少用,就不多介绍
上面的简化版的格式: #{属性名} 直截了当
javaType 和 jdbcType 的值mybatis会反射获取
说说具体使用
在接口中的方法:

   List<user>selectAll3(user user);

在mapper中:

<select id="selectAll3" resultType="cn.com.Ycy.mybatis.domain.user">
        select * from user where id =#{id} or username=#{username};
 </select>

在测试类中

	@Test
    public  void testSelectAll3(){
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        userDao user = sqlSession.getMapper(userDao.class);
        user user1 = new user();
        user1.setId(1);
        user1.setUsername("张三");
        List<user> userList = user.selectAll3(user1);
        for(user users: userList){
            System.out.println(users);
        }
        sqlSession.close();
    }
  • 按位置

参数位置是从0开始,引用语法#{0},#{1}…
在接口中:

	//按位置
    List<user>selectAll4(Integer min, Integer max);

在mapper文件:

<select id="selectAll4" resultType="cn.com.Ycy.mybatis.domain.user">
        select * from user where id between #{0} and #{1};
 </select>

在测试类中:

@Test
    public  void testSelectAll4(){
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        userDao user = sqlSession.getMapper(userDao.class);
        List<user> userList = user.selectAll2(50,100);
        for(user users: userList){
            System.out.println(users);
        }
        sqlSession.close();
    }
  • Map存放多个值
    Map集合是可以存储多个值的,使用Map向文件mapper一次性传入多个参数。
    Map集合使用key,Object类型的值存储参数
    mapper文件中使用#{key}使用参数的值
    在接口中:
	 //Map的存储
    List<user>selectAll5(Map<String,Object>map);

在mapper文件:

<select id="selectAll5" resultType="cn.com.Ycy.mybatis.domain.user">
        select * from user where id =#{Map_id} or username=#{Map_username};
</select>

Map_id、Map_username都是map中的key
在测试类中:

//Map的存储使用
    @Test
    public  void testSelectAll5(){
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        userDao user = sqlSession.getMapper(userDao.class);
        Map<String,Object>datas = new HashMap<>();
        datas.put("Map_id",29);
        datas.put("Map_username","老王");
        List<user> userList = user.selectAll5(datas);
        for(user users: userList){
            System.out.println(users);
        }
        sqlSession.close();
    }

在实际使用的过程中,我们一般使用比较多的是@Param 和对象传入参数,其他的使用不是非常多

参数封装扩展

例如接口中的三个方法:

public Employee getEmp(@Param("id")Integer id,String lastname);

在xml取值:id===> #{id}或者#{param1} lastname ===>#{param2}

public Employee getEmployee(Integer id,@Param("e")Employee emp);

在xml中取值:id===> #{param1} lastname ===> #{e.lastname} 或者是 #{param2.lastname}
下面的需要特别注意:

public Employee getEmpById(List<Integer> id);

在xml取值:取出第一个id值===》#{list[0]}
如果是Collection(List、Set)类型或者数组,mybatis也会特殊处理,也是把传入的list或者数组封装在map中
key:可以使用collection(Collection),如果是List还可以使用这个key(list)
对于数组可以使用key(array)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值