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

【JAVA - SSM】之MyBatis开发DAO的更多相关文章

  1. MyBatis学习--mybatis开发dao的方法

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...

  2. 四 mybatis开发dao的方法

    mybatis开发dao的方法 1.1     SqlSession使用范围 1.1.1     SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...

  3. MyBatis开发Dao层的两种方式(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...

  4. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  5. MyBatis开发Dao

    MyBatis开发Dao有两种方法: 1.原始Dao开发方法,就是程序需要编写Dao的接口和Dao的实现类. 2.MyBatis的mapper接口(相当于Dao接口)代理开发方法.(更重要) ---- ...

  6. 使用mybatis开发dao问题总结

    代码片段: @Override public User getUserById(Integer id) { SqlSession sqlSession = sqlSessionFactory.open ...

  7. 使用mybatis开发dao方法

    使用mybatis开发dao的时候, 主要涉及到SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession 这三个类 现在将这三个类的使用方法简单的说下 ...

  8. MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

    目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...

  9. 【JavaEE】之MyBatis开发DAO

    在SSM框架中的DAO层就是MyBatis中的Mapper,Mapper分为两部分:Mapper接口(JAVA文件)和Mapper映射文件(XML文件).DAO开发(Mapper开发)有两种方式:原始 ...

随机推荐

  1. Hadoop MapReduce Next Generation - Setting up a Single Node Cluster

    Hadoop MapReduce Next Generation - Setting up a Single Node Cluster. Purpose This document describes ...

  2. 【WPF】逻辑树和视觉树

    WPF中提供了遍历逻辑树和视觉树的辅助类:System.Windows.LogicalTreeHelper和 System.Windows.Media.VisualTreeHelper. 注意遍历的位 ...

  3. Sqlserver 原生 MD5 函数(转)

    --创建md5函数CREATE FUNCTION [dbo].[MD5](@src varchar(255) )RETURNS varchar(255)ASBEGIN    DECLARE @md5 ...

  4. 【C语言】中的布尔类型

    C语言中的布尔类型 一.相关基础知识 首先bool  true  false为C++中的关键字,C语言中默认不支持这几个字符! 二.具体内容 在C89 (ANSI C)标准中没有定义与布尔类型相关的内 ...

  5. C语言头文件书写

    说一下C语言的存储类说明符: 1.Auto       只在块内变量声明中被允许,表示变量具有本地生存期. 2.Extern    出现在顶层或块的外部变量函数与变量声明中,表示声明的对象具有静态生存 ...

  6. PADS故障解决

    1. 点击PADS后就会出现以下: "The directory pointed by the FileDir INI file entry cannot be found.Aborting ...

  7. bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link

    2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 77[Submit][Status] ...

  8. Word里插入表格不带左右边框

    插入表格后选中,然后开始-----段落------选择右下角的边框设置,选择无左右边框.

  9. 怎样在Win7 64位旗舰版安装Python+Eclipse开发环境

    原地址:http://www.cnblogs.com/balian/archive/2011/06/19/2084632.html 自从上周抛弃了WinXP转而安装了Win7,64位后,尝试安装Pyt ...

  10. Linux下压缩某个文件夹(文件夹打包)

    tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把/xahot文件夹打包后生成一个/home/xahot.tar. ...