(十八)Spring6集成MyBatis3.5

news2025/1/17 6:06:05

文章目录

  • 实现步骤
  • 具体实现
    • 第一步:准备数据库表
    • 第二步:IDEA中创建一个模块,并引入依赖
    • 第三步:基于三层架构实现,所以提前创建好所有的包
    • 第四步:编写pojo
    • 第五步:编写mapper接口
    • 第六步:编写mapper配置文件
    • 第七步:编写service接口和service接口实现类
    • 第八步:编写jdbc.properties配置文件
    • 第九步:编写mybatis-config.xml配置文件
    • 第十步:编写spring.xml配置文件
    • 第十一步:编写测试程序,并添加事务,进行测试
  • Spring配置文件的import

上一篇:(十七)Spring6整合JUnit

实现步骤

功能是账户转账:

  • 第一步:准备数据库表
    使用t_act表(账户表)
  • 第二步:IDEA中创建一个Maven模块,并引入依赖
    spring-context、spring-jdbc、mysql驱动、mybatis、mybatis-spring:mybatis提供的与spring框架集成的依赖、德鲁伊连接池、junit
  • 第三步:基于三层架构实现,所以提前创建好所有的包
    mapper、service、service.impl、pojo
  • 第四步:编写pojo
    Account,属性私有化,提供公开的setter getter和toString。
  • 第五步:编写mapper接口
    AccountMapper接口,定义方法
  • 第六步:编写mapper配置文件
    在配置文件中配置命名空间,以及每一个方法对应的sql。
  • 第七步:编写service接口和service接口实现类
    AccountService、AccountServiceImpl
  • 第八步:编写jdbc.properties配置文件
    数据库连接池相关信息
  • 第九步:编写mybatis-config.xml配置文件
    该文件可以没有,大部分的配置可以转移到spring配置文件中。
    如果遇到mybatis相关的系统级配置,还是需要这个文件。
    第十步:编写spring.xml配置文件
    组件扫描、引入外部的属性文件、数据源
    SqlSessionFactoryBean配置:
    • 注入mybatis核心配置文件路径
    • 指定别名包
    • 注入数据源

Mapper扫描配置器:指定扫描的包
事务管理器DataSourceTransactionManager:注入数据源
启用事务注解:注入事务管理器

  • 第十一步:编写测试程序,并添加事务,进行测试

具体实现

第一步:准备数据库表

表结构:
请添加图片描述
初始数据:
请添加图片描述

第二步:IDEA中创建一个模块,并引入依赖

依赖:

<!--配置多个仓库-->
  <repositories>
    <!--spring6里程碑版本的仓库-->
    <repository>
      <id>repository.spring.milestone</id>
      <name>Spring Milestone Repository</name>
      <url>https://repo.spring.io/milestone</url>
    </repository>
  </repositories>

  <dependencies>
    <!--spring context依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>6.0.0-M2</version>
    </dependency>
    <!--spring jdbc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>6.0.0-M2</version>
    </dependency>
    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>
    <!--Mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.10</version>
    </dependency>
    <!--Myvatis-spring-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.7</version>
    </dependency>
    <!--德鲁伊连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.14</version>
    </dependency>
    <!--junit-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

第三步:基于三层架构实现,所以提前创建好所有的包

在这里插入图片描述

第四步:编写pojo

/**
 * 简单的账户类
 */
public class Account {
    private Long id;
    private String actno;
    private Double balance;

    public Account() {
    }

    public Account(Long id, String actno, Double balance) {
        this.id = id;
        this.actno = actno;
        this.balance = balance;
    }

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

    public Long getId() {
        return id;
    }

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

    public String getActno() {
        return actno;
    }

    public void setActno(String actno) {
        this.actno = actno;
    }

    public Double getBalance() {
        return balance;
    }

    public void setBalance(Double balance) {
        this.balance = balance;
    }
}

第五步:编写mapper接口

public interface AccountMapper {

    /**
     * 保存账户
     * @param account
     * @return
     */
    int insert(Account account);

    /**
     * 根据账号删除账户
     * @param actno
     * @return
     */
    int deleteByActno(String actno);

    /**
     * 修改账户
     * @param account
     * @return
     */
    int update(Account account);

    /**
     * 根据账号查询账户
     * @param actno
     * @return
     */
    Account selectByActno(String actno);

    /**
     * 获取所有账户
     * @return
     */
    List<Account> selectAll();
}

第六步:编写mapper配置文件

