【mybatis学习笔记】一文探索mybatis参数绑定

原文链接:https://blog.csdn.net/weixin_42325327/article/details/103208976

对数据库进行增删改查操作时,sql语句需要一些参数,从而来实现模糊查询,精确查询,插入数据,更新数据和删除数据。
这些参数,在mybatis里面,又该如何使用呢?我总结了以下几点:

1.单个参数绑定

DAO接口

//根据id查询User
public User getUserById(Integer id);

UserMapper.xml

<!-- 根据id查询User对象 -->
<select id="getUserById" resultType="com.mybatis.bean.User" databaseId="mysql">
	select * from User where id = #{id}
</select>

PS:接口方法传递一个参数, 在XML文件中取出值 : #{参数名} ---->> 参数值

如果只传递单个参数,mybatis不会做任何特殊处理,并且方法参数名 和 #{参数名} 可以不一致也能取出方法传递的参数,但是建议一致。

2.多个参数

DAO接口

//通过id和name查询 User对象
public User getUserByIdName(Integer id,String name);

UserMapper.xml

<!-- 通过id和name查询 User对象  -->
<!-- public User getUserByIdName(Integer id,String name); -->
<select id="getUserByIdName" resultType="com.mybatis.bean.User">
	select * from user where id = #{param1} and name= #{param2}
</select>

PS: 当方法传入多个参数时,mybatis会做特殊处理,多个参数封装成一个map集合。

而 #{} 是 从map集合中获取指定key的值,map集合key生成规则: param1…paramN

3.多个参数时,注解@param(),自己指定key

mybatis支持命名参数:自己指定key的名称
使用方法:在方法定义的过程中,该参数通过注解 @param("") 指定key的名称

DAO接口


//通过id和name查询 User对象,多个参数绑定,mybatis会自动将参数封装成map集合
//通过 @Param("") 注解指定key 名
public User getUserByIdName(@Param("id")Integer id,@Param("name")String name);

UserMapper.xml

<!-- 通过id和name查询 User对象  -->
  <select id="getUserByIdName" resultType="com.mybatis.bean.User">
    <!--使用注解指定的key名,获取map集合中的指定key的值 -->
    select * from user where id = #{id} and name= #{name} 
</select>

4.如果参数较多,可以传入实体对象
方法传入实体对象, #{} 从 对象中取出值:使用实体对象的字段名作为key,内部使用get方法取出

DAO接口


//更新方法
public void update(User u);

UserMapper.xml

<!-- public void update(User u) -->
<update id="update" parameterType="com.mybatis.bean.User">
	update user set id=#{id},name=#{name},money=#{money},sex=#{sex} where id=#{id}
</update>

5,如果参数较多,且多个参数不是已有对象,那么可以传入map集合

#{key} -->> 取出map中key对应的值

DAO接口

//通过map集合,查询User对象
public User getUserByMap(Map<String,Object> map);

controller

SqlSession session = sqlSessionFactory.openSession();
//使用反射动态创建 User持久层 接口对象
UserMapper mapper = session.getMapper(UserMapper.class); 
	
Map<String,Object> map = new TreeMap<String,Object>();		
map.put("id",1);
map.put("name","tom");
 
//通过map查询
User user = mapper.getUserByMap(map);
System.out.println(user.toString());

UserMapper.xml

<!-- public User getUserByMap(Map<String,Object> map)  -->
<select id="getUserByMap" resultType="com.mybatis.bean.User">
	select * from user where id = #{id} and name= #{name} 
</select>

PS:通过在控制层中map设置的key ,指定#{key} 取出值

复杂类型

public User getUser(@Param("id") Integer id,String name);
id取值:#{id}   或  #{param2}
name取值:#{param2}
 
public User getUser(Integer id,User u)
id 取值: #{param1}
取出User对象中的name属性:#{param2.name}
 
public void getUser(Integer id,@Param("us")User u);
user对象中的name取值: #{us.name}
 
 
public User getUser(LIst<User> list);
在查询的过程中想要取出list中的第一个元素
 
如果参数传递的是Collection(list,set) 类型的参数或者数组参数,mybatis也进行特殊处理
会将这些传入的集合或者数组封装到map集合中
 
   如果是Collection集合,map中对应的key是collection(所有的集合都可以使用) 
       细分:
	如果是List集合:可以使用 key:list
	如果是数组:可以使用 key:array

使用 #{} 和${} 都可以取值

#{} :使用的是预编译方式,将参数设置到sql语句中,内部使用PrepareStatement,可以防止sql注入
$() :取出来的值是直接拼接到sql语句中,使用它会有安全问题,没有方法防止sql注入

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值