第一个例子用的是完全限定类名方式操作映射的sql语句:
User user = session.selectOne("com.mybatis.entity.UserMapper.selectUserByID",1);
Mybatis提供了使用接口方式操作已经映射的sql语句:
BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101);
1.搭建环境省略
2.创建接口
package com.mybatis.interfac; import com.mybatis.entity.User; public interface IUserMapper { /** * 该方法名对应User.xml中查询语句的id,User.xml中的namespace对应该接口的路径 * com.mybatis.interfac.IUserMapper */ public User selectUserByID(int id); }
3.更改User.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"> <!-- 该namespace对应接口路径,否则抛出异常:"...is not known to the MapperRegistr" 每个select中id对应接口中的一个方法名 --> <mapper namespace="com.mybatis.interfac.IUserMapper"> <select id="selectUserByID" parameterType="int" resultType="User"> select * from tb_user where id = #{id} </select> </mapper>
4.测试
package com.mybatis.test; import java.io.IOException; import java.io.Reader; 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 com.mybatis.entity.User; import com.mybatis.interfac.IUserMapper; public class MybatisDemo { //这里采用了静态单列模式确保SqlsessionFactory的唯一性, private static SqlSessionFactory sessionFactory=null; private static Reader reader=null; static { try { reader = Resources.getResourceAsReader("Configuration.xml"); //从xml配置文件中构建sessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); } } private static SqlSessionFactory getSessionFactory() { return sessionFactory; } public static void main(String[] args) { SqlSession session = null; try { session = getSessionFactory().openSession(); //方式1:User user = session.selectOne("com.mybatis.entity.UserMapper.selectUserByID",1); //方法2:接口编程 IUserMapper usermapper = session.getMapper(IUserMapper.class); User user = usermapper.selectUserByID(1); System.out.println(user.getUserAddress()); } catch (Exception e) { e.printStackTrace(); }finally { session.close(); } } }
注意:(官网文档)
1.命名空间,在之前版本的 MyBatis 中是可选项,非常混乱也没有帮助。现在,命名空间是必须的,而且有一个目的,它使用更长的完全限定名来隔离语句
命名空间使得接口绑定成为可能.
2.基于接口方式的编程有很多优点:
首先它不是基于文字的,那就更安全了。第二,如果你的 IDE 有代码补全功能,那么你可以利用它来操纵已映射的 SQL 语句。第三,不需要强制类型转换,同时 IUserMapper接口可以保持简洁,返回值类型很安全(参数类型也很安全) 。