在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. 学习python网络数据采集笔记-1、2章

    英文不好只能看中文版的.邮电出版社翻译的真很烂. 以上是吐槽,以下是正文. 书中用的pthon 3.X版本,建议安装python3.4以上的版本,低版本的没有自带pip安装插件会比较麻烦. 下载地址: ...

  2. 面试题: generate an equation, by inserting operator add ("+") and minus ("-") among the array to make equationExpression == 0

    package com.Amazon.interview; /** * @Author: weblee * @Email: likaiweb@163.com * @Blog: http://www.c ...

  3. hdu-A+B问题,大数加法

    格式问题很头疼啊 Input The first line of the input contains an integer T(1<=T<=20) which means the num ...

  4. 强大DevExpress,Winform LookUpEdit 实现多列查询 gridview弹出下拉选择 z

    关键代码请参考http://www.devexpress.com/Support/Center/p/K18333.aspx 最新DEMO 下载 The current GridLookUpEdit's ...

  5. Maven构建灵活配置文件

    本文解决以下问题: Maven下面启动Main函数: 配置JDK版本 如何配置文件,在开发部署测试各个不同版本间无缝切换配置文件: 启动Main函数 Maven默认是不支持Main函数程序,需要在po ...

  6. leetcode第三题Longest Substring Without Repeating Characters java

    Longest Substring Without Repeating Characters Given a string, find the length of the longest substr ...

  7. 第 1 章 策略模式【Strategy Pattern】

    第 1 章 策略模式[Strategy Pattern] 以下内容出自: 24种设计模式介绍与6大设计原则.pdf 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手 ...

  8. 解决iOS应用内购买报错:invalidProductIdentifiers

    当写完IAP业务过程后,点击测试却发现没有返回成功的商品Id,反而返回了无效的商品:response.invalidProductIdentifiers 这种情况下考虑以下因素: 创建的App ID是 ...

  9. hdu 4435

    一道枚举+搜索题: 很容易看出这道题目要求尽量不在大的城市里面建加油站: 所以从最大的城市开始枚举! 代码: #include<cstdio> #include<cmath> ...

  10. PHP传引用报错(5.4版本)

    php5.3系列版本以及以前版本,传引用没有什么问题,升级到php5.4以后,传引用的地方,全报错 Fatal error: Call-time pass-by-reference has been ...