动态代理Mapper实现类
- 传统CRUD中存在的问题
① 每个模块都需要编写一个接口及对应的实现类,并且还需要编写一个Mapper文件;
② 在实现类的每个方法中,使用Mybatis的方式很相似,都是增删改查;
我们能否只编写接口及mapper文件,不用写实现类,mybatis提供了接口的动态代理来简化开发 - Mapper接口的动态代理实现条件
① 映射文件中的namespace必须和接口的全路径名一致;
<mapper namespace="cn.itcast.mapper.UserMapper">
② 映射文件中的statementId必须和接口中方法名一致;
/**
* 登录
* 使用动态代理,当接口中的某个方法有多个参数时,通过@Param注解指定参数名字
* @param userName
* @param password
* @return
*/
public User login(@Param("userName")String userName, @Param("password")String password);
<!--
此处需要接收多个参数,有三种方式:
方式一:#{0} #{1}
方式二:#{param1} #{param2}
方式三:在接口方法的形参中加@Param注解指定名字,这里通过#{名字}来接收参数,如果只有
一个参数,#{名字}可以自定义
-->
<select id="login" resultType="User">
select * from tb_user where user_name = #{userName} and password = #{password}
</select>
③ 映射文件中的resultType必须和接口中方法的返回类型一致;
④ 映射文件中的parameterType必须和接口中方法的形参类型一致;(不一定,因为parameterType可以省略)
动态代理优化
- 配置接口全路径
在mybatis-config.xml中配置接口的全路径名
<mappers>
<mapper class="com.ityang.dao.UserMapper"></mapper>
</mappers>
这样配置,并没有指定接口对应的映射文件的路径;为了能够找到映射文件,需要满足一定的条件:
1、映射文件和接口在同一个目录;
2、映射文件的名字必须和接口的名字保持一致;
3、映射文件中的namespace和接口的全路径名一致;
弊端:
1、每增加一个mapper文件,都要在mybatis-config.xml中引入;
2、Java文件和mapper文件耦合;
- 配置package
<mappers>
<package name="com.ityang.dao"></package>
</mappers>
弊端:Java文件和mapper文件耦合。
最优化的写法在spring整合mybatis会讲解。