(十八)Spring6集成MyBatis3.5

news/2024/4/19 17:23:51/

文章目录

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

Spring学习目录

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

下一篇:(十九)Spring中的八大模式

实现步骤

功能是账户转账:

  • 第一步:准备数据库表
    使用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;}@Overridepublic 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 mapperPUBLIC "-//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_actvalues(null,#{actno},#{balance})</insert><delete id="deleteById">delete fromt_actwhereactno = #{actno}</delete><update id="update">update t_actset balance = #{balance}whereactno = #{actno}</update><select id="selectByActno" resultType="Account">select*fromt_actwhereactno = #{actno}</select><select id="selectAll" resultType="account">select*fromt_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 {@Autowiredprivate AccountMapper accountMapper;@Overridepublic int save(Account account) {return accountMapper.insert(account);}@Overridepublic int deleteByActno(String actno) {return accountMapper.deleteById(actno);}@Overridepublic int modify(Account account) {return accountMapper.update(account);}@Overridepublic Account getByActno(String actno) {return accountMapper.selectByActno(actno);}@Overridepublic List<Account> getAll() {return accountMapper.selectAll();}@Overridepublic 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 configurationPUBLIC "-//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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://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 {@Testpublic 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/contexthttps://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.ppmy.cn/news/241759.html

相关文章

【SSM】Spring6(十二.Spring6集成MyBatis3.5)

文章目录 1. 实现步骤2.具体实现2.1 准备数据库2.2 创建模块&#xff0c;引入依赖2.3 创建包2.4 创建Pojo类2.5 编写mapper接口2.6 编写Mapper配置文件2.7 编写service接口和service接口实现类2.8 编写jdbc.properties配置文件2.9 编写mybatis-config.xml配置文件2.10编写sprin…

华为 PIM-DM

目录 1、PIM-DM密集模式 2、PIM邻居关系 3、拓扑 4、基础配置 5、PIM--DM扩散 6、PIM--剪枝 7、PIM--剪枝否决机制 8、PIM--断言 9、PIM--DM嫁接 10、PIM-DM协议报文 组播数据的转发中会出现上游接口和下游接口这两个概念&#xff0c;路由器收到组播数据的接口称为上…

【Spring6】| Spring6集成MyBatis3.5

目录 一&#xff1a;Spring6集成MyBatis3.5 第一步&#xff1a;准备数据库表 第二步&#xff1a;IDEA中创建一个模块&#xff0c;并引入依赖 第三步&#xff1a;基于三层架构实现&#xff0c;所以提前创建好所有的包 第四步&#xff1a;编写pojo 第五步&#xff1a;编写m…

鼎盛合|智能电量显示接地宝插座方案

随着电车普及度越来越高&#xff0c;电源设备的布局与建设也哉敲锣打鼓紧密进行&#xff0c;一二线城市基本已经可以满足城市电车的充电需求&#xff0c;但在村镇等地方充电设备仍然没有达到标准需求&#xff0c;许多车主便只能从家里接线给车充电&#xff0c;不仅涉及到用电安…

springcloud-alibaba (06)RocketMQ下载安装和单机启动个人笔记

RocketMQ 01 下载RocketMQ02 安装RocketMQ03 启动RocketMQ1. 内存分配1.1 第一步1.2 第二步1.3 第三步 2. 启动RocketMQ2.1 启动NameServer2.2 启动Broker 04 测试RocketMQ05 关闭RocketMQ 01 下载RocketMQ 下载 RocketMQ 即可以从 Apache 官网下载&#xff0c;也可以从 gitHu…

【剑指offer】二维数组中的查找(详细解析)

文章目录 题目思路代码实现 题目 题目链接入口&#xff1a;牛客&#xff1a;JZ4 二维数组中的查找 思路 1.核心考点 &#xff08;1&#xff09; 数组相关&#xff1a;二维数组&#xff08;矩阵&#xff09;。 &#xff08;2&#xff09; 特性观察&#xff1a;在一个二维数组…

Selenium Firefox 证书信任问题

抓取数据会导致页面加载失败而无法进行, 解决方案: 1.首先将需要抓取的网站添加到信任, 火狐操作 菜单->设置->隐私与安全->证书 将 "查询 OCSP 响应服务器&#xff0c;以确认证书当前是否有效(Q)"勾去除 打开"查看证书"->"服务器&quo…

中兴B860av2.1u,开启ADB线刷刷机固件

新版中兴B860av2.1u&#xff0c;s905l3-b主控&#xff0c;开启二V码-ADB&#xff0c;线刷刷机固件 刷机方法&#xff1a; 拆机短接储存芯片旁边的焊盘 5脚6脚 再通电刷机&#xff0c;电脑识别到了放开短接等刷机完毕&#xff01; 声明&#xff1a;本安卓固件&#xff0c;仅供…

