Spring+MyBatis整合案例

news2025/1/6 19:16:55

提示:要有自学能力,会学习

文章目录

  • 前言
  • 前期准备
  • 项目内容
    • 数据库创建
    • 应用程序配置
    • po 包代码
    • mapper 包代码
    • service 包代码
    • 测试类代码
    • 添加事物处理功能


前言

提示:这里可以添加本文要记录的大概内容:

前期准备

第一步:新建项目Maven项目
在这里插入图片描述
在下一步中勾选第一个选项,创建一个简单的项目,最后填写相关信息后完成
在这里插入图片描述
第二步:完善 pom.xml 文件

项目建成后在 pom.xml 文件中导入相关代码,比如:

缺什么加什么

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- 此依赖会关联引用Spring中的所有基础jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.15</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
 <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    <!-- mybatis-spring 依赖包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.0</version>
    </dependency>
    </dependencies>

第三步:配置 main/resources 文件夹

log4j.properties配置文件,可以显示 log 输出

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
log4j.rootLogger=debug,stdout

提示:以下是本篇文章正文内容,下面案例可供参考

项目内容

数据库创建

CREATE TABLE worker
(
	id int PRIMARY KEY auto_increment,
	name VARCHAR(20),
	sex CHAR(1),
	age int,
	workShop VARCHAR(10)  # 车间
);

应用程序配置

在src/main/java 文件夹下新建包 com.sm,然后再新建config、mapper、po、service包

把下面的 ApplicationConfig 类代码复制到 config 包下

package com.sm.config;

import java.io.IOException;

import javax.sql.DataSource;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration  //声明该类是核心配置类   
// 包名被改变时,这里对应的也要改(mapper包名)                      
@MapperScan("com.sm.mapper")  
@EnableTransactionManagement
public class ApplicationConfig {
	@Bean  
    public DataSource dataSource(){
		 DriverManagerDataSource cd = new DriverManagerDataSource();
		 cd.setDriverClassName("com.mysql.cj.jdbc.Driver");
		 cd.setUrl("jdbc:mysql://localhost:3306/sm?characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
		 cd.setUsername("root");
		 cd.setPassword("123456");
		 return cd;
    }
    
	@Bean
	public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource ds) throws IOException {
	 SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
	 bean.setDataSource(ds);//配置数据源
	 // 包名被改变时,这里对应的也要改(po包名)
	 bean.setTypeAliasesPackage("com.sm.po");//设置实体类别名
	 return bean;
	}
	
    //配置事务管理器
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager dtm = new DataSourceTransactionManager();
        dtm.setDataSource(dataSource);
        return dtm;
    }

}

po 包代码

public class Worker {
	private Integer id;
	private String  name;
	private String  sex;
	private Integer age;
	private String  workShop;
	// 自动生成 Getter、Setter、toString()、有参无参方法
}

mapper 包代码

@Mapper
public interface WorkerMapper {
	// id是自增的
	@Insert("insert into worker (name,sex,age,workShop) values (#{name},#{sex},#{age},#{workShop})")
	int insertWorker(Worker worker);
//	SQL语句比较简单所以写在注解里
	@Delete("delete from worker where id = #{id}")
	int deleteWorker(int id);
	
	@Update("update worker set name = #{name}, sex = #{sex}, age = #{age}, workShop = #{workShop} where id = #{id}")
	int updateWorker(Worker worker);
	// 做项目查询所有时,一个个写出来
	@Select("select * from worker")
	List<Worker> queryWorkers();
	
}

service 包代码

在service 包下新建接口及其对应的实现类+Impl

接口代码中的方法:

public interface WorkerService {
// 增删改是字符串
	String insert(Worker worker);
	String delete(int id);
	String update(Worker worker);
	List<Worker> queryWorkers();
}

实现类代码:

@Service
public class WorkerServiceImpl implements WorkerService{
	// 增加依赖注入的注解
	@Autowired
	// 依赖关系,service依赖mapper
	public WorkerMapper mapper;
	
	@Override
	public String insert(Worker worker) {
		// 添加未实现的方法
		return mapper.insertWorker(worker)>0?"增加成功":"增加失败";
	}

	@Override
	public String delete(int id) {
		// TODO 自动生成的方法存根
		return mapper.deleteWorker(id)>0?"删除成功":"删除失败";
	}

	@Override
	public String update(Worker worker) {
		// TODO 自动生成的方法存根
		return mapper.updateWorker(worker)>0?"修改成功":"修改失败";
	}

	@Override
	public List<Worker> queryWorkers() {
		// TODO 自动生成的方法存根
		return mapper.queryWorkers();
	}

}

测试类代码

package com.sm;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppTestSM
{
	ApplicationContext context = null;
	@Before
	public void before() throws Exception {
		// 当包名改变时,这里对应的包名也要改
		context = new  AnnotationConfigApplicationContext("com.sm");
	}
	@Test 
	public void test() {
		
				
	}
		
}

