如何用Spring整合MyBatis和Junit

news2024/9/21 0:40:24

Spring整合MyBatis和Junit

  • 一. 整合MyBatis
    • 1. 目录:
    • 2. pom.xml:
    • 3. domain层:
    • 4. dao层:
    • 5. service层:
      • AccountService接口类:
      • AccountServiceImpl实现类:
    • 6. jdbc.properties配置文件:
    • 7. 配置类:
      • JdbcConfig配置类:
      • SpringConfig配置类:
      • MyBastisonfig配置类 ★★★:
    • 8. main运行:
  • 二. 整合Junit
    • 1. pom.xml:
    • 2. AccountServiceTest测试类:

一. 整合MyBatis

Spring整合MyBatis,本质是将MyBastis的核心配置文件换成Spring来整合;

  1. 转化了sqlSessionFactory的配置‘
  2. 原来的typeAliases换成set方法;
  3. 将dataSources变成set方法,将dataSources的bean注入;这里的dataSource用的Druid德鲁伊;
  4. 原来读取映射文件的mapper变成了MapperScannerConfigurer的bean对象,并set扫描包的名称;

总结:总共需要配置两个bean:SqlSessionFactoryBeanMapperScannerConfigurer,(外加dataSource

1. 目录:

在这里插入图片描述

2. pom.xml:

在这里插入图片描述

3. domain层:

即pojo实体类,对应数据库结构;

public class Account implements Serializable {

    private Integer id;
    private String name;
    private Double money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

4. dao层:

AccountDao:
即mapper代理接口类,对应mapper映射文件,此处使用注解的方式写sql;

public interface AccountDao {

    @Insert("insert into tbl_account(name,money)values(#{name},#{money})")
    void save(Account account);

    @Delete("delete from tbl_account where id = #{id} ")
    void delete(Integer id);

    @Update("update tbl_account set name = #{name} , money = #{money} where id = #{id} ")
    void update(Account account);

    @Select("select * from tbl_account")
    List<Account> findAll();

    @Select("select * from tbl_account where id = #{id} ")
    Account findById(Integer id);
}

5. service层:

AccountService接口类:

public interface AccountService {

    void save(Account account);

    void delete(Integer id);

    void update(Account account);

    List<Account> findAll();

    Account findById(Integer id);

}

AccountServiceImpl实现类:

使用@Service注解来定义bean

@Service
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    public void save(Account account) {
        accountDao.save(account);
    }

    public void update(Account account){
        accountDao.update(account);
    }

    public void delete(Integer id) {
        accountDao.delete(id);
    }

    public Account findById(Integer id) {
        return accountDao.findById(id);
    }

    public List<Account> findAll() {
        return accountDao.findAll();
    }
}

6. jdbc.properties配置文件:

用来填充 dataSource 数据源信息
在这里插入图片描述

7. 配置类:

JdbcConfig配置类:

即定义dataSource 这个 bean
只要和数据库有关都需要!
dataSource的值从 jdbc.properties配置文件中获取;

public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String userName;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}

SpringConfig配置类:

@import 两个外部配置类:JDBC(datasource)和MyBatis;
在这里插入图片描述

MyBastisonfig配置类 ★★★:

在这里插入图片描述

  1. SqlSessionFactoryBean
    第一个bean用来获取SqlSessionFactory;
    事务处理由JDBC提供了, 这里使用默认的就可以;
    setTypeAliasesPackage是用来扫描类型别名的包;
    需要注入dataSource的bean,也就是JdbcConfig定义的bean,这里从方法参数注入

  2. MapperScannerConfigurer
    是用来扫描mapper映射文件,所以这里一个单独的bean,不是在SqlSessionFactoryBean中;

原mapper
在这里插入图片描述

原dataSource
在这里插入图片描述

8. main运行:

使用配置类创造IOC容器;
只需获取service的bean再操作即可,dao的bean已经注入到service了(通过定义bean的方法参数注入);
在这里插入图片描述

结果:打印出查询信息

在这里插入图片描述

二. 整合Junit

在上面基础上进行整合;

1. pom.xml:

增加Junit包和Spring-test整合包:
在这里插入图片描述

