0基础学习Mybatis系列数据库操作框架——目录结构

大纲

  • 配置的修改
  • 代码的修改
    • Main.java文件所在包下
      • 新增org.example.model包
      • 新增org.example.mapper包
    • 单元测试

在《0基础学习Mybatis系列数据库操作框架——最小Demo》一文中,我们用最简单的方法组织出一个Mybatis应用项目。为了后续构建更符合日常开发环境的项目,我们对项目的目录结构做了调整,并引入了单元测试组件JUnit。
在这里插入图片描述

配置的修改

在resources目录下,将mybatis相关的配置聚合到名字叫mybatis的目录下,这样会方便后续管理。因为实际开发中,我们还会使用到很多其他组件的配置。如果散乱在resources这个目录下,将不利于后期维护。
mybatis的配置由两部分组成:

  • 数据库连接和mapper文件路径。这个配置叫mybatis-config.xml,我们把它放在config目录下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<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/testdb?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="fangliang"/></dataSource></environment></environments><mappers><mapper resource="mybatis/mapper/AllTypeMapper.xml"/></mappers>
</configuration>
  • mapper文件。可能是多个mapper文件,我们把它们放到mapper目录下。本例我们只设计了一个mapper,但是含有两条SQL。
    • findAll用查询表中所有数据。
    • findOne会根据传入的参数返回最多一条数据。

需要注意的是mapper的namespace,它与后续我们定义的SQL映射器(mapper)接口的包(org.example.mapper)和名称(AllTypeMapper)组合一致。否则我们在后续的Java代码中不能创建SQL映射器对象。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.AllTypeMapper"><select id="findAll" resultType="org.example.model.AllType">select * from all_type</select><select id="findOne" resultType="org.example.model.AllType">select * from all_type where info_int = #{info_int}</select>
</mapper>

代码的修改

主要修改分为两部分

Main.java文件所在包下

新增org.example.model包

用于保存SQL结果映射的Java对象类。

package org.example.model;public class AllType {public int getInfo_int() {return info_int;}public void setInfo_int(int info_int) {this.info_int = info_int;}private int info_int;
}

新增org.example.mapper包

用于保存SQL语句映射器类(Mapper Class)的接口定义(Interface)。这个概念我们并没有在《0基础学习Mybatis系列数据库操作框架——最小Demo》中涉及,因为之前我们直接通过全限定名“AllTypeMapper.findAll”访问了SQL方法。而本文我们将使用映射机器来访问。
注意映射器接口中的findOne方法名,在之前写好的SQL XML文件中看到过。后续我们还将在单元测试代码中见到它。
这个接口的定义连接了SQL XML和Java代码。

package org.example.mapper;import org.example.model.AllType;public interface AllTypeMapper {AllType findOne(int info_int);
}

单元测试

和main目录对等,建立相似的目录结构和包。
在这里插入图片描述
我们并不打算针对main下的model和mapper包做单元测试,而是在单元测试中测试mybatis相关特性,所以test目录下的org.example包下只有一个测试文件AllTypeTest.java。
不同于《0基础学习Mybatis系列数据库操作框架——最小Demo》中查询所有数据的写法

            try (SqlSession s = sqlSF.openSession()) {all = s.selectList("org.example.mapper.AllTypeMapper.findAll");}for (AllType a : all) {System.out.println(a.getInfo_int());}

本文要根据根据传入的参数,动态修改SQL语句。注意下面的写法:

  • 通过connection的getMapper方法获取映射器类(传入的是接口)。
  • 通过映射器类的方法(继承自映射器接口),修改SQL语句并获得返回结果。
            try (SqlSession s = sqlSF.openSession()) {AllTypeMapper all_type_mapper = s.getMapper(AllTypeMapper.class);AllType a = all_type_mapper.findOne(1);System.out.println(a.getInfo_int());}

完整代码如下:

package org.example;import org.example.model.AllType;
import org.example.mapper.AllTypeMapper;
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 org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class AllTypeTest {private static SqlSessionFactory sqlSF;@BeforeAllstatic void CreateSessionFactory() throws IOException {InputStream in = Resources.getResourceAsStream("mybatis/config/mybatis-config.xml");sqlSF = new SqlSessionFactoryBuilder().build(in);}@Testvoid testFindAll() {List<AllType> all = null;try (SqlSession s = sqlSF.openSession()) {all = s.selectList("org.example.mapper.AllTypeMapper.findAll");} catch (Exception e) {System.out.println(e.getMessage());}for (AllType a : Objects.requireNonNull(all)) {System.out.println(a.getInfo_int());}}@Testvoid testFindOne() {try (SqlSession s = sqlSF.openSession()) {AllTypeMapper all_type_mapper = s.getMapper(AllTypeMapper.class);AllType a = all_type_mapper.findOne(1);if (a != null) {System.out.println(a.getInfo_int());}} catch (Exception e) {System.out.println(e.getMessage());}}
}

经过优化后的目录结构,将有利于后续我们的设计和探索。

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

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

相关文章

归并排序和分治

归并排序 归并排序是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分治法将问题分成一些小的问题然后递归求解&#xff0c;而治的阶段则将分的阶段得到的各答案"修补"在一起&#xff0c;即分而治之)。 分而治之 可以看到这种结构…

书生浦语全链条开源开放体系

开放了高质量语料数据 预训练 微调 评测 评测框架 部署 智能体 例如把openlab对于计算机视觉的封装

LeetCode-894. 所有可能的真二叉树【树 递归 记忆化搜索 动态规划 二叉树】

