mybatis 接口绑定方案及多参数传递
Posted ressso
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 接口绑定方案及多参数传递相关的知识,希望对你有一定的参考价值。
接口绑定
- MyBatis 中, 提供了一套接口绑定方案. 程序员可以提供一个接口, 然后提供对应接口的一个mapper.xml 文件.
- MyBatis 会自动将接口和 xml 文件进行绑定. 实际上就是MyBatis 会根据接口和对应的 xml文件创建接口的实现类.
- 其原理是使用了JDK动态代理Proxy来实现接口,代理类使用 反射调用mapper.xml生成的原生 sql 方法
优点
-
- 通过调用接口对象的方法就可以操作 mapper.xml 中编写的 sql
- 调用方法明确,因为我们调用的是接口中的某个具体方法,而不再是通过一个字符串来指定执行映射文件中的某个SQL语句了
使用
- 、创建一个接口
接口包名和接口名与 mapper.xml 中<mapper>namespace相同。即接口的全限定类名要和 xml中的 <mapper>namespace相同
接口中方法名和 mapper.xml 标签的 id 属性相同 - 在 mybatis.xml 中使用<package>进行扫描接口和 mapper.xml
扫描单个接口, 可以使用 mapper 标签的 class 属性
<mappers> <mapper class="com.bjsxt.mapper.UserMapper" /> </mappers>
当扫描多个接口时, 为简化配置, 可以使用 package 标签
<mappers> <package name="com.bjsxt.mapper" /> </mappers>
- 调用 sqlSession 的 getMapper(Class c); 方法,参数为对应 mapper.xml的接口的 类类型 -->即 ‘接口名.class‘
- 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 自定义对结果集的处理
- 顺序传参法
public User selUser(String name, int pwd);
<select id="selectUser" resultType="User">// resultType 可以省略不谢 select * from user where username = #{0} and pwd = #{1} </select>
- @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>
- 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>
- Javabean 传参(类似第一种顺序传参(传递的参数是基本数据类型),只不过传递的是一个对象了,)
public User selUser(User user);
<select id="selectUser" parameterType="user"> select * from user where username = #{username} and pwd = #{pwd} </select>
以上是关于mybatis 接口绑定方案及多参数传递的主要内容,如果未能解决你的问题,请参考以下文章
JavaLearn#(27)MyBatis进阶:Mapper代理(接口绑定)多参数传递模糊查询分页自增主键回填动态SQL一级缓存二级缓存
JavaLearn#(27)MyBatis进阶:Mapper代理(接口绑定)多参数传递模糊查询分页自增主键回填动态SQL一级缓存二级缓存