在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. nodejs中间层现实

    初次接触nodejs,是一种非常神奇的东西,未来必火起来.个人觉得最大优势npm命令. 闲话少说,直入主题.这是一个博客项目,php最为服务端,提供数据给node:nodejs+express作为中间 ...

  2. Poco之ftp获取文件列表以及下载文件

    #include <iostream>#include <string>#include <vector>#include <algorithm>#in ...

  3. 类集对enum的支持。

    1,EmumMap public class EnumMap<K extends Enum<K>,V>extends AbstractMap<K,V>impleme ...

  4. 【技术贴】Maven打包文件增加时间后缀

    构建war包,或者jar包的,时候,maven会自动增加一个版本号和时间放在jar包后面比如poi-3.9-20131115.jar这样子,但是我自己打war包,总是给我生成一个快照的后缀report ...

  5. 如何使用 HTTP 响应头字段来提高 Web 安全性?

    在 Web 服务器做出响应时,为了提高安全性,在 HTTP 响应头中可以使用的各种响应头字段. X-Frame-Options 该响应头中用于控制是否在浏览器中显示 frame 或 iframe 中指 ...

  6. 《attodiskbenchmarks-v2.47》说明文件

    对于用电脑方便且不喜欢在手机上乱装软件的我来说,很喜欢,特此整理,并在miui首发. 一.软件介绍 ATTO Disk Benchmark是一款电脑端使用的专业测速软件,该软件非常小巧,但却很专业,是 ...

  7. SELECT /*!40001 SQL_NO_CACHE */ * INTO OUTFILE '/tmp/ClientActionTrack2015112511.txt' 不堵塞事务

    mysql> insert into ClientActionTrack20151125(clientSn,ip,url,httpMethod,requestParams,requestHead ...

  8. POJ2676 Sudoku(dfs)

    题目链接. 题目大意: 就是数独游戏.横竖,每一个9宫方块,必须有1~9,且不重复. 分析: 直接DFS.一开始在原图上搜,会TLE.把要补全的空格,放入数组,这样就不用遍历整个图寻找要填的空格了. ...

  9. 编程实现改变win7主题

    一  : 解析问题 1. Windows 7 主题在:%windir%\Resources\Themes  : 2: 我们通过shell 命令  (这个是msdn中提到的) rundll32.exe ...

  10. [DP] LCS小结

    额..失误.. LCS是Longest Common Subsequence的缩写,即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. DP.O ...