package com.atguigu.mybatis.dao; import com.atguigu.mybatis.bean.Employee; /** * @Author 谢军帅 * @Date2019/11/11 16:16 * @Description */ public interface EmployeeMapper { /** * 根据id查员工 * @param id * @return */ public Employee getEmpById(Integer id); }
上一节的代码中,直接使用SqlSession对象在增删改查时,在传参时,是一个Object类型;传入的参数错误时,实现不了相应的功能。
接口是从数据库查询数据封装成对象,Sql映射文件也是查询数据库返回封装的对象;MyBatis实现接口与SQL映射文件动态绑定。
这时SQL映射文件的namespace就不能随便写了,要指定为接口的全类名。
接口中有一个根据id查询员工的方法,对应SQL映射文件中的SQL,将SQL的id改为方法的id(也就是方法名)。
接口的好处:
1.接口规定的方法拥有更强的类型检查。
2.有明确的返回值。
3.MyBatis使用代理实现接口的实现类的创建。
测试代码:
public class MyBatisTest { public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } @Test public void test2() throws IOException { //1.获取SqlSessionFactory SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //2.获取sqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //3.之前是直接调用增删改查的API,现在接口和Sql有了绑定 //使用sqlSession对象得到接口的实现类对象 EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee = employeeMapper.getEmpById(1); System.out.println(employee.getClass()); System.out.println(employee); sqlSession.close(); } }
1、 接口式编程
原生: Dao===》DaoImpl
MyBatis: Mapper===》xxMapper.xml
2、SqlSession代表和数据库的一次对话;用完必须关闭;
3、SqlSession和Connection一样,都是非线程安全的。每次使用都应该去获取新的对象,不要把它放在成员变量中。
4、mapper接口没有实现类,但是MyBatis会为这个接口生成一个代理对象。
(将接口和xml进行绑定)
EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
5、两个重要的配置文件:
MyBatis的全局配置文件:包含数据连接池的信息,事务管理器信息等。。。系统运行环境信息
sql映射文件:保存了每一个sql语句的映射信息;===》把sql抽取出来,让程序员去编写,区别Hibernate的(黑箱操作)。