在MyBatis+Spring 的项目中,虽然使用传统的DAO开发方式可以实现所需功能,但是采用这种方式在实现类中会出现大量的重复代码,在方法中也需要指定映射文件中执行语句的id,并且不能保证编写时id 的正确性。为此,我们可以使用MyBatis提供的另外
一种编程方式,即使用Mapper接口编程。
我们写一个实例来描述Mapper接口编程,首先编写一个接口Dao
import com.mobile.po.UserPo;
/**
* UserDao层
* @author CHRISTMASY
*
*/
public interface UserDao{
public UserPo findByName(String name);
}
并在其同级目录下创建同名的xml映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mobile.dao.UserDao">
<!-- 查询用户信息byName -->
<select id="findByName" parameterType="String" resultType="UserPo">
select * from s_user where UserNuber = #{UserNuber}
</select>
</mapper>
上面这些工作完成之后,我们就可以在spring配置文件中创建一个Bean对dao包进行扫描
<!-- 接口开发,扫描com.itheima.core.dao,写在此包下的接口将会被扫描到 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mobile.dao"/>
</bean>
接下来就是在Service层实现Dao了,这里就不详细讲解,我们直接在controller中调用。
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService service;
/**
* 登录
* @param userPo
* @return
*/
@RequestMapping(value="/login",method=RequestMethod.POST)
@ResponseBody
public String Login(UserPo userPo,HttpSession session){
UserPo po = service.findByName(userPo.getUserNuber());
if(po!=null){
if(po.getPassWord().equals(MD5Util.getMD5(userPo.getPassWord()))){
session.setAttribute("USER_INFO", po);
if(po.getUserTypeID()==1){
return "boss";
}else{
return "staff";
}
}else{
return "密码错误!";
}
}else{
return "该用户不存在!";
}
}
可以运行项目测试结果
虽然Mapper接口编程方式很简单,但是在具体使用时还是需要遵循以下规范:
1) Mapper接口的名称和对应的Mapper.xml映射文件的名称必须一致。
2) Mapper.xml 文件中的namespace与Mapper接口的类路径相同(即接口文件和映射文件需要放在同一个包中)。
3) Mapper接口中的方法名和Mapper且nl 中定义的每个执行语句的id相同。
4) Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个sql 的parameterType的类型相同。
5) Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个sql 的resultType的类型相同.
只要遵循了这些开发规范,MyBatis就可以自动生成Mapper接口实现类的代理对象,从而简化我们的开发.