中兴ZXVb860av2.1t刷机固件,芯片晶晨S905l-b,不失效线刷包,当贝桌面

固件特点&#xff1a; 1、调出原厂固件屏蔽的wifi&#xff0c;开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 2、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xff1b;修改dns&#xff0c;三网通用&#xff1b; 3、大量精简内置的没用的软件&…

中兴B860AV2.1-A,M,T-当贝纯净桌面-线刷固件(附刷机教程)

中兴B860AV2.1-A,M,T-当贝纯净桌面-线刷固件&#xff08;固件附刷机教程&#xff09; 固件说明&#xff1a; 1、调出原厂固件屏蔽的wifi&#xff0c;开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 2、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&a…

电信版本-中兴B860AV1.1-T-S905M-B NAND闪存 线刷救砖固件

插双头USB线 短接NAND芯片的 6 7 针脚 通电 电脑发现驱动安装 松开短接 进度条走100% 松开短接 完工 声明&#xff1a;本安卓固件&#xff0c;仅供内部测试和技术交流使用&#xff0c;任何非法商业使用及商业利益冲突带来的法律纠纷&#xff0c;与本人无…

中兴B860AV2.1U,联通版本,强刷固件线刷包

中国联通版本中兴B860AV2.1U强刷当贝桌面固件线刷包 固件介绍&#xff1a; 1、调出原厂固件屏蔽的wifi&#xff0c;开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 2、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xff1b;修改dns&#xff0c;三…

中兴b860刷机运行Linux,整理 B860A 刷机,安装第三方,升降固件,进recovery

最近改了一个盒子,整理一些资料给有用的人,不设回复可见,设了回复都是灌水的,就没有人进行交流,修正…… 第一步拿到盒子,就看能不能改服务器网址,能改先改了,别联网了,给你升级了…… =====================下面是收集整理================================ 首先安装…

中兴盒子B860AV2.1-A-B-M-U,通刷,线刷刷机固件

中兴盒子B860AV2.1-A-B-M-U&#xff0c;通刷&#xff0c;线刷刷机固件 固件介绍&#xff1a; 1、调出原厂固件屏蔽的wifi&#xff0c;开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 2、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xff1b;修改…

中兴B860AV2.1、1.1T、2.1-A-M-T,通刷线刷固件及教程

中兴B860AV2.1、1.1T、2.1-A、M、T刷机固件_芯片S905L-线刷-通刷固件及教程 说明&#xff1a; 本固件为中兴B860AV2.1、B860AV1.1T、B860AV2.1-A、2.1-M、2.1-T(非高安版&#xff09;的线刷固件&#xff0c;nand、emmc闪存通刷。 固件特点&#xff1a; 1、采用官方系统核…

中兴B863AV3.2-M_安卓9.0系统_线刷包及教程

中兴B863AV3.2-M_安卓9.0系统_线刷包及教程 固件介绍&#xff1a; 此版本分2种主控&#xff0c;一种的s905l3a,另外一种是s905l3a-b。 1、调出原厂固件屏蔽的wifi&#xff0c;开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 2、无开机广告&#xff0c;无系统更新&…

中兴B860AV2.1-T非高安 /高安版本-通用线刷固件及教程

中兴B860AV2.1-T非高安 /高安版本-通用线刷固件及教程 固件特点&#xff1a; 1、调出原厂固件屏蔽的wifi&#xff0c;开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 2、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xff1b;修改dns&#xff0c;…

中兴盒子B860AV1.1、2.1-A_M_T、2.1_1.1-T、2.1_905L系列刷机包及教程

中兴盒子B860AV1.1、2.1-A_M_T、2.1_1.1-T、2.1_905L系列刷机包及教程 中兴B860AV2.1-A_M_T线刷固件 中兴B860AV2.1_1.1-T-android4.42 中兴B860AV2.1_905L-安卓4.4.2 中兴B860AV1.1自动刷机版 等等版本 固件特点&#xff1a; 1、调出原厂固件屏蔽的wifi&#xff0c;开…

好网角怎么发帖?文章发不出去怎么解决?

好网角怎么发帖&#xff1f;文章发不出去怎么解决&#xff1f;如何在网上发帖子&#xff1f;在网上发帖子#科技#电脑#网络#方法 N 如何在网上发帖子&#xff1f; 试用系统 windows 7 首先打开电脑中的任意浏览器&#xff0c;进入之后打开百度网站&#xff0c;点击右上角的登录…

高频面试八股文用法篇(六) 说说反射及其作用

目录 什么是反射&#xff1f; 反射的作用 反射的优缺点 反射的用途 什么是反射&#xff1f; 动态语言。 当程序运行时&#xff0c;允许改变程序结构或变量类型&#xff0c;这种语言称为动态语言。Java 并不是动态语言&#xff0c;但是它却又一个非常突出的动态相关的机制&am…