Mybatis笔记1(获取参数的方法)

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值