【Spring集成MyBatis】MyBatis的Dao层实现(基于配置,非注解开发)

文章目录

  • 1. MyBatis的dao层实现(传统方式)——需要写接口及其实现类
  • 2. MyBatis的代理开发方式——仅需写接口

1. MyBatis的dao层实现(传统方式)——需要写接口及其实现类

传统方式就是在项目下边建立dao包,里面包含接口及其实现类,文件结构如下:
在这里插入图片描述
UserMapper.java

package com.example.demo.dao;import com.example.demo.domain.User;import java.io.IOException;
import java.util.List;public interface UserMapper {List<User> findAll() throws IOException;
}

UserMapperImpl.java

package com.example.demo.dao.impl;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class UserMapperImpl implements UserMapper {@Overridepublic List<User> findAll() throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();List<User> userList = sqlSession.selectList("userMapper.findAll");sqlSession.close();return userList;}
}

测试其实现:

package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;import java.io.IOException;
import java.util.List;public class ServiceDemo {public static void main(String[] args) throws IOException {
//        创建dao层对象,目前dao层是手动编写的UserMapper userMapper = new UserMapperImpl();List<User> all = userMapper.findAll();System.out.println(all);}
}

其实这里边就是用MyBatis提供的API调用MyBatis配置,这个内容在刚开始学MyBatis的时候有提到过:【Spring集成MyBatis】MyBatis诞生及代码快速入门(非注解开发)

2. MyBatis的代理开发方式——仅需写接口

在上面的代码中,其实很多代码都是重复的,比如获取sqlSession的代码:

InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

而sql语句的代码又是半重复的,只有括号里面的内容会发生变化:

List<User> userList = sqlSession.selectList("userMapper.findAll");

在这里介绍MyBatis的代理开发方式,其需要遵循一定的规范
在这里插入图片描述
即如下的对应部分应该相同:
在这里插入图片描述
使用以上介绍的开发方式,我们就不需要再写接口的实现类了,只需要让接口与XML文件中的定义对应即可。
此时,我的XML文件和接口分别为:
UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.UserMapper"><select id="findAll" resultType="user">select * from user</select>
</mapper>

UserMapper.java

package com.example.demo.dao;import com.example.demo.domain.User;import java.io.IOException;
import java.util.List;public interface UserMapper {List<User> findAll() throws IOException;
}

测试的时候,只需要通过sqlSession.getMapper()来获得对应类的实现配置即可

package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class ServiceDemo {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = userMapper.findAll();System.out.println(userList);}
}

假如带参数查询,操作也是类似的,在XML文件中加上:
<select id="findById" parameterType="int" resultType="user">select * from user where id=#{id}
</select>

接口中加上:

User findById(int id);

实现时调用:

User user = userMapper.findById(1);

即可获得对应的user结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交直流一体化电源系统测试步骤详解

交直流一体化电源拥有高度适应性&#xff0c;可以用于不同的电力需求领域。但是为了确保其质量和性能&#xff0c;需要对交直流一体化电源进行各项测试以保证正常工作。本文纳米软件将介绍交直流一体化电源的测试方法&#xff0c;以及如何用交直流一体化电源测试系统进行测试。…

深入理解 pytest Fixture 方法及其应用!

当涉及到编写自动化测试时&#xff0c;测试框架和工具的选择对于测试用例的设计和执行非常重要。在Python 中&#xff0c;pytest是一种广泛使用的测试框架&#xff0c;它提供了丰富的功能和灵活的扩展性。其中一个很有用的功 能是fixture方法&#xff0c;它允许我们初始化测试环…

《实现领域驱动设计》笔记——上下文映射图

一个项目的上下文映射图可以用方式来表示。比较容易的一种是画一个简单的框图表示两个或多个限界上下文之间的映射关系。该框图表示了不同的限界上下文在解决方案空间中是如何通过集成相互关联的。另一种更详细的方式是通过限界上下文集成的源代码实现来表示。 上下文映射图为什…

微软WHQL认证

windows驱动开发要摆脱在测试模式下的开发&#xff0c;需要通过WHQL认证。 1&#xff1a;申请EV代码签名证书。EV代码签名证书在后续注册Windows硬件开发中心帐户&#xff0c;以及提交WHQL认证前为驱动程序进行数字签名等流程中都需要用到&#xff0c;所以申请EV代码签名证书是…

BUUCTF [SWPU2019]我有一只马里奥 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 密文&#xff1a; 下载附件&#xff0c;得到一个.exe文件。 解题思路&#xff1a; 1、双击.exe文件运行&#xff0c;得到一个1.txt文本。打开&#xff0c;如下图。 2、提示我们…

Mysql中正则表达式Regexp常见用法

Mysql中正则表达式Regexp常见用法_regexp不包含-CSDN博客

当老师应该选文科还是理科

教育不断发展和改革&#xff0c;教师职业的选择也越来越受到关注。许多人在选择专业时都会考虑成为一名教师&#xff0c;但对于选择文科还是理科却感到困惑。本文将探讨当老师应该选文科还是理科。 文科注重的是人文素养和社会科学方面的知识&#xff0c;而理科则注重自然科学和…