添加测试:

	@Test 
	public void test() {
		WorkerService service = context.getBean(WorkerService.class);
		Worker worker = new Worker(null, "张三", "男", 21, "检查车间");
		
		System.out.println(service.insert(worker));
	}

测试成功,整合OK
在这里插入图片描述

修改测试:

	@Test 
	public void test() {
		WorkerService service = context.getBean(WorkerService.class);
		Worker worker = new Worker(1,"李四","女", 31, "装配车间");
		System.out.println(service.update(worker));
	}

在这里插入图片描述
删除测试:

	@Test
	public void test() {
		WorkerService service = context.getBean(WorkerService.class);
		System.out.println(service.delete(1));
	}

在这里插入图片描述
回到数据库发现一号数据被删除

查询测试:

	@Test
	public void test() {
		WorkerService service = context.getBean(WorkerService.class);
		List<Worker> list = service.queryWorkers();
		//foreach循环
		for (Worker worker2 : list) {
			System.out.println(worker2);
		}
	}

数据与数据库对应
在这里插入图片描述

添加事物处理功能

在 service 里面调用很多 mapper 时需要加上事务,保证操作的一致性,只要一个环节出问题就会滚

在 ServiceImpl 实现类中修改删除功能

	// 事物处理
	@Override
	public String delete(int id) {
		// TODO 自动生成的方法存根
		String result = mapper.deleteWorker(id)>0?"删除成功":"删除失败";
		// 模拟异常
		int i = 10/0;
		return result;
	}

代码先运行mapper。delete方法,判断删除成功或失败,再出异常,没有事务管理的话判断会自动提交,即使下一行出异常也提交了

回到测试代码测试删除:删除数据库中一条存在的数据
请添加图片描述
事务处理只需要在方法上加一个注解:@Transactional

	// 事物处理
	@Override
	// 只要异常发生就会滚
	@Transactional(rollbackFor = Exception.class)
	public String delete(int id) {
		// TODO 自动生成的方法存根
		String result = mapper.deleteWorker(id)>0?"删除成功":"删除失败";
		// 模拟异常
		int i = 10/0;
		return result;
	}

再回到测试类中测试删除:删除数据库中一条存在的数据
请添加图片描述

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

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

相关文章

[CSS] 图片九宫格

效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"/><meta name"viewport" content"widthdevice-…

vscode自动补全(智能提示)大小写问题

最近发现vscode的自动补全有时候显示的不是想要的&#xff0c;具体表现为&#xff1a;我输入了几个字母&#xff0c;但是提示列表里面没有我需要的内容。 例如&#xff1a; 我输入了list&#xff0c;但是没有显示java.util中的List&#xff1b; 或者我输入了hashmap&#xf…

海外媒体发稿:软文写作方法方式?一篇好的软文理应合理规划?

不同种类的软文会有不同的方式&#xff0c;下面小编就来来给大家分析一下&#xff1a; 方法一、要选定文章的突破点&#xff1a; 所说突破点就是这篇文章文章软文理应以什么样的视角、什么样的见解、什么样的语言设计理念、如何文章文章的标题来写。不同种类的传播效果&#…

Apache+Tomcat 整合

目录 方式一&#xff1a;JK 1、下载安装包 2、添加依赖 3、启动服务&#xff0c;检查端口是否监听 4、提供apxs命令 5、检查是否确实依赖 6、编译安装 7、重要配置文件 方式二&#xff1a;http_proxy 方式三&#xff1a;ajp_proxy 方式一&#xff1a;JK 1、下载安装…

Vulnhub: ColddWorld: Immersion靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.183 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.183 查看login的源码发现提示&#xff1a;page和文件/var/carls.txt 漏洞利用 wfuzz探测account.php页面发现文件包含&am…

前端笔记html-layer使用

