文章目录

  • 1、传统开发方式
  • 2、代理开发方式

我们在了解 MyBatis 的映射文件和配置文件时,所举例的实例都是通过单元测试的方式实现。但在实际开发中,我们需要将 MyBatis 的实现写到 Dao 层中。所以下面我们具体了解两种 Dao 层的实现方式

1、传统开发方式

在传统 web 开发中,我们首先需要定义 Dao 接口,然后定义 DaoIImpl 类实现接口。

定义 UserDao 接口:

public interface UserDao {// 1、 根据用户ID查询用户信息public User findUserById(int id) throws IOException;
​// 2、 根据用户ID和用户名称查询用户信息public User findByUserIdAndName(User user) throws IOException;
}

定义 UserDao 接口的实现类 UserDaoImpl :

public class UserDaoImpl implements UserDao {// 依赖注入,将工程在外面创建private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {//将外面创建的工厂传递进来(以后spring)this.sqlSessionFactory = sqlSessionFactory;}
​@Overridepublic User findUserById(int id) throws IOException {// 创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 调用SqlSession的增删改查方法User user = sqlSession.selectOne("userMapper.findByUserId", id);System.out.println(user);// 关闭资源sqlSession.close();return user;}
​@Overridepublic User findByUserIdAndName(User user)  throws IOException {// 创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 调用SqlSession的增删改查方法User user= sqlSession.selectOne("userMapper.findByIdAndName", user);System.out.println(user);// 关闭资源sqlSession.close();return list;}
}

模拟业务层调用:

public static void main(String [] args) throws Exception {InputStream inputStream = Resources.getResourceAsStream(resource);// 创建SqlSessionFactorySqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);UserDao dao = new UserDaoImpl(sqlSessionFactory);User user = dao.findUserById(1);System.out.println(user);
}

这种方式其实大家都会,在学习 javaweb 的时候我们就是使用这种方式实现 Dao 层,只是连接数据库的方式改变了。

2、代理开发方式

分析第一种方式的代码会发现有大量的重复的模板代码。为了简化开发,Mybatis 提供了一种代理开发的方式,这种方式是项目开发中 Mybatis 实现 Dao 层的主流。

代理开发方式只需要程序员编写Mapper 接口(相当于Dao 接口),然后由 Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。 代理开发方式使用的是动态代理的 JDK 代码实现的。

Mapper 接口需要遵循以下规范:

  • 映射文件中的mapper标签的namespace属性与 mapper 接口的全限定名相同

  • 映射文件中的每条映射语句中id的属性值与 mapper 接口中方法名相同

  • 映射文件中的每条映射语句的parameterType属性与 mapper 接口中方法的形参相同

  • 映射文件中的每条映射语句的resultType属性与 mapper 接口中方法的返回值类型相同

如果 Mapper 接口已经遵循上述规范,那么不需要创建 Dao 层的实现类了,可以直接进行使用:

public static void main(String [] args) throws Exception {InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");// 创建SqlSessionFactorySqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();UserDao dao = sqlSession.getMapper(UserDao.class);User user = dao.findByUserId(1);System.out.println(user);
}

MyBatis之Dao层实现相关推荐

  1. MyBatis-学习笔记06【06.使用Mybatis完成DAO层的开发】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  2. MyBatis的Dao层实现方式

    MyBatis的Dao层实现方式 MyBatis的Dao层实现 1.1 传统开发方式 1. 编写UserDao接口 public interface UserDao { List<User> ...

  3. Spring整合Mybatis之DAO层、Service层开发

    3. Spring整合Mybatis编程DAO层开发 1. 项目引入相关依赖spring mybatis mysql mybatis-spring druid2. 编写spring.xml整合:spr ...

  4. Mybatis的Dao层实现

    Mybatis的Dao层实现 1.传统方式实现 创建接口com.dao.UserMapper package com.dao;import com.domain.User;import java.io ...

  5. 详解MyBatis的Dao层实现和配置文件深入

    这篇文章主要为大家详细介绍了MyBatis的Dao层实现和配置文件深入,文中的示例代码讲解详细,感兴趣的小伙伴快来跟随小编一起学习一下 目录 [Mybatis的Dao层实现] [传统开发方式] [代理 ...

  6. IDEA项目搭建四——使用Mybatis实现Dao层

    一.引入mybatis及mysql的jar包 可以从阿里云上面查找版本,db操作放在dao层所以打开该层的pom.xml文件,找到<dependencies>节点增加两个引入 <de ...

  7. Mybatis 原始Dao层开发

    对Mybatis进行原始Dao层开发的举例子: 定义获取session工具类: package com.langsin.unit;import java.io.InputStream;import o ...

  8. SpringBoot+MyBatis项目Dao层最简单写法

    前言 DAO(Data Access Object) 是数据访问层,说白了就是跟数据库打交道的,而数据库都有哪几种操作呢?没错,就是增删改查.这就意味着Dao层要提供增删改查操作. 不知道大家是怎么写 ...

  9. Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的...

    参考mybatis入门基础(二)----原始dao的开发和mapper代理开发 其实也就是通过接口名与mapper的id绑定在一起,通过SQL去写实现类,返回数据. 转载于:https://www.c ...

最新文章

  1. 七、Oracle 数据库设计
  2. mysql 创建唯一索引_Mysql创建索引
  3. Android 系统(135)---Android anr 分析步骤总结
  4. python中inspect的用法(这个难懂,后期再补)
  5. pandas-pandas.Categorical
  6. 微信红包随机数字_微信红包随机算法初探
  7. 5G时代将给智能营销笔记本带来什么样的改变
  8. python魂斗罗源码_经典儿时游戏魂斗罗源代码
  9. Mac 下终端运行C++
  10. NRF24L01的配置详解
  11. Bootstrap-CL:标签
  12. node.js的认识与了解3
  13. webapi2学习笔记
  14. hanlp自然语言处理包的使用
  15. linux系统内存used占用过高问题排查
  16. android 判断activity是否在运行,Android 判断某个Activity 是否在前台运行的实例
  17. BAOCMS【QQ登录】回调地址常见问题及修改方法
  18. 棋牌游戏为什么会这么的“火”
  19. 2011年IT业趋势盘点(谈IT发展,观天下大势)
  20. 职中计算机考证是几级

热门文章

  1. Couldn't find preset @babel/preset-env relative to directory
  2. 使用DaemonSet定制AKS工作节点
  3. 年度AI对话|达观陈运文:做私有部署的大模型,数据安全更具优势
  4. BPS 大报文按照二元组/四元组拆分成小报文
  5. js截取指定字符前面或后面的内容
  6. html隐藏怎么出来,html怎么让元素隐藏
  7. div section和article区别
  8. https://blog.csdn.net/lu_embedded/article/details/82997438
  9. Android签名打包很慢,Android APK快速签名—优化打包时间
  10. Matlab/Simulink自动生成C代码实验