6.1 Mapper接口开发介绍

在上面的Mybatis案例中,
通过SqlSession对象调用方法进行增删改查操作时,
方法中需要传入的第一个参数是一个字符串值,
该值对应的内容为:
(Mapper文件中的) namespace + id, 通过这种方式, 找到Mapper文件中映射的SQL语句并执行!!
这种方式由于传入的是字符串值,
很容易发生字符串拼写错误且编译时期不会提示。


这里我们将会讲解比上面更加简单的方式,
也是我们企业开发中最常用的方式,
即使用mapper接口开发。

使用mapper接口开发需要注意以下几点:

1、创建一个接口,接口的全路径名和mapper文件的namespace值要
		相同

2、mapper文件中每条要执行的SQL语句,在接口中要添加一个对应的方法,
		并且接口中的方法名和SQL标签上的id值
		相同

3、Mapper接口中方法接收的参数类型,和mapper.xml中定义的sql的接收的参数类型要
		相同

4、接口中方法的返回值类型和SQL标签上的resultType即返回值类型
		相同
		(
			如果方法返回值是集合,
			resultType只需要指定集合中的泛型
		)

6.2 Mapper接口开发实现

下面将使用mapper接口开发的方式,实现根据id查询指定的员工信息

1、创建com.tedu.dao.EmpMapper接口

由于接口的全路径名(com.tedu.dao.EmpMapper)要和EmpMapper.xmlnamespace值保持一致,
因此, 这里将namespace的值改为com.tedu.dao.EmpMapper

<?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.tedu.dao.EmpMapper">

</mapper>

2、在接口中提供findById方法

/** * 根据id查询员工信息 * @param id * @return Emp */
public Emp findById(Integer id);

注意:方法的名字要和映射的sql标签的id值保持一致
方法的返回值类型和resultType的类型要一致

<!-- 1.查询:查询Emp表中指定id的员工信息 -->
<select id="findById" resultType="com.tedu.pojo.Emp">
	select * from emp where id=#{id}
</select>

3、提供实现类,测试Emp接口中的根据id查询员工的方法

(1)创建com.tedu.test.TestMybatisInf类, 并提供testFindById方法

public class TestMybatisInf {
	@Test
	public void testFindById() throws Exception{}
}

4、 实现testFindById方法并测试

@Test
public void testFindById() throws Exception{
	......
	//3.获取Mapper接口对象
	EmpMapper map = session.getMapper(EmpMapper.class);
	//4.调用接口对象的方法进行查询
	Emp e = map.findById(2);
	//5.输出结果
	System.out.println(e);
}

5、在接口中提供findAll方法

/** * 查询所有的员工信息 * @return List<Emp> */
public List<Emp> findAll();

注意:方法的名字要和映射的sql标签的id值保持一致
方法的返回值类型和resultType的类型要一致, 例如:

<!-- 2.查询Emp表中所有员工的信息 -->
<select id="findAll" resultType="com.tedu.pojo.Emp">
	select * from emp
</select>

6、提供实现类,测试Emp接口中的查询所有员工的方法

(1)创建com.tedu.test.TestMybatisInf类, 并提供testFindAll方法

public class TestMybatisInf {
	......
	@Test
	public void testFindAll () throws Exception{}
}

实现testFindAll方法并测试

@Test
public void testFindAll() throws Exception{
	...... 
	//3.获取Mapper接口对象
	EmpMapper map = session.getMapper(EmpMapper.class);
	//4.调用接口对象的方法进行查询
	List<Emp> list = map.findAll();
	//5.输出结果
	for (Emp e : list) {
		System.out.println(e);
	}
}