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.hqwc.cn/news/586366.html

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

相关文章

火鸟门户系统|—全景频道

全景频道功能简介 全景频道是一种可以发布和播放全景内容的功能。它可以帮助用户更好地展示360度全景图像和视频&#xff0c;提供更真实的沉浸式体验。 全景频道的功能 全景频道的主要功能包括&#xff1a; 全景发布&#xff1a;用户可以上传和发布全景图片和视频。全景播放…

LLM之RAG实战(三十七)| 高级RAG从理论到LlamaIndex实现

论文《Retrieval-Augmented Generation for Large Language Models: A Survey》对检索增强生成&#xff08;RAG&#xff09;总结了如下三种方式&#xff1a; Naive RAG高级RAG模块化RAG 推荐阅读该论文的详解&#xff1a; LLM之RAG理论&#xff08;二&#xff09;| RAG综述…

Mysql 常用SQL语句

1、查看mysql中所有的数据库&#xff0c; show databases; 2、创建库 create database 库名;&#xff08;也可以用 create database if not exists 库名; 表示如果库不存在再创建&#xff09; 例&#xff1a;create database if not exists ecology; 3、删除库 …

Git Fork后的仓库内容和原仓库保持一致

Git Fork后的仓库内容和原仓库保持一致 ①Fork原仓库内容到自己仓库 ②将项目内容下载到本地 ③使用git命令获取原仓库内容&#xff0c;将原仓库的最新内容合并到自己的分支上并推送 下面从第三步开始演示~ 这里以码云上的若依项目为演示项目 ③使用git命令获取原仓库内容 …

C++两种方法实现二叉搜索树

文章目录 1.二叉搜索树&#xff08;BST Binary Search Tree&#xff09;1.1二叉搜索树的概念2.2二叉搜索树的操作2.2.1二叉搜索树的查找2.2.2二叉搜索树的插入2.2.3二叉搜索树的删除 2.3二叉搜索树的实现2.3.1二叉搜索的基本结构2.3.2查找节点2.3.3插入节点2.3.4删除节点删除度…

百度网站收录提交入口

百度网站收录提交入口 在网站刚建立或者更新内容后&#xff0c;及时将网站提交给搜索引擎是提高网站曝光和获取流量的重要步骤之一。百度作为中国最大的搜索引擎之一&#xff0c;网站在百度中的收录情况尤为重要。下面介绍一下如何通过百度的网站收录提交入口提交网站。 1. 百…

卷积神经网络(CNN)的数学原理解析

文章目录 前言 1、介绍 2、数字图像的数据结构 3、卷积 4、Valid 和 Same 卷积 5、步幅卷积 6、过渡到三维 7、卷积层 8、连接剪枝和参数共享 9、卷积反向传播 10、池化层 11、池化层反向传播 前言 本篇主要分享卷积神经网络&#xff08;CNN&#xff09;的数学原理解析&#xf…

Git:修改的时候在自己的分支修改,如果在其它分支修改代码,会无法切换回自己的分支

如果已经发生了: 首先在当前分支把没问题的代码提交一下&#xff0c; 保存当前修改&#xff1a;在当前分支上进行一次提交&#xff0c;将当前修改保存起来。&#xff08;但是不要推送到远程仓库&#xff09; 切换回自己的分支&#xff1a;尝试切换回自己的分支。如果报错&…

新model开发记录

模型使用 -- 用blender导出为 fbx &#xff0c;修改渲染方式&#xff08;点击模型->Materials->Extract Materials(将材质从fbx中 单独提取出来了)->Materials 选择 Shader -> SimpleURPToonLitExample 点开脸的材质&#xff0c;勾选第一条&#xff09; 解决角色…

深入了解C语言中的结构体类型与内存对齐

引言&#xff1a; 在C语言中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许我们将不同类型的数据组合在一起&#xff0c;形成一个新的数据类型。结构体的使用为我们解决了一些复杂数据的表示和处理问题&#xff0c;不仅限于单单的整型或者字符。本文将深入探讨结…

甘特图进度跟踪与风险预警机制

项目管理就像一场跋涉,甘特图则是我们的路线图和指南针。制定好行程计划后,我们就要跟着它一路前行,时刻核对进度,防患于未然。 一张优秀的甘特图不仅绘制了任务的起止时间,更重要的是它将各项工序的逻辑关系和制约条件清晰可见。我们遵循这个时间线前进,就能确保万无一失。通…

你以为BBA电车不行?看看宝马财报里电车有多挣钱

作者 |许行知 编辑 |德新 如果放在中国市场百花齐放、争奇斗艳的电动车里&#xff0c;宝马的电动车乍看确实平平无奇。 但从全球市场来看&#xff0c;电动车早已成为宝马重要的利润增长点。 3月末&#xff0c;宝马集团举办线上沟通会&#xff0c;总结了其2023年的业绩表现&a…