mybatis 接口绑定方案及多参数传递

Posted ressso

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 接口绑定方案及多参数传递相关的知识,希望对你有一定的参考价值。

接口绑定

  • MyBatis 中, 提供了一套接口绑定方案. 程序员可以提供一个接口, 然后提供对应接口的一个mapper.xml 文件.
  • MyBatis 会自动将接口和 xml 文件进行绑定. 实际上就是MyBatis 会根据接口和对应的 xml文件创建接口的实现类.
  • 其原理是使用了JDK动态代理Proxy来实现接口,代理类使用 反射调用mapper.xml生成的原生 sql 方法

  优点

    • 通过调用接口对象的方法就可以操作 mapper.xml 中编写的 sql
    • 调用方法明确,因为我们调用的是接口中的某个具体方法,而不再是通过一个字符串来指定执行映射文件中的某个SQL语句了

  使用

    1. 、创建一个接口
      接口包名和接口名与 mapper.xml 中<mapper>namespace相同。即接口的全限定类名要和 xml中的 <mapper>namespace相同
      接口中方法名和 mapper.xml 标签的 id 属性相同
    2. 在 mybatis.xml 中使用<package>进行扫描接口和 mapper.xml
      扫描单个接口, 可以使用 mapper 标签的 class 属性
      <mappers>
          <mapper class="com.bjsxt.mapper.UserMapper" />
      </mappers>

      当扫描多个接口时, 为简化配置, 可以使用 package 标签

      <mappers>
      <package name="com.bjsxt.mapper" />
      </mappers>
    3. 调用 sqlSession 的 getMapper(Class c); 方法,参数为对应 mapper.xml的接口的 类类型 -->即 ‘接口名.class‘
    4. getMapper(Class c) 返回是该接口的实现类 对象,可以通过接口的实现类对象调用接口中定义好的方法

    使用注意

    • mapper.xml 中编写 sql 标签语句时,无需再写 parameterType 这个属性,传入参数直接在接口中传入
    • 通过:#{0},#{1}来引用接口中的传递的参数
      或者使用:#{param+数字}的方式.(数字,从 1 开始)
      注意:在有些情况下 #{0},#{1}可能无法找到参数,需要使用#{arg0}, #{arg1} 的方式来获取 (arg 角标,从 0 开始)

    #{} 和 ${} 的区别

    • #{}   (建议使用该方式)
      #是占位符, 会对SQL进行预编译,相当于?
      #不需要关注数据类型, MyBatis自动实现数据类型转换
    • ${}
      $是做sql拼接, 有SQL注入的隐患
      ${} 必须自己判断数据类型

 多参数传递

 多参数传递依赖于接口绑定,传递方式是在接口方法的形参中设置多个参数

在 全局配置文件添加以下标签,可以省略 包名,达到简写的效果
<!--直接给某个包下所有类起别名,别名为类名, 不区分大小写  -->
     <typeAliases>
         <package name="com.pojo"/>
         </typeAliases>

 

  常用的传参方式

parameterType:接收参数类型
resultType:返回值类型,使用接口绑定 可以省略。因为在接口中已经定义了返回值类型
resultMap:方返回值类型不是基本数据类型时,使用resultMap 自定义对结果集的处理
  1. 顺序传参法
    public User selUser(String name, int pwd);
    <select id="selectUser" resultType="User">// resultType 可以省略不谢
          select * from user where username = #{0} and pwd = #{1}
    </select>

     

  2. @Param 注解传参
    public User selUser(@Param("username")String name, @Param("pwd")int pwd);
    <select id="selectUser" parameterType="User">
          select * from user where username = #{username} and pwd = #{pwd}
    </select>

     

  3. Map 传参
    public User selectUser(Map<String, Object> params);//集合中包含 key=username:value=xxxx,key=pwd:value=xxxxx
    <select id="selectUser" parameterType="java.uyil.Map">
          select * from user where username = #{username} and pwd = #{pwd}
    </select>

     

  4. Javabean 传参(类似第一种顺序传参(传递的参数是基本数据类型),只不过传递的是一个对象了,)
    public User selUser(User user);
    <select id="selectUser" parameterType="user">
          select * from user where username = #{username} and pwd = #{pwd}
    </select>

     

以上是关于mybatis 接口绑定方案及多参数传递的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis2

Mybatis基础

(傲娇的白狐)mybatis一对多及多对一

JavaLearn#(27)MyBatis进阶:Mapper代理(接口绑定)多参数传递模糊查询分页自增主键回填动态SQL一级缓存二级缓存

JavaLearn#(27)MyBatis进阶:Mapper代理(接口绑定)多参数传递模糊查询分页自增主键回填动态SQL一级缓存二级缓存

MyBatis传递参数