layer.open方法 layer.open({type:2, //可传入的值有&#xff1a;0&#xff08;信息框&#xff0c;默认&#xff09;1&#xff08;页面层&#xff09;2&#xff08;iframe层&#xff09;3&#xff08;加载层&#xff09;4&#xff08;tips层&#xff09;title: title,content:[…

高抗干扰LCD液晶屏驱动芯片,低功耗的特性适用于水电气表以及工控仪表类产品

VK2C23是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大224点&#xff08;56SEGx4COM&#xff09;或者最大416点&#xff08;52SEGx8COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#xff0c;也可通过指令进入省电模式。其高抗干扰&#xff…

怎么进行流程图制作?用这个工具制作很方便

怎么进行流程图制作&#xff1f;流程图是一种非常有用的工具&#xff0c;可以帮助我们更好地理解和展示各种复杂的业务流程和工作流程。它可以将复杂的过程简化为易于理解的图形和文本&#xff0c;使得人们更容易理解和跟踪整个流程。因此&#xff0c;制作流程图是在日常工作中…

用低代码构建高效敏捷工作流

随着行业业务发展及业务流程诉求的增长&#xff0c;企业信息资源越来越表现出一种异构分布、松散耦合的特点。实现大规模、异构、分布式执行环境&#xff0c;使得相互关联的任务能够高效运转成为了业务管理的强诉求。以事件驱动和数据驱动来进行应用系统构建也就变得更加实效。…

UE中低延时播放RTSP监控视频解决方案

第1章 方案简介 1.1 行业痛点 在各种智慧城市、智慧社区、智慧水利、智慧矿山等数字孪生项目中&#xff0c;经常使用通UE来开发三维可视化场景。在这些场景中通常都需要把现场的各种监控视频在UE的可视化场景中接入&#xff0c;主要包含海康威视、大华、宇视、华为等众多监控…

SpringBoot实现文件记录日志,日志文件自动归档和压缩

&#x1f60a; 作者&#xff1a; Eric &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_47316183?typeblog &#x1f389; 主题&#xff1a;SpringBoot实现文件记录日志&#xff0c;日志文件自动归档和压缩 ⏱️ 创作时间&#xff1a; 2023年08月06日 文章目…

[webpack] 基本配置 (一)

文章目录 1.基本介绍2.功能介绍3.简单使用3.1 文件目录和内容3.2 下载依赖3.3 启动webpack 4.基本配置4.1 五大核心概念4.2 基本使用 1.基本介绍 Webpack 是一个静态资源打包工具。它会以一个或多个文件作为打包的入口, 将我们整个项目所有文件编译组合成一个或多个文件输出出去…

ad+硬件每日学习十个知识点(23)23.8.3(LDO 设计实例)(涉及到自控没听懂,学完自控再回来看)

文章目录 1.输入电容的选取&#xff08;两个&#xff0c;一个大电容&#xff0c;一个小电容&#xff09;2.输出电容的选取&#xff08;两个&#xff0c;一个大电容&#xff0c;一个小电容&#xff09;3.有些LDO需要输出的最小负载电流&#xff0c;所以需要接一个下拉电阻。4. 1…

使用TransBigData快速高效地处理、分析、挖掘出租车GPS数据

01、TransBigData简介 TransBigData是一个为交通时空大数据处理、分析和可视化而开发的Python包。TransBigData为处理常见的交通时空大数据&#xff08;如出租车GPS数据、共享单车数据和公交车GPS数据等&#xff09;提供了快速而简洁的方法。TransBigData为交通时空大数据分析的…

JavaScript的对象+内置对象(Math+Date日期+数组+字符串)

一.创建对象 对象是由属性和方法组成的 创建对象的三种方法: 1.利用字面量创建对象 var obj{uname : 张三疯 ,age : 18 ,sex : 男 ,sayHi : function(){console.log(hi~);}} 里面的属性或者方法采用键值对的形式多个属性或者方法用逗号隔开方法冒号后面跟的是一个匿名…

第四次作业 运维高级 构建 LVS-DR 群集和配置nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 LVS-DR模式工作原理 首先&#xff0c;来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将请求发送到集群节点或真实服务器。然后&#xff0c;集群某个节点将回复该数据包&#xff0c;并将该数据包…

如何创建51单片机KEIL工程

如何创建51单片机KEIL工程步骤&#xff1a; &#xff08;1&#xff09;打开keil软件&#xff0c;点击工具栏-Project&#xff0c;选择创建新的工程&#xff1b; &#xff08;2&#xff09;然后给工程命名&#xff0c;文章以project为例&#xff0c;然后点击保存 &#xff08…

ubuntu 暂时不能解析域名 解决办法

需要修改系统DNS 打开终端&#xff1a;输入 sudo vi /etc/resolv.conf 回车 在打开的配置文件中添加DNS信息 nameserver 114.114.114.114 nameserver 8.8.8.8 保存退出&#xff0c;重启系统即可。

一、MySql前置知识

文章目录 一、什么是数据库&#xff08;一&#xff09;存储数据用文件就可以了&#xff0c;为什么还要弄个数据库?&#xff08;二&#xff09;数据库存储介质&#xff1a;&#xff08;三&#xff09;主流数据库 二、数据库基本操作&#xff08;一&#xff09;连接服务器&#…

ArcGIS在洪水灾害普查、风险评估及淹没制图中应用教程

详情点击链接&#xff1a;ArcGIS在洪水灾害普查、风险评估及淹没制图中应用教程 一&#xff1a;洪水普查技术规范 1.1 全国水旱灾害风险普查实施方案 1.2 洪水风险区划及防治区划编制技术要求 1.3 山丘区中小河流洪水淹没图编制技术要求 二&#xff1a;ArcGIS及数据管理 …