【Spring 篇】MyBatis DAO层实现:数据之舞的精灵

在这里插入图片描述

欢迎来到MyBatis DAO层的神奇世界,这里将为你揭示DAO层的奥秘,让你成为数据之舞的精灵。无论你是初学者还是想要深入了解DAO层的开发者,这篇博客将引导你踏入MyBatis DAO层的王国,一探其中的精彩。

舞台1:DAO层的角色

在MyBatis中,DAO层(Data Access Object层)起到了连接业务逻辑和数据库的桥梁作用。它负责处理数据库的CRUD操作,让业务逻辑与数据访问分离,提高代码的可维护性。

场景1:DAO层的实现步骤

接下来,我们将详细介绍如何在MyBatis中实现DAO层。我们以一个用户管理的示例来说明:

步骤1:创建数据模型

首先,我们需要定义一个数据模型,用于映射数据库表。例如,我们有一个用户表:

CREATE TABLE user (id INT PRIMARY KEY,username VARCHAR(50),age INT
);

我们需要创建对应的Java类:

public class User {private int id;private String username;private int age;// 省略getter和setter
}

步骤2:编写Mapper XML文件

接下来,我们创建一个Mapper XML文件,定义SQL语句和Java方法的映射。在UserMapper.xml中:

<!-- 查询用户信息 -->
<select id="getUserById" resultType="User" parameterType="int">SELECT * FROM user WHERE id = #{id}
</select>

步骤3:创建DAO接口

com.example.dao包下创建一个DAO接口UserDao.java

public interface UserDao {User getUserById(int id);
}

步骤4:编写DAO的实现类

com.example.dao包下创建DAO接口的实现类UserDaoImpl.java

public class UserDaoImpl implements UserDao {private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic User getUserById(int id) {try (SqlSession sqlSession = sqlSessionFactory.openSession()) {return sqlSession.selectOne("com.example.dao.UserDao.getUserById", id);}}
}

步骤5:配置MyBatis

mybatis-config.xml中配置数据源和Mapper:

<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/dao/UserDao.xml"/></mappers>
</configuration>

步骤6:使用DAO层

最后,在业务逻辑中使用DAO层:

public class UserService {private UserDao userDao;public UserService(UserDao userDao) {this.userDao = userDao;}public User getUserById(int id) {return userDao.getUserById(id);}
}

通过这些步骤,我们完成了DAO层的实现。接下来,我们将深入了解DAO层的细节和相关内容。

场景2:DAO层的核心概念

在实现DAO层时,有一些核心概念需要理解。接下来,我们将逐一介绍这些概念。

概念1:SqlSessionFactory

SqlSessionFactory是MyBatis的核心接口之一,负责创建SqlSession实例。在DAO层中,我们通常通过SqlSessionFactory来获取数据库连接。

示例代码:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

概念2:SqlSession

SqlSession是MyBatis的数据库会话接口,用于执行SQL语句、获取Mapper接口的实现类等操作。在DAO层中,我们通过SqlSession执行数据库操作。

示例代码:
SqlSession sqlSession = sqlSessionFactory.openSession();

概念3:Mapper

Mapper接口是DAO层的关键,它包含了与数据库交互的方法。在MyBatis中,我们通过SqlSessiongetMapper方法获取Mapper接口的实现类。

示例代码:
UserDao userDao = sqlSession.getMapper(UserDao.class);

概念4:DAO层的事务管理

在MyBatis中,事务管理通常由Spring等框架来负责。我们可以通过在mybatis-config.xml中配置事务管理器来实现事务的控制。

场景3:DAO层的最佳实践

在实现DAO层时,有一些最佳实践可以帮助我们写出更清晰、可维护的代码。

实践1:使用接口

在DAO层中,通常使用接口来定义数据库操作的契约,然后通过实现类来提供具体的实现。

示例代码:
public interface UserDao {User getUserById(int id);
}

实践2:使用注解

MyBatis支持使用注解来简化Mapper XML的编写,可以提高代码的可读性。