一定要注意,创建这个目录。注意是斜杠不是点。在resources目录下新建。并且要和Mapper接口包对应上。
请添加图片描述
接口叫做AccountMapper,配置文件必须是AccountMapper.xml

<?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="com.bank.mapper.AccountMapper">
    <insert id="insert">
        insert into 
            t_act
        values(null,#{actno},#{balance})
    </insert>

    <delete id="deleteById">
        delete from
            t_act
        where
            actno = #{actno}
    </delete>

    <update id="update">
        update 
            t_act
        set 
            balance = #{balance}
        where
            actno = #{actno}
    </update>

    <select id="selectByActno" resultType="Account">
        select
            *
        from
            t_act
        where
            actno = #{actno}
    </select>

    <select id="selectAll" resultType="account">
        select
            *
        from
            t_act
    </select>
</mapper>

第七步:编写service接口和service接口实现类

注意编写的service实现类纳入IoC容器管理:
AccountService接口:

public interface AccountService {
    /**
     * 开户
     * @param act
     * @return
     */
    int save(Account act);

    /**
     * 根据账号销户
     * @param actno
     * @return
     */
    int deleteByActno(String actno);

    /**
     * 修改账户
     * @param act
     * @return
     */
    int update(Account act);

    /**
     * 根据账号获取账户
     * @param actno
     * @return
     */
    Account getByActno(String actno);

    /**
     * 获取所有账户
     * @return
     */
    List<Account> getAll();

    /**
     * 转账
     * @param fromActno
     * @param toActno
     * @param money
     */
    void transfer(String fromActno, String toActno, double money);
}

AccountService接口实现类:

@Transactional
@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountMapper accountMapper;

    @Override
    public int save(Account account) {
        return accountMapper.insert(account);
    }

    @Override
    public int deleteByActno(String actno) {
        return accountMapper.deleteById(actno);
    }

    @Override
    public int modify(Account account) {
        return accountMapper.update(account);
    }

    @Override
    public Account getByActno(String actno) {
        return accountMapper.selectByActno(actno);
    }

    @Override
    public List<Account> getAll() {
        return accountMapper.selectAll();
    }

    @Override
    public void transfer(String fromActno, String toActno, double moeny) {
        Account fromAct = accountMapper.selectByActno(fromActno);
        if (fromAct.getBalance() < moeny) {
            throw new RuntimeException("余额不足");
        }
        Account toAct = accountMapper.selectByActno(toActno);
        fromAct.setBalance(fromAct.getBalance() - moeny);
        toAct.setBalance(toAct.getBalance() + moeny);

        int count = accountMapper.update(fromAct);

        //模拟异常
        /*String s = null;
        s.toString();*/

        count += accountMapper.update(toAct);

        if (count != 2) {
            throw new RuntimeException("转账失败");
        }

    }
}

第八步:编写jdbc.properties配置文件

jdbc.properties放在类的根路径下:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mvc
jdbc.username=root
jdbc.password=root

第九步:编写mybatis-config.xml配置文件

放在类的根路径下,有些系统级配置spring配置文件没办法完成,可以在mybatis核心配置文件配置,例如懒加载等。
这里只开启日志,其他配置到spring.xml中。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--帮助我们打印mybatis的日志信息。sql语句等-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

第十步:编写spring.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--组件扫描-->
    <context:component-scan base-package="com.bank"/>

    <!--
        引入外部属性配置文件
        之前说过Spring默认加载的是电脑的系统环境,在context:property-placeholder可以使用system-properties-mode属性关闭。
        系统属性模式,默认ENVIRONMENT(表示先找ENVIRONMENT,再找properties-ref/location的),
        NEVER:表示永远不用ENVIRONMENT的,
        OVERRIDE类似于ENVIRONMENT
    -->
    <context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
    <!--配置数据源  init连接开始使用应该初始化,close连接使用完应该关闭-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--配置SqlSessionFactoryBean-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--核心配置文件-->
        <property name="configLocation" value="mybatis-config.xml"/>
        <!--指定别名-->
        <property name="typeAliasesPackage" value="com.bank.pojo"/>
    </bean>
    <!--配置Mapper扫描配置器-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定要扫描的包名-->
        <property name="basePackage" value="com.bank.mapper"/>
    </bean>
    <!--配置事务管理器-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--启用事务注解器-->
    <tx:annotation-driven transaction-manager="txManager"/>
</beans>

第十一步:编写测试程序,并添加事务,进行测试

