【JAVA - SSM】之MyBatis开发DAO

来源:互联网 发布:跳跃网络的游戏有哪些 编辑:程序博客网 时间:2024/06/05 10:29

        在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;}@Overridepublic Employee findEmployeeById(int empNo) throws Exception {SqlSession session = factory.openSession();Employee employee = session.selectOne("test.findEmployeeById", empNo);session.close();return employee;}@Overridepublic List<Employee> findEmployeeByName(String name) throws Exception {SqlSession session = factory.openSession();List<Employee> list = session.selectList("test.findEmployeeByName", name);session.close();return list;}@Overridepublic void insertEmployee(Employee employee) throws Exception {SqlSession session = factory.openSession();session.insert("test.insertEmployee", employee);session.commit();session.close();}@Overridepublic void updateEmployee(Employee employee) throws Exception {SqlSession session = factory.openSession();session.update("test.updateEmployee", employee);session.commit();session.close();}@Overridepublic 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;// 此方法在执行下面的所有方法之前执行@Beforepublic void setUp() throws Exception {// 创建SqlSessionFactory// MyBatis配置文件String resource = "SqlMapConfig.xml";// 得到配置文件流InputStream is = Resources.getResourceAsStream(resource);// 创建会话工厂,传入MyBatis配置文件的信息factory = new SqlSessionFactoryBuilder().build(is);}@Testpublic void testFindEmployeeById() throws Exception {// 创建UserDao对象EmployeeDao dao = new EmployeeDaoImpl(factory);// 调用UserDao对象中的方法Employee employee = dao.findEmployeeById(7369);System.out.println(employee);}}
从上面的代码中可以看到,原始DAO开发方法存在以下三个问题:

(1)DAO接口实现类中有大量的重复代码,如果把这些代码提取出来,可以大大减轻程序员的工作量。

(2)使用SqlSession的各个方法时都需要将statement的id以硬编码的方式写入到JAVA代码中,不利于维护。

(3)在调用SqlSession的各个方法时,即使参数类型错误,在编译阶段也不会报错,不利于程序debug。

针对上面的问题,我们推出Mapper代理方法开发DAO。


2、Mapper代理开发

        MyBatis可以自动生成Mapper接口的代理对象(即Mapper实现类),我们可以利用这一点来简化原始DAO开发的代码。 

        在Mapper代理开发DAO时,需要遵循以下四条开发规范:

        (1)Mapper.xml中的namespace是Mapper接口的全路径地址;

        (2)Mapper接口中的方法名和Mapper.xml文件中statement的id相同;

        (3)Mapper接口中方法的输入参数类型和Mapper.xml中statement的parameterType相同;

        (4)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;// 此方法在执行下面的所有方法之前执行@Beforepublic void setUp() throws Exception {// 创建SqlSessionFactory// MyBatis配置文件String resource = "SqlMapConfig.xml";// 得到配置文件流InputStream is = Resources.getResourceAsStream(resource);// 创建会话工厂,传入MyBatis配置文件的信息factory = new SqlSessionFactoryBuilder().build(is);}@Testpublic 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代理方式简单,又避免了代码的硬编码,因此现在通常都使用这种方式。


1 0