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 configuration
        PUBLIC "-//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 mapper
        PUBLIC "-//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;

    @BeforeAll
    static void CreateSessionFactory() throws IOException {
        InputStream in = Resources.getResourceAsStream("mybatis/config/mybatis-config.xml");
        sqlSF = new SqlSessionFactoryBuilder().build(in);
    }
    
    @Test
    void 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());
        }
    }

    @Test
    void 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());
        }
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

校园跑腿(源码+文档)

校园跑腿管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端店铺代购用户条款隐私协议租借服务行李代搬拨打客服电话注册界面我的界面申请骑手登录界面快递带取资料修改快递代寄主页万能帮 管理端代购管理添加用户订单…

如何通过优化图片来提升WordPress网站的访问速度

因为我本身也是一个接触网站时间并不长的半小白选手&#xff0c;最开始建站的时候也选择了比较流行的WordPress来&#xff0c;过程虽然坎坷&#xff0c;但是好歹网站是上线了&#xff0c;网站初步的效果我还是比较满意的&#xff0c;但是总感觉网页加载的速度比较慢。 我用的服…

c++的学习之路:7、类和对象(3)

一、初始化列表 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式&#xff0c;如下方代码就是初始化列表的方式。从图片可以看出这种方式也可以利用缺省初始化…

文件搜索案列 --java

目标&#xff1a; 搜索盘符下面符合要求的文件名&#xff0c;并可以选择是否打开该文件 代码&#xff1a; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Scanner;public class findQQ {public static void main(String[] a…

Protobuf 二进制文件学习及解析

0. 简介 protobuf也叫protocol buffer是google 的一种数据交换的格式&#xff0c;它独立于语言&#xff0c;独立于平台。google 提供了多种语言的实现&#xff1a;java、c#、c、go 和 python&#xff0c;每一种实现都包含了相应语言的编译器以及库文件。 由于它是一种二进制的…

【攻防世界】file_include (PHP伪协议+过滤器)

打开题目环境&#xff1a; 进行PHP代码审计&#xff0c;发现这是一个文件包含漏洞。 我们尝试利用PHP伪协议中的 php://filter来读取 check.php 中的内容。 构造payload 并提交&#xff1a; 发现payload被过滤掉了&#xff0c;我们就需要尝试使用不同的转换器。 PHP各类转换…

java和408相关知识

一、java 1.JVM的GC机制&#xff1a; &#xff08;1&#xff09;哪些内存需要回收&#xff1f; 堆和方法区&#xff0c;程序计数器、虚拟机栈、本地方法栈3个区域是随线程而生&#xff0c;随线程而灭的 &#xff08;2&#xff09;什么时候回收&#xff1f; 判断对象是否可…

HarmonyOS 应用开发之自定义组件冻结功能

自定义组件处于非激活状态时&#xff0c;状态变量将不响应更新&#xff0c;即Watch不会调用&#xff0c;状态变量关联的节点不会刷新。通过freezeWhenInactive属性来决定是否使用冻结功能&#xff0c;不传参数时默认不使用。支持的场景有&#xff1a;页面路由&#xff0c;TabCo…

LC 107.二叉树的层序遍历II

107. 二叉树的层序遍历 II 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出…

OpenHarmony实战开发-如何通过ArkTS卡片实现一个简单的音乐卡片

​介绍 本示例展示了如何通过ArkTS卡片实现一个简单的音乐卡片 效果预览 使用说明 1.安装应用&#xff0c;并在桌面上长按本应用的桌面图标&#xff0c;长按后弹出选项列表。 2.点击弹出列表中的服务卡片选项进入卡片添加界面。 3.点击正下方的添加到桌面按钮&#xff0c;…

uniapp项目-懂你找图