LeetCode-894. 所有可能的真二叉树【树 递归 记忆化搜索 动态规划 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;分治&#xff0c;递归解题思路二&#xff1a;动态规划。关键思路是如果构造节点数目为 n 的真二叉树&#xff0c;此时可以从节点数目序列为 [(1,n−2),(3,…

Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

文章目录 1、TCP三次握手(1) 第一次握手(2) 第二次握手(3) 第三次握手 2、TCP四次挥手(1) 一次挥手(2) 二次挥手(3) 三次挥手(4) 四次挥手 3、TCP滑动窗口4、TCP状态时序图5、多进程并发服务器6、多线程并发服务器 1、TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协…

选择SD-WAN带宽时需要考虑什么?

部署SD-WAN之前&#xff0c;企业需要考虑关系到带宽大小的一系列因素&#xff0c;以确保其网络能够满足业务需求并保持高效运行。以下是一些在确定SD-WAN带宽时需要考虑的关键因素&#xff1a; 企业规模和用户数量&#xff1a; 企业规模和用户数量是决定带宽需求的重要因素之一…

Vue的前世今生与安装配置

vue的前世今生 Vue.js是一个流行的前端JavaScript框架&#xff0c;用于构建用户界面与单页应用程序&#xff08;SPA&#xff09;。它的诞生和发展可以概括为以下几个重要阶段&#xff1a; 初创阶段&#xff1a;Vue由中国人尤雨溪&#xff08;Evan You&#xff09;创建于2014年…

人工智能聊天机器人都有哪些?分享3款神奇的软件!

在数字化浪潮中&#xff0c;人工智能聊天机器人以其独特的魅力和实用性&#xff0c;逐渐成为我们生活中不可或缺的一部分。它们能够与用户进行智能互动&#xff0c;提供多元化的服务&#xff0c;让我们的生活更加便捷和高效。那么&#xff0c;市场上究竟有哪些领先的人工智能聊…

智能停车场物联网远程监控解决方案

智能停车场物联网远程监控解决方案 智能停车场物联网远程监控解决方案是一种集成了现代物联网技术、大数据分析以及云计算等先进技术手段&#xff0c;对停车场进行全面智能化管理的综合系统。它通过实时感知、精准采集和高效传输各类停车数据&#xff0c;实现对停车场运营状态…

springcloud基本使用二(远程调用)

创建两个springboot maven子项目 子项目名称分别为order-server和user-server 配置user-server子项目: 所需依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependenc…

站群CMS系统

站群CMS系统是一种用于批量建立和管理网站的内容管理系统&#xff0c;它能够帮助用户快速创建大量的网站&#xff0c;并实现对这些网站的集中管理。以下是三个在使用广泛的站群CMS系统&#xff0c;它们各具特色&#xff0c;可以满足不同用户的需求。 1. Z-BlogPHP Z-BlogPHP是…

4年经验来面试20K的测试岗,一问三不知,我还真不如去招应届生。

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试…

vue使用i18n

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;前端 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#x…

力扣热题100_链表_141_环形链表

文章目录 题目链接解题思路解题代码 题目链接 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

2024年网络安全运营体系建设方案

以下是部分WORD内容&#xff0c;请您参阅。如需下载完整WORD文件&#xff0c;请前往星球获取&#xff1a; 网络安全运营监控工作整体构想 工作目标及原则 工作目标 为进一步落实强化公司网络安全保障&#xff0c;有效支撑公司数字化转型战略&#xff0c;建立健全公司网省两级协…

HCIP(DSVPN)实验

HCIP&#xff08;DSVPN&#xff09;实验 一&#xff0c;实验要求&#xff1a; 1、r5为isp&#xff0c;只能进行ip地址的配置&#xff0c;其所有ip地址均为共有ip地址 2、r1和r5使用ppp的PAP认证&#xff0c;r5为主认证方 r2和r5之间使用ppp的chap认证&#xff0c;r5为主认证方…

数学公式——蓝桥杯赛题

题目信息 解题代码 def isintersect(k1, b1, k2, b2):# 如果两条直线的斜率不相等&#xff0c;则它们必定相交if k1 ! k2:return Trueelse:return False# 定义一个函数getpoint&#xff0c;用于计算两条直线交点的坐标 def getpoint(k1, b1, k2, b2):# 使用直线交点公式计算交…

电机的工作电流怎么计算?

电机的工作电流计算通常需要考虑多个因素&#xff0c;包括电机的额定功率、工作电压、效率以及负载情况等。以下是一个基本的计算方法&#xff0c;用于估算直流电机或交流电机在特定条件下的工作电流。 了解电机参数 额定功率 (P_rated) 电机的额定功率是指在额定工作条件下&am…

基于Websocket的局域网聊天系统

1.1 研究背景及意义 本项目所对应领域的研究背景及意义[1]。新冠肺炎局域网通信发生以来&#xff0c;大数据、云计算、人工智能等新一代信息技术加速与交通、局域网通信、教育、金融等领域深度融合&#xff0c;让局域网通信防控的组织和执行更加高效&#xff0c;成为战“疫”的…

Spring源码基础解析

这里写目录标题 Spring从哪开始&#xff1f;Spring的基本运行BeanFactoryPostProcessor与BeanPostProcessor的区别BeanFactoryPostProcessor用来处理bean的定义信息BeanDefinitionBeanPostProcessor用来处理Bean对象&#xff08;包含实例化与初始化&#xff09; Environment Sp…

Mac下Docker Desktop starting的解决方法

记录下自己在新增了一个新的容器后&#xff0c;Disk Size过大导致启动Docker Desktop会一直卡在Docker Desktop starting&#xff0c;并且重启无效的解决方法。该方法无需重新卸载&#xff0c;并且能保留原有的镜像和容器。 一、确认问题 首先确认Docker.raw大小以确认是否和笔…