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

news2024/10/6 2:25:52

在这里插入图片描述

欢迎来到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;
    }

    @Override
    public 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.coloradmin.cn/o/1412272.html

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

相关文章

【大数据面试题】HBase面试题附答案

目录 1.介绍下HBase 2.HBase优缺点 3.介绍下的HBase的架构 4.HBase的读写缓存 5.在删除HBase中的一个数据的时候&#xff0c;它是立马就把数据删除掉了吗? 6.HBase中的二级索引 7.HBase的RegionServer宕机以后怎么恢复的? 8.HBase的一个region由哪些东西组成? 9.…

安科瑞电化学储能电能管理系统解决方案——安科瑞赵嘉敏

1 概述 在我国新型电力系统中&#xff0c;新能源装机容量逐年提高&#xff0c;但是新能源比如光伏发电、风力发电是不稳定的能源&#xff0c;所以要维持电网稳定&#xff0c;促进新能源发电的消纳&#xff0c;储能将成为至关重要的一环&#xff0c;是分布式光伏、风电等新能源消…

LeetCode 40.组合总和 II

组合总和 II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 方法一、回溯 由于题目要求解集…

第十九周周报

文章目录 摘要文献阅读DeepHuman: 3D Human Reconstruction from a Single Image(ICCV 2019)贡献摘要网络结构总结 PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization贡献摘要网络结构总结 Animated 3D human avatars from a single imag…

多项式乘法逆(p4238 NTT)

题目路径&#xff1a; https://www.luogu.com.cn/problem/P4238 思路&#xff1a; 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<cstring> #include<cmath> #include<ctime> #include&l…

有什么办法可以让模糊的老照片变清晰?这几个方法收藏好!

照片盒子里的老照片&#xff0c;宛如一扇陈旧的时光之门&#xff0c;等着我们去开启。那些尘封的记忆&#xff0c;似乎已经被时间遗忘&#xff0c;但当我们轻轻拂去尘埃&#xff0c;那些熟悉的画面便再次浮现在眼前。然而&#xff0c;岁月无情&#xff0c;这些宝贵的瞬间在时间…

node.js漏洞总结

js开发的web应用和php/Java最大的区别就是js可以通过查看源代码的方式查看到编写的代码&#xff0c;但是php/Java的不能看到&#xff0c;也就是说js开发的web网页相当于可以进行白盒测试。 流行的js框架有&#xff1a; 1. AngularJS 2. React JS 3. Vue 4. jQuery 5. Backbone…

Linux | makefile简单教程 | Makefile的工作原理

前言 在学习完了Linux的基本操作之后&#xff0c;我们知道在linux中编写代码&#xff0c;编译代码都是要手动gcc命令&#xff0c;来执行这串代码的。 但是我们难道在以后运行代码的时候&#xff0c;难道都要自己敲gcc命令嘛&#xff1f;这是不是有点太烦了&#xff1f; 在vs中…

Docker安装多个nginx容器时,要注意端口设置:

Docker安装多个nginx容器时&#xff0c;要注意端口设置&#xff1a; docker run -id --namemynginx4 -p 8089:80 nginx 安装多个nginx容器时&#xff0c;要注意端口设置&#xff1a;宿主机80端口已经被暂用&#xff0c;所以宿主机端口一定不能设置位80&#xff0c;但是容器上80…

Vulnhub靶场DC-7

本机192.168.223.128 目标192.168.223.136 主机发现 nmap -sP 192.168.223.0/24 端口发现 nmap -sV -p- -A 192.168.223.136 开启了22 80端口 80端口apache服务 先进入web界面看一下 提示&#xff1a;DC7加了一些新的东西&#xff0c;让我看看盒子之外的东西&#xff0c;与…

C++ 利用容器适配器,仿函数实现栈,队列,优先级队列(堆),反向迭代器,deque的介绍与底层

C 利用容器适配器,仿函数实现栈,队列,优先级队列【堆】,反向迭代器,deque的介绍与底层 一.容器适配器的介绍二.利用容器适配器实现栈和队列1.stack2.queue 三.仿函数介绍1.什么是仿函数2.仿函数的使用3.函数指针的使用1.函数指针的用处2.利用函数指针完成回调3.利用仿函数完成回…

docker 体验怀旧游戏(魂斗罗等)

docker run --restart always -p 8081:80 --name fc-games -d registry.cn-hangzhou.aliyuncs.com/bystart/fc-games:latest ip:8081访问 jsnes: js制作了一个网页版的NES模拟&#xff0c;可以在网页上玩fc游戏 (gitee.com)

创建第一个 Spring 项目(IDEA社区版)

文章目录 创建 Spring 项目创建一个普通的 Maven 项目添加 Spring 依赖IDEA更换国内源 运行第一个 Spring 项目新建启动类存储 Bean 对象将Bean注册到Spring 获取并使用 Bean 对象 创建 Spring 项目 创建一个普通的 Maven 项目 首先创建一个普通的 Maven 项目 添加 Spring 依…

Tomcat好帮手---JDK

目录 1、Tomcat好帮手---JDK 2、安装JDK 部署Tomcat参考博主博客 部署TOMCAT详解-CSDN博客 1、Tomcat好帮手---JDK JDK是 Java 语言的软件开发工具包&#xff0c;JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA…

2024年新提出的算法:一种新的基于数学的优化算法——牛顿-拉夫森优化算法|Newton-Raphson-based optimizer,NRBO

1、简介 开发了一种新的元启发式算法——Newton-Raphson-Based优化器&#xff08;NRBO&#xff09;。NRBO受到Newton-Raphson方法的启发&#xff0c;它使用两个规则&#xff1a;Newton-Raphson搜索规则&#xff08;NRSR&#xff09;和Trap Avoidance算子&#xff08;TAO&#…

视频压缩怎么才能保持画质清晰?这样设置参数~

很多时候我们都需要压缩视频&#xff0c;但在减小视频大小的时候我们也会担心画质清晰度问题&#xff0c;那怎么既能压缩视频大小&#xff0c;又能保证视频清晰度呢&#xff1f;下面就来了解下吧~ 视频压缩分为无损压缩和有损压缩&#xff0c;如果想保持画质清晰&#xff0c;可…

[C#]winform部署yolov5实例分割模型onnx

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 YOLOv5实例分割是目标检测算法的一个变种&#xff0c;主要用于识别和分割图像中的多个物体。它是在YOLOv5的基础上&#xff0c;通过添加一个实例分割模块来实现的。 在实例分割中&#xff0c;算法不仅…

spring-boot redis stream消息队列demo-及死信简单处理

Redis stream 是 Redis 5 引入的一种新的数据结构&#xff0c;它是一个高性能、高可靠性的消息队列&#xff0c;主要用于异步消息处理和流式数据处理。在此之前&#xff0c;想要使用 Redis 实现消息队列&#xff0c;通常可以使用例如&#xff1a;列表&#xff0c;有序集合、发布…

RedisInsight详细安装教程

简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具&#xff0c;它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控&#xff0c;并且可以在界面上使用 CLI 和连接的 Redis 进行交互&#xff08;RedisInsight 内置对 Redis 模块支持&#xff09;。 RedisIn…

用navigator.sendBeacon完成网页埋点异步请求记录用户行为,当网页关闭的时候,依然后完美完成接口请求,不会因为浏览器关闭了被中断请求。

代码用例 <template><div :class"$options.name"><el-button type"primary" click"sendBeacon">navigator.sendBeacon 请求埋点接口 发送json对象数据</el-button></div> </template><script> expor…