zoukankan      html  css  js  c++  java
  • 【JavaEE】之MyBatis开发DAO

      在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代理方式简单,又避免了代码的硬编码,因此现在通常都使用这种方式。

  • 相关阅读:
    C++ 虚函数表解析(转载)
    javaWeb中的/路径问题
    java创建多线程(转载)
    JSP中pageEncoding和charset区别,中文乱码解决方案(转载)
    Class.forName()的作用与使用总结(转载)
    Java内存模型
    java-锁膨胀的过程
    java对象头信息和三种锁的性能对比
    并发容器
    synchronized和volatile以及ReentrantLock
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6211324.html
Copyright © 2011-2022 走看看