如何做一个简单的深度集成学习框架

使用同一个框架&#xff0c;独立在一个数据集上面&#xff0c;分别训练多次&#xff0c;每个单独模型训练超参数可以一样&#xff0c;也可以不一样&#xff0c;最后若干个训练好的独立模型在测试集数据上面做最后集中决策。 实例代码如下&#xff1a; class MyEnsemble(nn.Modu…

每天5分钟复习OpenStack(十)Ceph 架构

1、Ceph是什么&#xff1f; “Ceph is a unified, distributed storage system designed for excellent performance, reliability and scalability.”这句话说出了Ceph的特性&#xff0c;它是可靠的、可扩展的、统一的、分布式的存储系统。Ceph可以同时提供对象存储RADOSGW&am…

基于 Flink SQL 和 Paimon 构建流式湖仓新方案

本文整理自阿里云智能开源表存储负责人&#xff0c;Founder of Paimon&#xff0c;Flink PMC 成员李劲松在云栖大会开源大数据专场的分享。本篇内容主要分为四部分&#xff1a; 数据分析架构演进介绍 Apache PaimonFlink Paimon 流式湖仓流式湖仓Demo演示 数据分析架构演进 …

虾皮数据参谋:知虾助力商家实现数据化运营的利器

在如今竞争激烈的电商市场中&#xff0c;商家需要准确的数据分析来指导他们的业务决策。Shopee电商平台的数据分析工具——虾皮数据参谋&#xff08;知虾&#xff09;&#xff0c;为商家提供了丰富的数据分析服务&#xff0c;包括商品市场、销量、价格分布、物流监控、差评监控…

ArkTS声明式开发范式

装饰器 用来装饰类、结构体、方法以及变量&#xff0c;赋予其特殊的含义&#xff0c;如上述示例中 Entry 、 Component 、 State 都是装饰器。 Component 表示这是个自定义组件&#xff1b; Entry 则表示这是个入口组件&#xff1b; State 表示组件中的状态变量&#xff0c;…

最新版灵沐V3.3微信资源类小程序源码支持流量主

源码简介 最新版灵沐V3.3微信资源类小程序源码支持流量主&#xff0c;一套不错的流量主变现资源下载小程序&#xff0c;它支持在微信、QQ和抖音平台上运行。这次更新主要集中在全局UI设计的升级&#xff0c;并依然注重资源下载和激励视频变现的功能。另外&#xff0c;还新增了…

VR模拟仿真技术为司法科普建设注入更多的智慧和力量

虚拟现实(VR)技术已经逐渐渗透到各个领域&#xff0c;包括司法领域&#xff0c;在法学院教学中&#xff0c;VR虚拟现实和web3d开发技术的兴起&#xff0c;让司法教育也突破传统教授式、演练式的教学模式&#xff0c;通过VR特有的沉浸式展示特点&#xff0c;实现了真实法庭效果的…

【Sorted Set】Redis常用数据类型: ZSet [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 ⑤Redis Zset 操作命令汇总1. zadd 添加或…

【考研数据结构代码题7】求一元多项式之和

题目&#xff1a;编写一个算法&#xff0c;求一元多项式之和 考纲&#xff1a;一元多项式的表示与相加 题型&#xff1a;代码填空或算法设计 难度&#xff1a;★★★ 参考代码 typedef struct node{float coef;//系数int exp;//次数struct node *next; }polynode; polynode *…

5 分钟,开发自己的 AI 文档助手!手把手教程

大家好&#xff0c;我是鱼皮。 几个月前&#xff0c;我自己开发过一个 AI 文档总结助手应用。给大家简单演示一下&#xff0c;首先我上传了一个文档&#xff0c;定义 1 1 等于 3&#xff1a; 然后把文档喂给 AI 文档总结助手&#xff0c;再向它提问&#xff0c;然后 AI 就回答…

登陆页面模板

简单好看的登陆页面 vue项目代码 可忽略js部分 先来个效果图 <template><div class"login"><div class"content"><p >账户密码登录</p><div class"unit"><label class"label">用户名</…

Hadoop学习总结(MapReduce的数据去重)

现在假设有两个数据文件 file1.txtfile2.txt2018-3-1 a 2018-3-2 b 2018-3-3 c 2018-3-4 d 2018-3-5 a 2018-3-6 b 2018-3-7 c 2018-3-3 c2018-3-1 b 2018-3-2 a 2018-3-3 b 2018-3-4 d 2018-3-5 a 2018-3-6 c 2018-3-7 d 2018-3-3 c 上述文件 file1.txt 本身包含重复数据&…

汇编-PROTO声明过程

64位汇编 64 模式中&#xff0c;PROTO 伪指令指定程序的外部过程&#xff0c;示例如下&#xff1a; ExitProcess PROTO ;指定外部过程&#xff0c;不需要参数.code main PROCmov ebx, 0FFFFFFFFh mov ecx,0 ;结束程序call ExitProcess ;调用外部过程main ENDP END 32位…