当前位置: 首页>编程语言>正文

mybatis 绑定session变量 租户 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>
  1. 调用 sqlSession 的 getMapper(Class c); 方法,参数为对应 mapper.xml的接口的 类类型 -->即 '接口名.class'
  2. 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>
  1. @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>
  1. 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>
  1. Javabean 传参(类似第一种顺序传参(传递的参数是基本数据类型),只不过传递的是一个对象了,)
public User selUser(User user);
<select id="selectUser" parameterType="user">
      select * from user where username = #{username} and pwd = #{pwd}
</select>

https://www.xamrdz.com/lan/5sc1960594.html

相关文章: