Mybatis通过接口完成映射过程
1.概述
为了简化Mybatis的使用,Mybatis提供了接口方式自动化生成调用过程的机制,可以大大简化MyBatis的开发
2.实现过程
2.1开发映射文件
<?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="cn.wyy.mapper.UserMapper">
<select id="selectOrderByAge" resultType="cn.wyy.domain.User">
select * from user order by age;
</select>
<select id="selectAll" resultType="cn.wyy.domain.User">
select * from user;
</select>
<select id="selectById" resultType="cn.wyy.domain.User">
select * from user where id = #{id};
</select>
<select id="selectByAgeRange" resultType="cn.wyy.domain.User">
select * from user where age between #{min} and #{max};
</select>
<insert id="insertUser">
insert into user values (null,#{name},#{age});
</insert>
</mapper>
2.2开发接口
注意:开发接口时,必须满足以下四个要求
1.接口的全路径名应该为映射文件中声明的名称空间
2.接口中应该声明和映射文件中sql对应的名称相同的方法
3.方法接收的参数应该和sql中接收的参数一致
4.方法的返回值应该和sql中声明的返回值类型一致
public interface UserMapper {
public List<User> selectOrderByAge();
public List<User> selectAll();
public User selectById(int id);
public List<User> selectByAgeRange(@Param("min") int min,@Param("max") int max);
public void insertUser(User user);
}
2.3开发测试类
在测试类中,接口对应的userMapper直接调用了selectByAgeRange()方法,其实这里不是接口对象去调用的方法,在上一步调用getMapper时就可以理解为返回了一个实现类对象,因为在Mybatis中getMapper底层是采用动态代理实现的然后向上造型给接口对象。在idea中可以通过下图所示的图标进入到动态代理的源码,查看其实现。
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test{
@Test
public void test01() throws IOException {
//1.创建SqlSessionFactory
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//2.创建SqlSession
SqlSession session = factory.openSession();
//3.调用sql
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> list = userMapper.selectByAgeRange(20, 30);
System.out.println(list);
//4.销毁session
session.close();
}
}
3.小结
真正的开发中,都是使用这种接口+配置文件方式,实现Mybatis的使用
实现过程
3.1Mybatis启动,解析slqMapConfig.xml得到映射文件路径
3.2加载映射文件,根据配置的namespace找到对应的处理接口
3.3自动生成UserMapper的实现类,在其中实现了声明的所有方法,对应到映射文件中的sql
3.4当通过sqlSession.getMapper获取映射接口时,实际上返回的是Mybatis为该接口实现的实现类对象