接口绑定
- 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>