在SSM框架中的DAO层就是MyBatis中的Mapper,Mapper分为两部分:Mapper接口(JAVA文件)和Mapper映射文件(XML文件)。DAO开发(Mapper开发)有两种方式:原始DAO开发和Mapper代理代码。今天就来介绍一下这两种方式。
1、原始DAO开发
原始DAO开发就是不仅需要创建DAO接口,还需要创建其实现类。代码如下:
DAO接口中的代码如下:
public interface EmployeeDao { Employee findEmployeeById(int empNo) throws Exception; List<Employee> findEmployeeByName(String name) throws Exception; void insertEmployee(Employee employee) throws Exception; void updateEmployee(Employee employee) throws Exception; void deleteEmployee(int empNo) throws Exception; }
DAO实现类中的代码如下:
public class EmployeeDaoImpl implements EmployeeDao { private SqlSessionFactory factory; // 通过构造方法注入SqlSessionFactory对象 public EmployeeDaoImpl(SqlSessionFactory factory) throws Exception { this.factory = factory; } @Override public Employee findEmployeeById(int empNo) throws Exception { SqlSession session = factory.openSession(); Employee employee = session.selectOne("test.findEmployeeById", empNo); session.close(); return employee; } @Override public List<Employee> findEmployeeByName(String name) throws Exception { SqlSession session = factory.openSession(); List<Employee> list = session.selectList("test.findEmployeeByName", name); session.close(); return list; } @Override public void insertEmployee(Employee employee) throws Exception { SqlSession session = factory.openSession(); session.insert("test.insertEmployee", employee); session.commit(); session.close(); } @Override public void updateEmployee(Employee employee) throws Exception { SqlSession session = factory.openSession(); session.update("test.updateEmployee", employee); session.commit(); session.close(); } @Override public void deleteEmployee(int empNo) throws Exception { SqlSession session = factory.openSession(); session.delete("test.deleteEmployee", empNo); session.commit(); session.close(); } }
测试类代码如下:
public class EmployeeDaoImplTest { private SqlSessionFactory factory; // 此方法在执行下面的所有方法之前执行 @Before public void setUp() throws Exception { // 创建SqlSessionFactory // MyBatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream is = Resources.getResourceAsStream(resource); // 创建会话工厂,传入MyBatis配置文件的信息 factory = new SqlSessionFactoryBuilder().build(is); } @Test public void testFindEmployeeById() throws Exception { // 创建UserDao对象 EmployeeDao dao = new EmployeeDaoImpl(factory); // 调用UserDao对象中的方法 Employee employee = dao.findEmployeeById(7369); System.out.println(employee); } }
从上面的代码中可以看到,原始DAO开发方法存在以下三个问题:
- DAO接口实现类中有大量的重复代码,如果把这些代码提取出来,可以大大减轻程序员的工作量。
- 使用SqlSession的各个方法时都需要将statement的id以硬编码的方式写入到JAVA代码中,不利于维护。
- 在调用SqlSession的各个方法时,即使参数类型错误,在编译阶段也不会报错,不利于程序debug。
针对上面的问题,我们推出Mapper代理方法开发DAO。
2、Mapper代理开发
MyBatis可以自动生成Mapper接口的代理对象(即Mapper实现类),我们可以利用这一点来简化原始DAO开发的代码。
在Mapper代理开发DAO时,需要遵循以下四条开发规范:
- Mapper.xml中的namespace是Mapper接口的全路径地址;
- Mapper接口中的方法名和Mapper.xml文件中statement的id相同;
- Mapper接口中方法的输入参数类型和Mapper.xml中statement的parameterType相同;
- Mapper接口中方法的返回值类型和Mapper.xml中statement的resultType相同。
以下是代码:
Mapper.xml中的namespace代码:
<mapper namespace="com.itgungnir.hellomybatis.mapper.EmployeeMapper"> …… </mapper>
Mapper接口中的代码:
public interface EmployeeMapper { Employee findEmployeeById(int empNo) throws Exception; List<Employee> findEmployeeByName(String name) throws Exception; void insertEmployee(Employee employee) throws Exception; void updateEmployee(Employee employee) throws Exception; void deleteEmployee(int empNo) throws Exception; }
测试代码:
public class EmployeeMapperTest { private SqlSessionFactory factory; // 此方法在执行下面的所有方法之前执行 @Before public void setUp() throws Exception { // 创建SqlSessionFactory // MyBatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream is = Resources.getResourceAsStream(resource); // 创建会话工厂,传入MyBatis配置文件的信息 factory = new SqlSessionFactoryBuilder().build(is); } @Test public void testFindEmployeeById() throws Exception { SqlSession session = factory.openSession(); EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); Employee employee = mapper.findEmployeeById(7369); session.close(); System.out.println(employee); } }
由于Mapper代理方式简单,又避免了代码的硬编码,因此现在通常都使用这种方式。