public class Spring_Mybatis_Test {
    @Test
    public void testSM(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        AccountService accountService = applicationContext.getBean("accountService", AccountService.class);
        try {
            accountService.transfer("act001","act002",1000);
            System.out.println("转账成功");
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

运行测试程序:
请添加图片描述
数据库数据:转账成功
请添加图片描述

测试事务,在service的接口实现类的转账方法松开模拟异常代码,再次运行:
请添加图片描述
虽然出现异常,但是数据库数据不变,事务控制成功:
请添加图片描述

Spring配置文件的import

在实际开发当中,spring配置文件有多个,并且可以在spring的核心配置文件中使用import进行引入,我们可以将组件扫描单独定义到一个配置文件中,如下:
spring2.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context
                           https://www.springframework.org/schema/context/spring-context.xsd">
    <!--组件扫描-->
    <context:component-scan base-package="com.bank"/>
</beans>

然后在核心配置文件中引入:
spring.xml:

    <!--组件扫描-->
    <!--<context:component-scan base-package="com.bank"/>-->

    <!--Spring核心配置文件中引入其他子spring配置文件-->
    <import resource="spring2.xml"/>

把模拟异常注释,运行测试程序:
请添加图片描述
数据库数据:
请添加图片描述

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

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

相关文章

怎么建网站?【模版建站】

关于怎么建网站&#xff0c;除了公司企业&#xff0c;甚至有些个人用户都想了解。大家印象中的建站网站都是要会编程&#xff0c;不然就是找外包公司解决。其实现在建网站也是比较简单的&#xff0c;模版建站一般都能解决基本的建站需求。下面我们一起来看看怎么建网站吧。 一…

考阿里云ACE需要准备什么?考试内容难不难?

最近几年云计算技术发展得越来越好&#xff0c;市场上大多数企业已经选择转型&#xff0c;使用云计算技术来发展自己的新业务&#xff0c;这样一来就需要大量的人才来维持市场的运行。另一方面&#xff0c;为了在现在内卷的社会中的脱颖而出&#xff0c;获得一份稳定、高薪的工…

目标级联分析法( Analytical Target Cascading , ATC )理论matlab程序

目标级联分析法&#xff08; Analytical Target Cascading &#xff0c; ATC &#xff09;理论matlab程序 目标级联分析法&#xff08;Analytical Target Cascading&#xff0c;ATC&#xff09;是一种采用并行思想解决复杂系统的设计方法&#xff0c;最初由密执安大学研究人员…

微服务框架 SpringCloud微服务架构 4 Ribbon 4.1 负载均衡原理

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构4 Ribbon4.1 负载均衡原理4.1.1 负载均衡流程4 Ribbon 4.1 负载均衡原理 …

基于STM32单片机电子相册设计全套资料

资料编号&#xff1a;188 功能介绍&#xff1a; 本系统采用STM32f103单片机通过SPI接口读取sd卡模块中的图片数据。并在单片机为sd卡模块生成fat文件系统。方便读取sd卡中的文件信息。将Bmp格式的图片存放到sd卡的picture文件夹中&#xff0c;然后单片机进行Bmp解码&#xff0…

GEE批量下载 Python本地快速下载GEE数据(比网页版保存到网盘再下载快几十倍,尤其是在下载几十年的长时间系列数据时,速度提升更加明显)

前言 可根据研究区直接裁剪数据以及进行一些计算处理后再下载&#xff0c;GEE成为了大家下载数据的重要途径&#xff0c;然而直接通过官网网页将数据先保存到网盘再下载的下载方法速度太慢&#xff0c;新号速度还好&#xff0c;越用速度越来越慢&#xff0c;本文提供了一种直接…

DolphinScheduler 机器学习工作流预测今年 FIFA 世界杯冠军大概率是荷兰!

点击蓝字&#xff0c;关注我们作者 | DolphinScheduler Committer 周捷光2022 FIFA 世界杯火热进行中&#xff01;这段时间&#xff0c;这场盛宴吸引了全球球迷的目光。除了让人心跳加快的赛况和被大家调侃像馄饨皮的吉祥物之外&#xff0c;预测和投注哪支队伍将会夺冠绝对是球…

Antd中Table列表行默认包含修改及删除功能的封装

一、前言 ant-design是非常不错、方便的一款前端组件库&#xff0c;而这次用到的ProComponents则是在 Ant Design 上进行了自己的封装&#xff0c;更加易用&#xff0c;与 Ant Design 设计体系一脉相承&#xff0c;无缝对接 antd 项目&#xff0c;样式风格与 antd 一脉相承&am…

Java:多线程基础(二)-线程生命周期

目录 线程生命周期 Thread类的常用方法 构造方法 静态方法 常用实例方法 线程生命周期 线程有其创建、就绪、运行、阻塞、死亡的过程&#xff0c;将其称之为“线程的生命周期”。如下图所示&#xff0c; 对应以上5个状态&#xff0c;jdk-Thread类的源码中定义了枚举类Stat…

计算机网络第五章知识点回顾(自顶向下)

1. 网络层控制面 1.1 网络层功能 1.2选路问题 选路问题的描述&#xff1a; 给定一组路由器和连接路由器的链路&#xff0c;寻找一条从源路由器到目的路由器的最佳路径。 1.3 什么是最佳路径&#xff1f; 1.4 图抽象 1.5 选路算法分类 1.6 链路状态&#xff08;LS&#xff0…

“生成式技术”正在颠覆人类创作!

整理 | 王启隆在过去的半年里&#xff0c;AI 写小说、绘画和剪视频等热点新闻火爆全球&#xff0c;现在只需要在键盘上敲几个关键词&#xff0c;AI 就能在烧着我们显卡的同时画出一幅幅优美的图画&#xff0c;一个全新的应用世界向未来的初创公司敞开了大门。人类现在拥有着一大…

碳中和专利创新专题:各省市县专利面板(原始文件)、低碳专利授权数等多指标数据

一、各省市县专利面板含原始文件 1、数据来源&#xff1a;国家知识产权局 2、时间跨度&#xff1a;1985-2019年 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 来源 序号 标题 合享价值度 链接到incoPat 公开&#xff08;公告&#xff09;号 公开&#xff08…

数据结构之线性表中的栈和队列【详解】

文章目录引言&#xff1a;栈和队列的讲解&#xff08;一、&#xff09;什么是栈1.栈的概念、结构和图解&#xff1a;&#xff08;1.&#xff09;顺序表和链表的对比&#xff08;严格来说这两个结构是相辅相成的&#xff09;&#xff08;2.&#xff09;栈的概念和结构&#xff0…

[MyBatis]一级缓存/二级缓存/三方缓存

缓存是一种临时存储少量数据至内存或者是磁盘的一种技术.减少数据的加载次数,可以降低工作量,提高程序响应速度 缓存的重要性是不言而喻的。mybatis的缓存将相同查询条件的SQL语句执行一遍后所得到的结果存在内存或者某种缓存介质当中&#xff0c;当下次遇到一模一样的查询SQL时…

[附源码]Python计算机毕业设计Djangossm新能源电动汽车充电桩服务APP

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

UICollectionView

文章目录前言基础概念UICollectionView与相关对象关系注意事项强大的控件相关的类重新使用视图提高性能例子一些方法前言 本篇&#xff1a;进行UICollectionView的学习 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 基础 概念 UICollectionView是我…

【毕业设计】31-基于单片机的农业蔬菜大棚温度自动控制系统设计(原理图工程+源码工程+仿真工程+答辩论文+答辩PPT)

typora-root-url: ./ 【毕业设计】31-基于单片机的农业蔬菜大棚温度自动控制系统设计&#xff08;原理图工程源码工程仿真工程答辩论文答辩PPT&#xff09; 文章目录typora-root-url: ./【毕业设计】31-基于单片机的农业蔬菜大棚温度自动控制系统设计&#xff08;原理图工程源…

NetCore OpenIdConnect验证为什么要设置Authority?

在使用Identity Server作Identity Provider的时候&#xff0c;我们在NetCore的ConfigureServices((IServiceCollection services))方法中,常需要指定options的Authority&#xff0c;如下代码所示&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 …

基于PHP+MYSQL酒店管理系统的设计与开发

随着人们生活条件的提高,旅游和出差已经成了家常便饭,但是因为他向异地所以第一个要解决的问题就是吃住问题,吃先对是比较好解决的一个问题,随便一个超市或者饭店甚至地摊就能解决这一问题,但是总不能露宿街头吧,所以很多人在到达目的地的第一时间就是去寻找一个能够入住的酒店…

一文彻底搞懂Mysql索引优化

专属小彩蛋&#xff1a;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff08;前言 - 床长人工智能教程&#xff09; 目录 一、索引介绍 二、性能分析 三、查询优化 一、索引介绍…