原文链接: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注入