刚学习MyBatis,对于用@Mapper注解的接口能够完成POJO对象到数据库记录映射百般疑惑,一开始很纳闷为什么不需要定义Mapper接口的实现类就能完成这个过程。例如以下代码段中只定义了UserDAO这个接口,但是并不影响POJO对象到数据库的映射。查阅了相关的资料,稍有解惑。
@Mapper
public interface UserDAO {
String TABLE_NAME = "user";
String INSERT_FIELDS = "name, password, salt, head_url";
String SELECT_FIELDS = "id, name, password, salt, head_url";
@Insert({"insert into", TABLE_NAME, "(", INSERT_FIELDS, ") values(#{name}, #{password}, #{salt}, #{headUrl})"})
int addUser(User user);
}
public class InitDBTest {
@Autowired
UserDAO userDAO;
public void contextLoads() {
User user = new User();
user.setName("user1");
user.setPassword("");
user.setSalt("");
user.setHeadUrl("xxx.png");
userDAO.addUser(user);
}
}
1. MapperRegistry
程序启动之初MyBatis就创建了这个类的一个实例,它有一个HashMap类型的属性用于存储每个Mapper接口(key)和相应的MapperProxyFactory(value);另外有两个重要的方法getMapper()和addMapper(),分别用于获取和注册Mapper接口到这个HashMap中。