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

news/2025/1/1 13:59:52/

大纲

  • 配置的修改
  • 代码的修改
    • 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.ppmy.cn/news/1404251.html

相关文章

Rust---有关介绍

目录 Rust---有关介绍变量的操作Rust 数值库&#xff1a;num某些基础数据类型序列(Range)字符类型单元类型 发散函数表达式&#xff08;&#xff01; 语句&#xff09; Rust—有关介绍 得益于各种零开销抽象、深入到底层的优化潜力、优质的标准库和第三方库实现&#xff0c;Ru…

手机扫码看文件怎么实现?文件二维码的生成技巧及步骤

通过手机扫码查看word、pdf、excel等文件是现在很常见的一种内容获取方式&#xff0c;这种方式能够让文件在较短的时间内实现快速分享&#xff0c;提高了用户获取文件的便利性&#xff0c;为用户带来更好的体验效果。 那么不同格式的文件该如何制作二维码呢&#xff1f;相信有…

【详细讲解语言模型的原理、实战与评估】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

Linux 安装部署高性能缓存服务redis

Linux 系统安装Redis 5 注意事项&#xff1a; 下载Redis 文件包&#xff0c;并上传至linux服务上解压 tar -zxvf redis.tar安装&#xff1a; 编译 make PREFIX/usr/local/redis install配置&#xff1a; redis.conf daemonize yes bind 127.0.0.1 192.168.1.221 supervised…

基于阻塞队列(条件变量 + 锁)的生产者消费者模型

基于阻塞队列&#xff08;条件变量 锁&#xff09;的生产者消费者模型 BlockQueue.hpp &#xff08;阻塞队列&#xff09; #include <iostream> #include <cstdlib> #include <unistd.h> #include <vector> #include <queue> #include "…

数据可视化高级技术(Echarts)

目录 &#xff08;一&#xff09;数据可视化概念及Echarts基础知识 数据可视化的好处&#xff1a; 数据可视化的目标 数据可视化的基本流程 &#xff08;二&#xff09;数据图表 类别比较图表&#xff1a; 数据关系图表&#xff1a; 数据分布图表&#xff1a; 时间序列…

Topaz Video AI for Mac/Win:无损放大,让每一帧都熠熠生辉

在数字化时代的浪潮中&#xff0c;视频已成为我们生活中不可或缺的一部分。无论是观赏电影、记录生活&#xff0c;还是进行工作汇报&#xff0c;高清、细腻的视频画面总能带给我们更好的视觉体验。然而&#xff0c;面对那些分辨率较低的老旧视频&#xff0c;我们是否只能无奈叹…

在ubuntu上搭建系统监控系统

大纲 数据生产方安装和运行验证 数据收集、存储和分发方下载和解压修改配置运行验证 数据消费方下载和运行验证新增数据源新增看板关联看板和数据源效果展现 参考资料 在一个监控系统中&#xff0c;一定会有“数据生产方”和“数据消费方”存在。“数据生产方”用于产出需要监控…