示例代码:
@Mapper
public interface UserDao {@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(int id);
}

实践3:错误处理

在DAO层的方法中,及时处理可能出现的异常是一种良好的实践。可以通过捕获异常并进行适当的处理,以确保系统的稳定性。

示例代码:
@Override
public User getUserById(int id) {try (SqlSession sqlSession = sqlSessionFactory.openSession()) {return sqlSession.selectOne("com.example.dao.UserDao.getUserById", id);} catch (Exception e) {log.error("Failed to retrieve user by id: {}", id, e);throw new DataAccessException("Error while fetching user by id", e);}
}

小结:数据之舞的精灵

通过这篇博客,我们深入了解了MyBatis DAO层的实现步骤、核心概念和最佳实践。DAO层就像是数据之舞的精灵,连接着业务逻辑和数据库,使数据的访问变得灵活而优雅。希望你能在这片数据之舞的森林中,找到编写清晰、高效的DAO层代码的灵感。愿你成为数据之舞的精灵,舞动着优雅的代码旋律。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示)

人脸识别 FaceNet人脸识别&#xff08;一种人脸识别与聚类的统一嵌入表示&#xff09; FaceNet的简介Facenet的实现思路训练部分 FaceNet的简介 Facenet的实现思路 import torch.nn as nndef conv_bn(inp, oup, stride 1):return nn.Sequential(nn.Conv2d(inp, oup, 3, stride…

FIND_IN_SET的使用:mysql表数据多角色、多用户查询

MySQL 函数 FIND_IN_SET 是用于在逗号分隔的字符串中查找特定值的函数。它的语法如下&#xff1a; FIND_IN_SET(search_value, comma_separated_string)search_value 是要查找的值。 comma_separated_string 是逗号分隔的字符串&#xff0c;在这个字符串中查找指定的值。FIND_…

Redis 面试题 | 14.精选Redis高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

手机视频压缩怎么压缩?一键瘦身~

现在手机已经成为我们日常生活中必不可少的工具&#xff0c;而在手机的应用领域中&#xff0c;文件的传输和存储是一个非常重要的问题。很多用户都会遇到这样一个问题&#xff0c;那就是在手机上存储的文件太多太大&#xff0c;导致手机存储空间不足&#xff0c;那么怎么在手机…

初识MQRabbitMQ快速入门

一、同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能…

【LUA】mac状态栏添加天气

基于网络上的版本修改的&#xff0c;找不到出处了。第一个摸索的lua脚本&#xff0c;调了很久。 主要修改&#xff1a;如果风速不大&#xff0c;就默认不显示&#xff0c;以及调整为了一些格式 local urlApi http://.. --这个urlApi去申请个免费的就可以了 然后打开对应的json…

七分钟交友匿名聊天室源码

多人在线聊天交友工具&#xff0c;无需注册即可畅所欲言&#xff01;你也可以放心讲述自己的故事&#xff0c;说出自己的秘密&#xff0c;因为谁也不知道对方是谁。 运行说明&#xff1a; 安装依赖项&#xff1a;npm install 启动&#xff1a;node app.js 运行&#xff1a;直接…

范围查询优化:索引跳跃扫描

范围查询优化&#xff1a;索引跳跃扫描 如果是联合索引的话&#xff0c;在构造B树的时候&#xff0c;会先按照左边的 key进行排序&#xff0c;左边的 key 相同时再依次按照右边的 key 排序。在通过索引查询的时候&#xff0c;也需要遵守最左前缀匹配的原则&#xff0c;也就是需…

使用 Docker 部署 Nacos 并配置 MySQL 数据源

前言 在安装 Nacos 之前&#xff0c;请确保你已经准备好了一个运行中的 MySQL 数据库。本教程将指导您如何使用 Docker 在单机模式下部署 Nacos&#xff0c;并将其数据持久化到 MySQL 中。 步骤一&#xff1a;拉取 Nacos 镜像 拉取最新版本的 Nacos Server 镜像&#xff0c;…

