SSM-Mybatis-映射器-参数

SSM-Mybatis-映射器-参数

概述

​ 在一些数据库字段返回为null,而Mybatis系统又检测不到使用哪种jdbcType进行处理时,会发生异常的情况,这时候执行对应的typeHandler进行处理:

insert into t_role(id,role_name,note) values(#{id},#{roleName,typeHandler=org.apache.ibatis.type.StringTypeHandler},#{note})

​ 实际情况下不需要这样写,Mybatis会根据javaType和jdbcType去检测使用哪个typeHandler。

​ 还可以自定义TypeHandler类似方法指定就不会抛出异常,也可以指定jdbcType和javaType:

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

Mybatis还提供了控制数值精确度支持:

#{width,javaType=double,jdbcType=NUMERIC,numericScale=2}

存储过程参数支持

​ 在存储过程中存在:IN(输入),OUT(输出),INOUT(输入输出)三种参数类型:

  1. 输入参数是外界需要传递给存储过程的
  2. 输出参数是存储过程经过处理后返回的
  3. 输入输出参数,一方面外界需要传递给他,另一方面在最后存储过程也会返回给调用者

存储过程的参数类型有3种:

1:  #{id,mode=IN}
2:  #{roleName,mode=OUT}
3:  #{note,mode=INOUT}

特殊字符串的替换和处理(#和$)

​ 使用 #{} 时,Mybatis会创建PreparedStatement参数占位符,并通过占位符设置参数,这样做安全,更迅速,通常是首选做法

​ 当需要在SQL语句中直接插入一个不转义的字符串可以使用 ${}

ORDER BY ${columnName}

​ 当 SQL 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。

@Select("select * from user where id = #{id}")
User findById(@Param("id") long id);

@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);

@Select("select * from user where email = #{email}")
User findByEmail(@Param("email") String email);

上面例子中可以修改成如下的代码:

@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);

其中 ${column} 会被直接替换,而 #{value} 会使用 ? 预处理。 这样,就能完成同样的任务:

User userOfId1 = userMapper.findByColumn("id", 1L);
User userOfNameKid = userMapper.findByColumn("name", "kid");
User userOfEmail = userMapper.findByColumn("email", "noone@nowhere.com");

注意:这种方式是不安全的,会有潜在的SQL注入攻击

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值