MyBatis之Dao层实现_悦.L的博客-程序员秘密_dao mybatis

技术标签: mybatis  MyBatis  

我们在了解 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;
    }@Override
    public User findUserById(int id) throws IOException {
    
        // 创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 调用SqlSession的增删改查方法
        User user = sqlSession.selectOne("userMapper.findByUserId", id);
        System.out.println(user);
        // 关闭资源
        sqlSession.close();
        return user;
    }@Override
    public User findByUserIdAndName(User user)  throws IOException {
    
        // 创建SqlSession
        SqlSession 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);
   // 创建SqlSessionFactory
   SqlSessionFactory  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");
   // 创建SqlSessionFactory
   SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
   // 创建SqlSession
   SqlSession sqlSession = sqlSessionFactory.openSession();
   UserDao dao = sqlSession.getMapper(UserDao.class);
   User user = dao.findByUserId(1);
   System.out.println(user);
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45040919/article/details/119518733

智能推荐

2016年百度校招小结:我做技术面试官的一些思考_AMEPRE的博客-程序员秘密

首发原文:2016年百度校招小结:我做技术面试官的一些思考一个多月前,作为技术面试官参加了百度 2016 年的校园招聘深圳站面试,主要目标学生是清华/北大/哈工大/中科院在本地的研究生院(实际上并没有设限,有不少江西广西福建的同学过来面试了),这里和大家分享一点自己的思考。我们一般有 3 轮技术面试,一面二面通常是由资深的工程师面试,三面一般是技术经理面试。我负责的是一

[applicationContext.xml]: Initialization of bean failed;_qq_37591637的博客-程序员秘密

错误代码如下Error creating bean with name 'car' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchExceptio...

6年菜鸟开发面试字节跳动安卓研发岗,在线面试指南_Git小发明的博客-程序员秘密

前言现在已经进入招聘季节,本篇文章旨在分享知名互联网企业面试官面试方法和心得,希望通过本文的阅读能给程序员带来不一样的面试体验和感受,放松面试心态,积极备战!主要分为以下几部分:(1)java面试题(2)Android面试题(3)混合开发面试题(4)高端技术面试题(5)非技术性问题&HR问题汇总一、java面试题熟练掌握java是很关键的,大公司不仅仅要求你会使用几个api,更多的是要你熟悉源码实现原理,甚至要你知道有哪些不足,怎么改进,还有一些java有关的一些算法,设计模

【目标检测】yoloX算法详解_易水潇潇666的博客-程序员秘密_yolox详解

一、yoloX的改进由于yoloV4和yoloV5存在过度优化的问题,因此yoloX以yoloV3和Darknet 53为基线,采用了Darknet 53骨干网的结构架构和SPP层,改变了一些训练策略:增加了EMA权重更新、consine lr schedule、IoU损失和IoU感知分支,使用BCE Loss训练cls和obj,IoU Loss作为test分支。由于RandomResizedCrop和马赛克增强重叠,因此只采用了RandomHorizontalFlip,ColorJitter、mu

随便推点

tensorflow模型保存(三)——tensorflow1.x版本的savedmodel格式的模型保存与加载_LoveMIss-Y的博客-程序员秘密_add_meta_graph_and_variables

前言:前面的两篇文章已经分别介绍了高层API与低层API关于各种模型的保存,比如在tensorflow2.x中如何保存checkpoint与savedmodel,在tensorflow1.x中如何保存checkpoint,本文着重介绍在tensorflow1.x版本中怎么保存savedmodel。要想恢复模型并能够正确的加载,最核心的就在于要给模型的输入与输出起一...

Spring02_基于XML的IOC_CodeAction的博客-程序员秘密

本教程源码请访问:tutorial_demo上篇教程我们学习了如何使用工厂模式解耦,把对象的创建由程序员交给自定义的工厂类,在这篇教程我们将学到如何使用Spring的IOC解决程序的耦合问题。一、什么是IOCIOC:Inversion of Control,控制反转,将创建对象的权力交给框架。过去创建对象由开发人员通过new的方式创建,有了IOC之后,开发人员不需要new了,只需要从Spring容器(我们可以认为是保存对象的容器)中获取就可以了,创建对象的控制权发生了转移,由开发人员转移给了Spr.

SAP 笔记_Footloose_的博客-程序员秘密

Su53 查看权限对象 st01 跟踪 St22 看dump,以分析错误 eg.找到ABAP程序出错的地方,找出founction,用se37查看找到的founction,找到有关权限检查(authority check),找到object,在pfcg中添加object并赋予权限/h debugsu01 建用户ID,TMSADM这个用户不能锁定,它是系统默认的传输用户,SAPSYS也是

OllyDbg常用断点_Vanship的博客-程序员秘密

拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 拦截消息框: bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建

程序员适合做自由职业者吗?_众东科技的博客-程序员秘密_软件开发自由职业者

企业基于自身的弹性用工需求,雇佣兼职或自由职业者来解决用人难题,这种灵活用工模式效率更高、成本更低,企业把灵活用工与固定全职结合起来使用,正在变成一种常态。有数据指出,全球灵活用工业务总收入高达3万亿,而作为人口大国,中国的灵活用工市场规模大、发展快,并且还没有任何一家巨头公司出现。换句话说,这个市场有机会出现独角兽企业。据统计美国和欧洲的自由职业者的人数达到了1.62个亿。这部分人在欧美劳动人口中的比例从2005年的10%增加到了2015年的16%。这个世界有可能进入到一个自由职业者的时代。“可任意支

最长回文 HDU - 3068 -Manacher_ID_BePosit的博客-程序员秘密

最长回文  HDU - 3068  以每个点 为中心的最长回文长度为 半径 -1 #include<bits/stdc++.h>using namespace std;#define maxn 123465char str[maxn],cp[maxn*2];int p[maxn*2],len,ans;void manacher(){ int mx=0,i...