【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;以及如何用交直流一体化电源测试系统进行测试。…

Java,数据结构与集合源码,关于Map接口的实现类(HashMap、LinkedHashMap)

HashMap中的元素的特点&#xff1a; HashMap中的所有key之间是不可重复的、无序的。所有的key构成一个Set集合。 HashMap中的所有的value彼此之间是可重复的、无序的。所有的value构成一个Collection集合。 HashMap中的一对key-value&#xff0c;就构成了一个entry。Map中的ent…

python常用第三方模块---openyxl

openyxl模块&#xff1a;用于处理excel文件的木块&#xff0c;可以Excel中的数据进行写入和读取 函数或类的名称功能描述load_workbook(filename)打开已经存在的工作簿&#xff0c;结果为工作簿对象 workbook.sheetnames 工作簿对象的sheetnames属性&#xff0c;用户获取所有工…

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

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

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

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

微软WHQL认证

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

唯一索引和普通索引的使用上要注意什么

考虑下面一种情况&#xff1a; select name from CUser where id_card xxxxxxxyyyyyyzzzzz;你可能会将id_card作为主键了&#xff0c;但最好别这么做。你想想这么长一串的字符串做主键&#xff0c;查询时候效率其实是比较低的&#xff0c;其实是建议选择其他的作为主键。 那么…

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博客

List转string 逗号分隔

List转string 逗号分隔 1、将list转化为逗号分割的字符串 String str String.join(",", list); String str StringUtils.json(list.toArray(), ",");   2、将逗号分隔的字符串转换为List List<String> list Arrays.asList(str.split("…

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

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

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

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

问题 上位机程序重启

/ 1、上位机程序重启&#xff0c; 读线程被杀死&#xff0c;mcu usb busy&#xff0c;数据在fifo发不出去 下次线程重启后&#xff0c;在fifo里的数据首先被发送出去。 //

红旗Asianux Server Linux V8 安装万里数据库(GreatSQL)

红旗Asianux Server Linux V8 安装万里数据库&#xff08;GreatSQL&#xff09; 红旗Asianux介绍&#xff1a; 红旗Asianux Server Linux 8.0是为云时代重新设计的操作系统&#xff0c;为云时代的到来引入了大量新功能&#xff0c;包括用于配置管理、快速迁移框架、编程语言和…

每天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…

ip_file_Hook项目解读

程序流程 执行文件访问拦截和 IP 地址拦截的流程&#xff1a; 文件访问拦截功能&#xff1a; 当应用程序尝试执行文件操作&#xff0c;例如打开文件&#xff0c;调用的是 open 或 openat 函数。 由于这两个函数已经被重定向为自定义的版本&#xff0c;所以实际上调用的是 op…

基于 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;还新增了…