晋南讲堂之持久层框架Mybatis—(二)接口式编程

    xiaoxiao2022-07-12  144

      在上一篇文章中,我们在MybatisTest.java中代码如下。

    package com.mybatis.test; import java.io.IOException; import java.io.InputStream; 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 com.mybatis.beans.Employee; public class MybatisTest { @Test public void test() throws IOException { String resource = "Mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession openSession = sqlSessionFactory.openSession(); try { Employee employee = openSession.selectOne("com.mybatis.EmployeeMapper.selectEmp", 1); //selectOne第二个参数类型为Object类型,我们传入了1 System.out.println(employee); } finally { openSession.close(); } } }

      我们将selectOne中的第二个参数设置成了1,但第二个参数是Object类型的,所以我们甚至可以传任何东西,而数据库里id是数字,这显然不合理。所以需要采用接口式编程。   在上篇文章中的项目下新建一个接口。 代码如下:

    package com.mybatis.Dao; import com.mybatis.beans.Employee; public interface EmployeeMapper { public Employee getEmpById(Integer id); }

    需要把接口与SQL的配置文件进行动态绑定,这时EmployeeMapper.xml中的namespace不能再随意命名,应该写成该接口的全类名。接口里定义了一个根据id查员工的方法,所以把select标签的id改成接口中的方法名,代码如下:

    <?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="com.mybatis.Dao.EmployeeMapper"> <!-- namespace设为接口的全类名 --> <select id="getEmpById" resultType="com.mybatis.beans.Employee"> <!-- select标签中的id设为接口中的方法名 --> select id,last_name lastName,gender,email from tbl_employee where id = #{id} </select> </mapper>

    MybatisTest.java代码新增test1测试方法,新增代码如下:

    @Test public void test1() throws IOException{ String resource = "Mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession openSession = sqlSessionFactory.openSession(); try { //我们并没有为EmployeeMapper接口写实现类,但通过接口与配置文件的绑定,mybatis会为接口创建一个代理对象 //通过getMapper获得EmployeeMapper的代理对象 EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); System.out.println(mapper.getClass()); //通过EmployeeMapper接口的代理对象来调用getEmpById()方法,进行数据库的CRUD操作 Employee employee = mapper.getEmpById(2);//限制了传递的参数必须为Integer类型 System.out.println(employee); } finally { openSession.close(); } }

    在代码中选中test1测试方法,右键run as,以JUnit Test方式运行,得到如下结果。接口编程是常用的方式,会对传递的参数进行类型检查,所以强烈建议使用这种方式。

    最新回复(0)