接口绑定
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>
来源: http://www.bubuko.com/infodetail-3346954.html