MyBatis获取参数值:
MyBatis获取参数值的两种方式:${}和#{}
${}的本质就是字符串拼接,如JDBC中的Statement一样,会存在SQL注入问题。若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号。
#{}的本质使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。
1.1单个字面量类型的参数
若mapper接口中方法参数为单个字面量数据类型,此时可以使用上述两种方法获得参数值,但是用${}要手动加单引号。
1.1.1在使用#{}时是以占位符的形式来执行的。
可以再log4j输出的日志中看到。(其中方法名中的参数名称与mapper中的参数不必一致)
public UserInfo selectUserByName(String name);
<select id="selectUserByName" resultType="mybaits.Pojo.UserInfo">
select * from user_info where usename=#{name }
</select>
DEBUG 11-02 23:10:43,256 ==> Preparing: select * from user_info where usename=? (BaseJdbcLogger.java:137)
DEBUG 11-02 23:10:43,257 ==> Parameters: ybc(String) (BaseJdbcLogger.java:137)
DEBUG 11-02 23:10:43,259 <== Total: 1 (BaseJdbcLogger.java:137)
UserInfo(userId=12, useName=ybc, usePassword=123, createTime=null, updateTime=Sat Oct 29 22:10:14 CST 2022)
1.1.2 使用${}来获取参数值
<select id="selectUserByName" resultType="mybaits.Pojo.UserInfo">
select * from user_info where usename=${name }
</select>
public UserInfo selectUserByName(String name);
注意:${}要手动添加单引号
否则会出现如下错误,会把参数当作字段。
DEBUG 11-02 23:16:34,471 ==> Preparing: select * from user_info where usename=ybc (BaseJdbcLogger.java:137)
DEBUG 11-02 23:16:34,471 ==> Parameters: (BaseJdbcLogger.java:137)
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'ybc' in 'where clause'
### The error may exist in Mappers/UserInfoMapper.xml
添加单引号即可
<select id="selectUserByName" resultType="mybaits.Pojo.UserInfo">
select * from user_info where usename='${name }'
</select>
1.2多个字面量类型的参数
若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的 值,注意${}需要手动加单引号。
由上述可知获取参数值有两种方法即使用arg0....为键或以param1.....为键。本质上是一样的。
public UserInfo selectUserByNameAndPwd(String name,String pwd);
<select id="selectUserByNameAndPwd" resultType="UserInfo">
select * from user_info where usename = #{param1} and use_password = #{param2}
</select>
<select id="selectUserByNameAndPwd" resultType="UserInfo">
select * from user_info where usename = #{arg0} and use_password = #{arg1}
</select>
两种方式可以混用,同样#{}和${}也可混用,但要考虑‘’的问题
<select id="selectUserByNameAndPwd" resultType="UserInfo">
select * from user_info where usename = '${arg0}'and use_password = #{param2}
</select>
1.3 map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在 map中 只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。和1.2中提到的一致,1.2中是默认以arg0...和param为键。参数为值,而自定义map则是以自己设置的来访问数据。
public UserInfo CheckLoginByMap(Map<String,String> map);
Map<String,String> map = new HashMap<>();
map.put("pwd","123");
map.put("name","ybc");
<select id="CheckLoginByMap" resultType="UserInfo">
select * from user_info where usename=#{name } and use_password=#{pwd}
</select>
DEBUG 11-02 23:51:29,160 ==> Preparing: select * from user_info where usename=? and use_password=? (BaseJdbcLogger.java:137)
DEBUG 11-02 23:51:29,161 ==> Parameters: ybc(String), 123(String) (BaseJdbcLogger.java:137)
DEBUG 11-02 23:51:29,163 <== Total: 1 (BaseJdbcLogger.java:137)
UserInfo(userId=12, useName=ybc, usePassword=123, createTime=null, updateTime=Sat Oct 29 22:10:14 CST 2022)
结果输出正常。
1.4实体类类型的参数
若mapper接口中的方法参数为实体类对象时 此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。
public int InsertUser(UserInfo userInfo);
package mybaits.Pojo;
import lombok.Data;
import java.util.Date;
@Data
public class UserInfo {
private Long userId;
private String useName;
private String usePassword;
private Date createTime;
private Date updateTime;
public UserInfo(){}
public UserInfo(Long userId, String useName, String usePassword, Date createTime, Date updateTime) {
this.userId = userId;
this.useName = useName;
this.usePassword = usePassword;
this.createTime = createTime;
this.updateTime = updateTime;
}
}
UserInfo userInfo1 = new UserInfo(null,"wyf","111",null,null);
System.out.println(userInfoMapper.InsertUser(userInfo1));
<insert id="InsertUser">
insert into user_info(usename,use_password) values(#{useName},#{usePassword})
</insert>
输出结果:
DEBUG 11-03 00:08:59,047 ==> Preparing: insert into user_info(usename,use_password) values(?,?) (BaseJdbcLogger.java:137)
DEBUG 11-03 00:08:59,047 ==> Parameters: wyf(String), 111(String) (BaseJdbcLogger.java:137)
DEBUG 11-03 00:08:59,051 <== Updates: 1 (BaseJdbcLogger.java:137)
1
注意:何为属性名?即geter seter方法中去掉get和set并将首字母小写即为属性名
1.5使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数 此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以 param1,param2...为键,以参数为值;只需要通过${}和#{}访问map集合的键就可以获取相对应 的值, 注意${}需要手动加单引号。相较于1.2就是更改存储的键。
<select id="CheckLoginByParam" resultType="UserInfo">
select * from user_info where usename=#{username} and use_password=#{pwd}
</select>
public UserInfo CheckLoginByParam(@Param("username")String name,@Param("pwd") String pwd);
DEBUG 11-03 00:24:36,507 ==> Preparing: select * from user_info where usename=? and use_password=? (BaseJdbcLogger.java:137)
DEBUG 11-03 00:24:36,507 ==> Parameters: dsd(String), 1(String) (BaseJdbcLogger.java:137)
DEBUG 11-03 00:24:36,509 <== Total: 1 (BaseJdbcLogger.java:137)
UserInfo(userId=13, useName=dsd, usePassword=1, createTime=Sat Sep 03 09:26:48 CST 2022, updateTime=Sat Sep 03 09:26:50 CST 2022)