1月25日,每日信息差

第一、中国和新加坡互免签证&#xff0c;新加坡酒店搜索量较发布前增长4倍。去哪儿数据显示&#xff0c;新加坡酒店搜索量较发布前增长4倍&#xff0c;仍在持续增长中。同程旅行数据显示&#xff0c;消息发布半小时内&#xff0c;同程旅行平台新加坡相关搜索热度较前日同一时段…

Java算法 leetcode简单刷题记录8

Java算法 leetcode简单刷题记录8 找出不同元素数目差数组&#xff1a; https://leetcode.cn/problems/find-the-distinct-difference-array/ 保龄球游戏的获胜者&#xff1a; https://leetcode.cn/problems/determine-the-winner-of-a-bowling-game/ 计数器II&#xff1a; ht…

配置虚拟机通过系统代理

配置虚拟机通过系统代理 说明Windows 主机查询IP地址代理软件配置虚拟机下配置 说明 主机环境: Win11虚拟机环境: VMware Ubantu16.04 Windows 主机查询IP地址 在cmd下输入ipconfig, 复制IPv4地址 代理软件配置 在代理软件的参数设置下打开允许来自局域网的连接 虚拟机下…

每次请求sessionid变化【SpringBoot+Vue】

引言&#xff1a;花了一晚上的时间&#xff0c;终于把问题解决了&#xff0c;一开始后端做完后,用apifox所有接口测试都是可以的,但当前端跑起来后发现接收不到后端的数据。 当我写完前后端&#xff0c;主页面和获取当前页面信息接口后&#xff0c;配置了cros注解 CrossOrigin…

从前端Vue到后端Spring Boot:接收JSON数据的正确姿势

目录 一、前端Vue发送JSON数据二、后端Spring Boot接收JSON数据三、常见错误和问题四、总结 在现代Web开发中&#xff0c;前后端分离已成为一种趋势&#xff0c;Vue和Spring Boot也成为了其中最流行的前后端框架。在Vue前端向Spring Boot后端发送数据时&#xff0c;常常需要将数…

keil使用教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重…

Hive实战 —— 电商数据分析(全流程详解 真实数据)

目录 前言需求概述数据清洗数据分析一、前期准备二、项目1. 数据准备和了解2.确定数据粒度和有效列3.HDFS创建用于上传数据的目录4.建库数仓分层 5.建表5.1近源层建表5.2. 明细层建表为什么要构建时间维度表&#xff1f;如何构建时间维度表&#xff1f; 5.3 轻聚层建表6. 指标数…

基于Puppeteer实现配置自动化

前两篇文章《Node.js和Puppeteer进行Web抓取的简单使用》 和《Puppeteer结合Jest对网页进行测试》已经了解到Puppeteer大致可以做点什么事情&#xff0c;之前提到过最终自动化需要一个数组配置。这篇文章将会简单是一个读取配置文件实现自动化的脚本。 脚本 就拿《Node.js和P…

前端工程化之:webpack1-6(编译过程)

一、webpack编译过程 webpack 的作用是将源代码编译&#xff08;构建、打包&#xff09;成最终代码。 整个过程大致分为三个步骤&#xff1a; 初始化编译输出 1.初始化 初始化时我们运行的命令 webpack 为核心包&#xff0c; webpack-cli 提供了 webpack 命令&#xff0c;通过…

数学经典教材有哪些

说实话&#xff0c;国内大学教材编写的初衷&#xff0c;就是让学生自己看不懂。。 不信你去看看同济大学出版社的高数书籍。 给大家推荐两本国外的数学书&#xff0c;质量吊打国内大部分教材&#xff08;特别是同济的高数教材&#xff09;。如果我大学能看到这些教材&#xf…

android camera系列(Camera1、Camera2、CameraX)的使用以及输出的图像格式

一、Camera 1.1、结合SurfaceView实现预览 1.1.1、布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-au…