MyBatis接口式编程(SqlSession直接调用API向接口转变)

时间:2022-06-01 19:20:59

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的(黑箱操作)。