文章目录 项目介绍项目搭建1.项目创建 2.新增tabbar3引入字体图标 uni-ui介绍使用 uni-api介绍 首页模块功能分析搭建子页面分段器介绍 封装自己的异步请求为什么要封装封装的思路 编写首页-推荐页面分页功能 专辑列表获取专辑详情数据 项目介绍 微信小程序&#xff0c;提供图…

SQLBolt,一个练习SQL的宝藏网站

知乎上有人问学SQL有什么好的网站&#xff0c;这可太多了。 我之前学习SQL买了本SQL学习指南&#xff0c;把语法从头到尾看了个遍&#xff0c;但仅仅是心里有数的程度&#xff0c;后来进公司大量的写代码跑数&#xff0c;才算真真摸透了SQL&#xff0c;知道怎么调优才能最大化…

AWS迁移教程,Redis迁移到Elasticache

当企业不断出海拓展业务&#xff0c;面临的挑战之一就是如何高效迁移应用程序及数据库至云端。为解决这一问题&#xff0c;AWS云专门提供多种简单且高效的迁移方式&#xff0c;进行帮助企业实现应用程序的平稳迁移&#xff0c;从而降低迁移过程中的风险和成本。下面九河云将为大…

SSM学习——Spring AOP与AspectJ

Spring AOP与AspectJ 概念 AOP的全称为Aspect-Oriented Programming&#xff0c;即面向切面编程。 想象你是汉堡店的厨师&#xff0c;每一份汉堡都有好几层&#xff0c;这每一层都可以视作一个切面。现在有一位顾客想要品尝到不同风味肉馅的汉堡&#xff0c;如果按照传统的方…

数据结构:非比较排序

非比较排序都具有很大的局限性,包括技术排序,基数排序,桶排序等 计数排序 时间复杂度:O(N) 空间复杂度:O(range) 适用范围 数据的范围集中的数组进行排序,不适合数据分散的数组 方法 统计每个数据出现的次数为n 建立一个相同大小的数组,将每个数据都初始化为0 然后遍历…

链表优化与拓展的细节:深度探索与精致打磨

前言 链表&#xff0c;作为C语言中的基础数据结构&#xff0c;其灵活性和动态性使其在编程领域具有广泛的应用。然而&#xff0c;仅仅掌握链表的基本操作是远远不够的&#xff0c;为了更好地发挥链表的性能并满足复杂场景的需求&#xff0c;我们需要对链表进行深入的优化和拓展…

泛域名站群,泛域名程序

泛域名站群是一种利用大量类似的泛域名来建立多个网站&#xff0c;并通过这些网站链接到主网站&#xff0c;以提升主网站的排名和流量的策略。泛域名站群通常包含大量的子域名&#xff0c;这些子域名指向不同的页面&#xff0c;但它们的内容大部分是重复或相似的&#xff0c;目…

【蓝桥杯第十二届省赛B】(部分详解)

空间 8位1b 1kb1024b(2^10) 1mb1024kb(2^20) 时间显示 #include <iostream> using LLlong long; using namespace std; int main() {LL t;cin>>t;int HH,MM,SS;t/1000;SSt%60;//like370000ms370s,最后360转成分余下10st/60;MMt%60;t/60;HHt%24;printf("%02d:…

【Servlet】服务器内部转发以及客户端重定向

文章目录 一、服务器内部转发&#xff1a;request.getRequestDispatcher("...").forward(request, response);二、客户端重定向&#xff1a;response.sendRedirect("");三、服务器内部转发代码示例四、客户端重定向代码示例 一、服务器内部转发&#xff1a…

升级一下电脑,CPU换I5-14600K,主板换华硕B760M

刚给自己电脑升级了一下&#xff0c;CPU从 AMD R5 5600X 换成 Intel I5-14600K&#xff0c;主板换成了华硕的 TUF GAMING B760M-PLUS WIFI D4。 因为我现有的两根内存是DDR4的&#xff0c;所有我选了个支持DDR4内存的主板。 我发现用AMD处理器时将系统从Win10升级到Win11后变…