Spring+MyBatis整合案例

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

文章目录

  • 前言
  • 前期准备
  • 项目内容
    • 数据库创建
    • 应用程序配置
    • 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;
	}

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

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

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

相关文章

pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的&#xff0c;即多个样本输入后获取的是一个均值标量&#xff0c;而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…

[oeasy]python0082_[趣味拓展]控制序列_清屏_控制输出位置_2J

光标位置 回忆上次内容 上次了解了键盘演化的过程 ESC 从 组合键到 独立按键 ESC的作用 是 进入 控制序列配置 控制信息控制信息 \033[y;xH 设置光标位置\033[2J 清屏 这到底怎么控制&#xff1f;&#xff1f;&#xff1f;&#x1f914;谁来实现这些功能&#xff1f; 控制…

ensp与虚拟机搭建测试环境

1.虚拟机配置 ①首先确定VMnet8 IP地址&#xff0c;若要修改IP地址&#xff0c;保证在启动Ensp前操作 ②尽量保证NAT模式 2.ensp配置 (1)拓扑结构 (2)Cloud配置 ①首先点击 绑定信息 UDP → 增加 ②然后点击 绑定信息 VMware ... → 增加 ③最后在 端口映射设置上点击双向通…

[oeasy]python0081_[趣味拓展]ESC键进化历史_键盘演化过程_ANSI_控制序列_转义序列_CSI

光标位置 回忆上次内容 上次了解了 新的转义模式 \033 逃逸控制字符 escape 这个字符 让字符串 退出标准输出流进行控制信息的设置 可以设置 光标输出的位置 ASR33中的ALT MODE 是 今天的ESC键吗&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#x1f914; 查询文档…

Ajax入门

文章目录 axios体验axios-查询参数常用请求方法数据提交 axios错误处理 axios体验 引入axios库 使用axios语法 axios({url: 目标资源地址 }).then((result)>{// 对服务器返回的数据做后续处理 })完整实例 <!DOCTYPE html> <html lang"en"><head&g…

eclipse Java Code_Style Code_Templates

Preferences - Java - Code Style - Code Templates Eclipse [Java_Code_Style_Code_Templates_ZengWenFeng] 2023.08.07.xml 创建一个新的工程&#xff0c;不然有时候不生效&#xff0c;旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了

在java中如何使用openOffice进行格式转换,word,excel,ppt,pdf互相转换

1.首先需要下载并安装openOffice,下载地址为&#xff1a; Apache OpenOffice download | SourceForge.net 2.安装后&#xff0c;可以测试下是否可用&#xff1b; 3.build.gradle中引入依赖&#xff1a; implementation group: com.artofsolving, name: jodconverter, version:…

使用 API Gateway Integrator 在 Quarkus 中实施适用于 AWS Lambda 的 OpenAPI

AWS API Gateway 集成使得使用符合 OpenAPI 标准的 Lambda Function 轻松实现 REST API。 关于开放API 它是一个 允许以标准方式描述 REST API 的规范。 OpenAPI规范 (OAS) 为 REST API 定义了与编程语言无关的标准接口描述。这使得人类和计算机都可以发现和理解服务的功能&am…

STM32 LoRa源码解读

目录结构&#xff1a; SX1278 |-- include | |-- fifo.h | |-- lora.h | |-- platform.h | |-- radio.h | |-- spi.h | |-- sx1276.h | |-- sx1276Fsk.h | |-- sx1276FskMisc.h | |-- sx1276Hal.h | |-- sx1276LoRa.h | -- sx1276LoRaMisc.h – src |-- fifo.c |-- lora.c |-- …

0140 数据链路层2

目录 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 1.如果使用5类UTP来设计一个覆盖范围为200m的10BASE-T以太网&#xff0c;需要采用的设备是&#xff08;&#xff09; A.放大器 …

idea导入新项目报异常:Error:java: Compilation failed: internal java compiler error

修改settings中项目对象Java编译配置恢复正常。 标记的两个地方配置修改和项目一样后&#xff0c;正常。

OpenSource - 分布式重试平台

文章目录 概述重试方案对比设计思想流量管理平台预览场景应用强通知场景发送MQ场景回调场景异步场景 概述 在当前广泛流行的分布式系统中&#xff0c;确保系统数据的一致性和正确性是一项重大挑战。为了解决分布式事务问题&#xff0c;涌现了许多理论和业务实践&#xff0c;其…

AJAX-笔记(持续更新中)

文章目录 Day1 Ajax入门1.AJAX概念和axios的使用2. 认识URL3.URL的查询参数4.常用的请求方法和数据提交5.HTTP协议-报文6.接口文档7.form-serialize插件8.案例用户登录 Day2 Ajax综合案bootstrap弹框图书管理图片上传更换背景个人信息设置 Day3 AJAX原理XMLHttpRequestPromise封…

Idea全局搜索(ctrl+shift+F),搜索不全问题

今天idea突然出现&#xff0c;全局搜索&#xff0c;命名html文件中有这个字符&#xff0c;但是全局搜索居然匹配内容是空。。。。而且全局搜索界面也设置好了 经查发现是缓存问题&#xff0c;于是&#xff1a; 清空缓存后发现全局搜索功能可正常使用...

[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

1.今天开发了一套服务程序&#xff0c;使用的是Odbc连接MySql数据库&#xff0c; 在我本机用VS打开程序时&#xff0c;访问一切正常&#xff0c;当发布出来装在电脑上&#xff0c;连接数据库时提示&#xff1a; [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定…

uniapp 微信小程序 上下滚动的公告通知(只取前3条)

效果图&#xff1a; <template><view class"notice" click"policyInformation"><view class"notice-icon"><image mode"aspectFit" class"img" src"/static/img/megaphone.png"></i…

计算机网络的定义和分类

计算机网络的定义和分类 计算机网络的定义 计算机网络的精确定义并未统一计算机网络最简单的定义是&#xff1a;一些互相连接的、自治的计算机的集合 互连:指计算机之间可以通过有线或无线的方式进行数据通信自治:是指独立的计算机&#xff0c;它有自己的硬件和软件&#xff…

【深度学习_TensorFlow】手写数字识别

写在前面 到这里为止&#xff0c;我们已经学习完张量的常用操作方法&#xff0c;已具备实现大部分神经网络技术的基础储备了。这一章节我们将开启神经网络的学习&#xff0c;然而并不需要像学习前面那样了解大量的张量操作&#xff0c;而是将重点转向理解概念知识&#xff0c;…

Mysql进阶(中) -- 索引

索引上部分 -> Mysql进阶(上) -- 存储引擎&#xff0c;索引_千帐灯无此声的博客-CSDN博客 &#x1f442; 爸爸妈妈 - 王蓉 - 单曲 - 网易云音乐 &#x1f448;目录看左栏 目录 &#x1f33c;索引 &#x1f43b;性能分析 - show profiles &#x1f43b;性能分析 - exp…

关于自动化测试用例失败重试的一些思考

自动化测试用例失败重跑有助于提高自动化用例的稳定性&#xff0c;那我们来看一下&#xff0c;python和java生态里都有哪些具体做法&#xff1f; 怎么做 如果是在python生态里&#xff0c;用pytest做测试驱动&#xff0c;那么可以通过pytest的插件pytest-rerunfailures来实现…