基础方式的crud需要使用到一个statement作为参数告诉session我要执行哪个SQL语句,不利于管理。采用动态代理方式,引入一个接口就能像调用函数一样直接调用SQL。
接口编写
对于接口编写时需要注意几点,这是mybatis的约定,遵循约定mybatis才能理解接口的意思。
- 方法名和mapper.xml文件中标签的id值相同
- 方法输入参数和parameterType相同
- 方法返回值和resultType相同
对于对应的mapper.xml文件,namespace的值为接口文件的全路径。
新建接口
public interface PersonMapper {
Person queryPersonById(int id);
List<Person> queryAllPersons();
}
personMapper.xml的namespace改为接口路径
<?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="mapper.PersonMapper"> <!-- 根据接口名可以找到对应mapper文件-->
<!-- 根据接口的方法名可以找到对应SQL语句id-->
<select id="queryPersonById" resultType="entities.Person" parameterType="int">
select * from person where id = #{id}
</select>
<select id="queryAllPersons" resultType="entities.Person">
select * from person
</select>
</mapper>
通过session获得mapper代理
public class testMybatis {
public static PersonMapper getPersonMapper() throws IOException {
//加载mybatis配置文件
Reader reader = Resources.getResourceAsReader("conf.xml");
//获取SQLSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//获取SqlSession
SqlSession session = sessionFactory.openSession();
//采用动态代理方式,输入参数为 需要获得的接口.class
return session.getMapper(PersonMapper.class);
}
public static void main(String[] args) throws IOException {
PersonMapper personMapper = getPersonMapper();
System.out.println(personMapper.queryPersonById(1));
System.out.println(personMapper.queryAllPersons());
}
}