【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代理方式简单,又避免了代码的硬编码,因此现在通常都使用这种方式。
【JavaEE】之MyBatis开发DAO的更多相关文章
- MyBatis学习--mybatis开发dao的方法
简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...
- 四 mybatis开发dao的方法
mybatis开发dao的方法 1.1 SqlSession使用范围 1.1.1 SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...
- MyBatis开发Dao
MyBatis开发Dao有两种方法: 1.原始Dao开发方法,就是程序需要编写Dao的接口和Dao的实现类. 2.MyBatis的mapper接口(相当于Dao接口)代理开发方法.(更重要) ---- ...
- 使用mybatis开发dao问题总结
代码片段: @Override public User getUserById(Integer id) { SqlSession sqlSession = sqlSessionFactory.open ...
- 使用mybatis开发dao方法
使用mybatis开发dao的时候, 主要涉及到SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession 这三个类 现在将这三个类的使用方法简单的说下 ...
- MyBatis开发Dao层的两种方式(原始Dao层开发)
本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...
- MyBatis开发Dao层的两种方式(Mapper动态代理方式)
MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...
- MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...
- 【JAVA - SSM】之MyBatis开发DAO
在SSM框架中的DAO层就是MyBatis中的Mapper,Mapper分为两部分:Mapper接口(JAVA文件)和Mapper映射文件(XML文件).DAO开发(Mapper开发)有两种方式:原始 ...
随机推荐
- Nginx专题(1):Nginx之反向代理及配置
摘要:本文从Nginx的概念出发,分别从反向代理的概念.优势.配置代码3个方面介绍了Nginx的特性之一反向代理. 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第一期-宜信支付结算八方 ...
- [考试反思]1013csp-s模拟测试72:距离
最近总是这个样子. 看上去排名好像还可以,但是实际上离上面的分差往往能到80分,但是身后的分差其实只有10/20分. 比上不足,比下也不怎么的. 所以虽然看起来没有出rank10,但是在总分排行榜上却 ...
- docker安装制定版本-centos7
# 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker软件包源 yum-config-manage ...
- P3105 [USACO14OPEN]公平的摄影(正解是乱搞,我却二分了)(+二分答案总结)
照例化简题意: 给定一个01区间,可以把0改成1,问其中最长的01数量相等的区间长度. 额很容易想到前缀和,把w弄成1,h弄成-1,然后求前缀和,然后乱搞就行了. 但是一直不太会乱搞的我却直接想到了二 ...
- day 2 下午 骑士 基环树+树形DP
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #inc ...
- Android Drawable 简析
Drawable 是开发中经常用到的一个概念,我们经常用它去设置 View 的背景,背景可以一个颜色值,也可以是一张资源图片,还可以是一个自定义的 Drawable等等.这篇文章就简单说下 Drawa ...
- JS中的相等性判断===, ==, Object.is()
首发地址:http://www.geeee.top/2019/11/15/equality-comparisons/,转载请注明出处 相信刚接触JS的人都会被他的想等性判断给整糊涂,看看下面代码,你能 ...
- css的块级元素和行级元素
块级元素 概念: 每个块级元素都是独自占一行. 元素的高度.宽度.行高和边距都是可以设置的. 元素的宽度如果不设置的话,默认为父元素的宽度(父元素宽度100%) <address>/ ...
- 用c语言打印一个三角形
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h&g ...
- Java自动生成数据
最近在造数据库中的表数据,写了些数据生成类 可以随机生成姓名.性别,民族,出生日期,身份证号,手机号,邮箱,身高,文化程度,地址,单位,日期时间,编码等 package com.util.create ...