Spring+MyBatis整合案例

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


前言

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

增加依赖注入的注解:@Autowired

前期准备

第一步:新建项目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;
	}

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

猜你喜欢

转载自blog.csdn.net/rej177/article/details/132130720