2. AccountServiceTest测试类:

一般都是测试业务层,测数据层的少;

  • 新建测试业务层接口的测试类:
    在这里插入图片描述

  • @RunWith 设定类运行器:
    SpringJunitClassRunner.class是专用类运行器;

  • 需要让类知道Spring的配置环境:
    @ContextConfiguration(classes=Spring配置文件.class)

  • 将要被测试的(被注入的bean)建立成员变量
    设置@Autowired 自动装配,让IOC容器中的bean自动注入;

  • 测试方法用@Test注释;
    在这里插入图片描述
    结果:打印查询信息
    在这里插入图片描述

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

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

相关文章

HBase基于HDFS上是如何完成增删改查功能的

HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成增删改查功能&#xff1f; 1.如何理解? 1.这句话有个更专业的说法&#xff1a;HDFS 采用数据流方式来访问文件&#xff0c;只支持单个客户端向一个文件追加数据. 2 上半句话&#xff0c;访问文件不外乎读和写&#xff0…

SecureCRT for mac的坑

最新macOS升级到13&#xff08;原来是11&#xff0c;一直没升&#xff09;&#xff0c;升级之后输入法和SecureCRT挂了。 记录一下SecureCRT&#xff0c;备忘 1、第一个坑居然是下载 网上找破解版&#xff0c;想找个新一点的版本&#xff0c;发现都是收费的 收费也就罢了&…

三、优惠卷秒杀

文章目录优惠卷秒杀1.redis实现分布式ID2.优惠券秒杀下单3.超卖问题4.lua脚本5.分布式锁6.redis stream消息队列实现异步秒杀7.redis消息队列list实现消息队列PubSub实现消息队列stream实现消息队列stream的消息队列-消费者组学习黑马点评项目整理总结:https://www.bilibili.co…

腾达Tenda路由器中继wifi步骤

前提&#xff1a; 你有一个信号比较弱&#xff0c;但能上网的wifi&#xff08;暂时叫它1号wifi&#xff09;&#xff0c;并知道其密码你有一个有中继功能的路由器&#xff0c;比如Tenda某型号路由器&#xff0c;插上电&#xff0c;这个路由器的wifi暂时叫它2号wifi 长按下拉菜…

数据库面试题总结

文章目录一、索引相关&#xff08;1&#xff09;什么是索引?&#xff08;2&#xff09;索引是个什么样的数据结构呢?&#xff08;3&#xff09;为什么使用索引&#xff1f;&#xff08;4&#xff09;主键和索引的区别?&#xff08;5&#xff09;说一说索引的底层实现&#x…

educoder数据结构 排序 第2关:实现快速排序

本文已收录于专栏 &#x1f332;《educoder数据结构与算法》&#x1f332; 任务描述 本关要求通过补全快速排序私有函数QSort__来供函数QuickSort调用&#xff0c;以此来实现快速排序的功能。 相关知识 快速排序的基本过程是&#xff1a;从待排序记录中任选一个记录&#…

MS-Model【2】:nnFormer

文章目录前言1. Abstract & Introduction1.1. Abstract1.2. Introduction1.3. Related work2. Method2.1. Overview2.2. Encoder2.2.1. Components2.2.2. The embedding layer2.2.3. Local Volume-based Multi-head Self-attention (LV-MSA)2.2.4. The down-sampling layer…

【通信原理(含matlab程序)】实验五:二进制数字调制与解调

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识&#xff0c;如果大家喜欢&#xff0c;别忘点个赞加个关注哦&#xff0c;让我们一起共同进步~ &#x…

Arduino的45种传感器测试(初级)

前言 说是Arduino的传感器&#xff0c;实际只要明白接口通信方式&#xff0c;其他开发板也可以使用。这一篇的测试是对一些开关和led等的测试&#xff0c;只使用了3.3v / 5v电源和万用表就可完成。 震动开关 实物图和原理图如下 原理&#xff1a;中心有一个金属线的空心黑…

Java多线程-Thread的Object类介绍【wait】【notify】【sleep】

