MyBatis 映射使用方式以及参数传递源码分析

6 篇文章 0 订阅
5 篇文章 0 订阅

MyBatis 映射文件

select

1)Mapper接口方法

public Employee getEmployeeById(Integer id );

2)Mapper映射文件

<select id="getEmployeeById" 
          resultType="com.atguigu.mybatis.beans.Employee" 
          databaseId="mysql">
		 select * from tbl_employee where id = ${_parameter}
</select>

insert
1)Mapper接口方法

public Integer  insertEmployee(Employee employee);

2)Mapper映射文件

<insert id="insertEmployee" 
		parameterType="com.atguigu.mybatis.beans.Employee"  
			databaseId="mysql">
		insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>

update

1)Mapper接口方法

public Boolean  updateEmployee(Employee employee);

Mapper映射文件

<update id="updateEmployee" >
		update tbl_employee set last_name = #{lastName},
					  email = #{email},
					  gender = #{gender}
					   where id = #{id}
</update>

delete

1)Mapper接口方法

public void  deleteEmployeeById(Integer id );

2)Mapper映射文件

<delete id="deleteEmployeeById" >
		delete from tbl_employee where id = #{id}
</delete>

参数传递的方式

1)单个参数
可以接受基本类型,对象类型。这种情况MyBatis可直接使用这个参数,不需要经过任 何处理。
2)多个参数
任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,或者0,1…,值就是参数的值
3)命名参数
为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
4)POJO
当这些参数属于我们业务POJO时,我们直接传递POJO
5)Map
我们也可以封装多个参数为map,直接传递
6)Collection/Array
会被MyBatis封装成一个map传入, Collection对应的key是collection,Array对应的key是array. 如果确定是List集合,key还可以是list.

参数传递源码分析
1,以命名参数为例:

public Employee getEmployeeByIdAndLastName
(@Param("id")Integer id, @Param("lastName")String lastName);
public Object getNamedParams(Object[] args) {
    final int paramCount = names.size();
    if (args == null || paramCount == 0) {
      return null;
    } else if (!hasParamAnnotation && paramCount == 1) {
      return args[names.firstKey()];
    } else {
      final Map<String, Object> param = new ParamMap<Object>();
      int i = 0;
      for (Map.Entry<Integer, String> entry : names.entrySet()) {
        param.put(entry.getValue(), args[entry.getKey()]);
        // add generic param names (param1, param2, ...)
        final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);
        // ensure not to overwrite parameter named with @Param
        if (!names.containsValue(genericParamName)) {
          param.put(genericParamName, args[entry.getKey()]);
        }
        i++;
      }
      return param;
    }
  }

参数处理
1)参数位置支持的属性:
javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、expression

2)实际上通常被设置的是:可能为空的列名指定 jdbcType ,例如:

insert into orcl_employee(id,last_name,email,gender) values(employee_seq.nextval,#{lastName, ,jdbcType=NULL },#{email},#{gender})可以在全局配置文件指定为null 也可以像上面这面这样单独配置

参数的获取方式
1)#{key}:可取普通类型、POJO类型、多个参数、集合类型
获取参数的值,预编译到SQL中。安全。Preparedstatement
2) k e y : 可 取 单 个 普 通 类 型 、 P O J O 类 型 、 多 个 参 数 、 集 合 类 型 注 意 : 取 单 个 普 通 类 型 的 参 数 , {key}:可取单个普通类型、POJO类型、多个参数、集合类型 注意:取单个普通类型的参数, keyPOJO{}中不能随便写 必须用_parameter
_parameter是Mybatis的内置参数
获取参数的值,拼接到SQL中。有SQL注入问题。Statement ORDER BY ${name}

原则:能用#{}取值就优先使用#{} 解决不了的使用 e . g . 原 生 的 J D B C 不 支 持 占 位 符 的 地 方 就 可 以 使 用 {} e.g.原生的JDBC不支持占位符的地方 就可以使用 e.g.JDBC使{}
e.g.Select column1,column2…from 表 where 条件 group by 组表示 having 条件
order by 排序字段 desc/asc limit X,X;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值