Thread和Object类详解 方法概览 Thread wait、notify、notifyAll方法详解 作用 阻塞阶段 使用了wait方法之后&#xff0c;线程就会进入阻塞阶段&#xff0c;只有发生以下四种情况中的其中一个&#xff0c;线程才会被唤醒 另一个线程调用了这个线程的notify方法&#xff0…

Python数据可视化之直方图和密度图

Python数据可视化之直方图和密度图 提示&#xff1a;前言 Python数据可视化之直方图和密度图 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Python数据可视化之直方图和密度图前言一、导入包二、选择数据集三、直…

k8s之平滑升级

写在前面 通过POD 应用就有了存在的形式&#xff0c;通过deployment 保证了POD在一定的数量&#xff0c;通过service 可以实现一定数量的POD以负载均衡的方式对外提供服务。但&#xff0c;如果是程序开发了新功能&#xff0c;需要上线&#xff0c;该怎么办呢&#xff1f;对此k…

jvm相关,jvm内存模型,java程序运行流程及jvm各个分区的作用、对象的组成(针对hotspot虚拟机)--学习笔记

java程序运行时的运行模型 在jdk1.8之前的元空间&#xff0c;称为永久代并将元空间挪到了堆直接使用本地内存&#xff0c;不再占用堆空间 jvm内存结构划分 堆&#xff08;方法区&#xff09;和元空间是线程共有的&#xff0c;其他部分是线程私有的 每创建一个线程都会创建一个…

MYSQL中常见的知识问题(二)

1、B树和B树的区别&#xff0c;MYSQL为啥使用B树。 1.1、B树 目的&#xff1a;为了存储设备或者磁盘设计的一种平衡查找树。 定义&#xff08;M阶B树&#xff09;&#xff1a;a、树中的每个节点最多有m个孩子。 b、除了根节点和叶子节点外&#xff0c;其他节点最少含有m/2(取上…

08-网络管理-iptables基础(四表五链、禁止ping、防火墙规则添加/删除、自建链使用、SNAT\DNAT模式、FTP服务器防火墙规则)待发布

文章目录1. 概述1.1 四表1.2 五链1.3 四表五链的关系1.4 使用流程2. 语法和操作1.1 语法1.2 常用操作命令1.3 基本匹配条件1.4 基本动作1.5 常用命令示例- 设置默认值- 禁止80端口访问- 查看防火墙规则- 保存规则- 允许ssh- 禁止ping- 删除规则- 清除规则&#xff08;不包括默认…

HR软件如何识别保留优秀员工

在企业信息化的时代&#xff0c;越来越多的年轻员工开始追求他们的激情&#xff0c;辞掉那些乏味的工作&#xff0c;而选择加入重视员工生活质量的企业。他们不再追随那些以牺牲员工福利为代价追求利润的公司。 员工认可度有助于加强组织中的团队合作关系&#xff0c;反过来&a…

木马程序(病毒)

木马的由来 "特洛伊木马"&#xff08;trojan horse&#xff09;简称"木马"&#xff0c;据说这个名称来源于希腊神话《木马屠城记》。古希腊有大军围攻特洛伊城&#xff0c;久久无法攻下。于是有人献计制造一只高二丈的大木马&#xff0c;假装作战马神&…

实用技巧盘点:Python和Excel交互的常用操作

大家好&#xff0c;在以前&#xff0c;商业分析对应的英文单词是Business Analysis&#xff0c;大家用的分析工具是Excel&#xff0c;后来数据量大了&#xff0c;Excel应付不过来了&#xff08;Excel最大支持行数为1048576行&#xff09;&#xff0c;人们开始转向python和R这样…

【通信原理(含matlab程序)】实验六:模拟信号的数字化

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识&#xff0c;如果大家喜欢&#xff0c;别忘点个赞加个关注哦&#xff0c;让我们一起共同进步~ &#x…

一文理解JVM虚拟机

一. JVM内存区域的划分 1.1 java虚拟机运行时数据区 java虚拟机运行时数据区分布图&#xff1a; JVM栈&#xff08;Java Virtual Machine Stacks&#xff09;&#xff1a; Java中一个线程就会相应有一个线程栈与之对应&#xff0c;因为不同的线程执行逻辑有所不同&#xff…