Spring整合MyBatis 是将Spring和MyBatis应用到一个项目中
MyBatis 提供数据库相关的操作,完成对象数据和关系数据的转换
Spring完成项目的管理,通过IOC和AOP完成依赖注入,事务管理等操作
org.springframework
spring-context
5.3.26
org.mybatis
mybatis
3.5.9
org.mybatis
mybatis-typehandlers-jsr310
1.0.2
mysql
mysql-connector-java
8.0.30
org.mybatis
mybatis-spring
2.0.7
org.springframework
spring-tx
5.3.26
org.springframework
spring-jdbc
5.3.26
com.alibaba
druid
1.2.9
org.junit.jupiter
junit-jupiter-api
5.9.0
test
org.springframework
spring-test
5.3.26
test
public class StudentBean {
private Integer id;
private String name;
private String gender;
private LocalDate birthday;
private String tel;
private Double grade;
}
public interface IStudentService {
List findAll();
void add(StudentBean studentBean);
}
@Mapper //表示mapper接口
public interface IStudentMapper {
List findAll();
void add(StudentBean studentBean);
}
1.mybatis主配置文件
2.mapper文件
@Configuration
@ComponentScan("com.project")
@MapperScan("com.project.mapper")
@EnableTransactionManagement
public class MyBatisConfig {
@Bean
public DataSource getDataSource(){
//连接池对象 获取连接
DruidDataSource dataSource = new DruidDataSource();
//连接驱动
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf8&allowMultiQueries=true");
dataSource.setUsername("root");
dataSource.setPassword("0618");
//连接数量
dataSource.setMaxActive(100);
dataSource.setMinIdle(10);
// 设置 最大连接等待时间 超过时间 返回null
dataSource.setMaxWait(2000);
return dataSource;
}
@Bean
public SqlSessionFactoryBean getFactory(){
//得到会话工厂
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//获取数据源
factoryBean.setDataSource(this.getDataSource());
//加载mybatis主配置文件
factoryBean.setConfigLocation(new ClassPathResource("mybatis.cfg.xml"));
return factoryBean;
}
@Bean
public TransactionManager transactionManager(DataSource data){
DataSourceTransactionManager manager = new DataSourceTransactionManager();
manager.setDataSource(data);
return manager;
}
}
@Configuration 标识该类为配置类
@ComponentScan("com.project") 扫描指定包及子包中 带spring注解的组件,如(@Component、@Service、@Controller、@Repository ),并将它们自动注册为 Spring Bean【但不能扫描接口】
@MapperScan("com.project.mapper")
Mapper 接口不能被 @ComponentScan 扫描到并注册为 Spring Bean。如果要让 Mapper 接口成为 Spring Bean,需要使用 @Mapper 注解标记该接口,然后在 Spring 配置类中使用 @MapperScan 注解扫描 Mapper 接口所在的包,将其注册为 Spring Bean。这样,在应用程序中就可以使用 @Autowired 注解将 Mapper 接口注入到其他组件中使用。
@EnableTransactionManagement 提供事务支持
在一个 Spring 应用程序中,如果需要对一些操作进行事务管理,就需要使用 @Transactional 注解来标记需要进行事务管理的方法。但是,仅仅使用 @Transactional 注解是不够的,还需要使用 @EnableTransactionManagement 注解来开启 Spring 的事务管理器功能。
@EnableTransactionManagement 注解告诉 Spring 启动事务管理器,并将其应用到带有 @Transactional 注解的方法上
@Bean
在 Spring 中,@Bean 注解用于声明一个方法返回一个 bean 实例。在配置类中使用 @Bean 注解声明一个方法时,Spring 容器会在初始化时调用该方法,并将方法返回的对象添加到容器中作为一个 bean。
获取 Druid 数据源,并使用 @Bean 注解将其声明为 Spring 组件。
在该方法中,首先创建一个 DruidDataSource 对象,并设置了连接字符串、用户名、密码、连接池大小等参数。然后,将该数据源对象返回。
由于使用了 @Bean 注解,该方法返回的数据源对象将被 Spring 容器管理,并可以在其他组件中使用 @Autowired 注解注入该数据源对象,从而使用该数据源对象来创建 JDBC 连接对象,访问数据库。
获取 MyBatis 的 SqlSessionFactoryBean 工厂的方法,并使用 @Bean 注解将其声明为 Spring 组件。
在该方法中,首先创建了一个 SqlSessionFactoryBean 工厂对象,并设置了数据源和 MyBatis 主配置文件的位置。
通过调用 this.getDataSource() 方法获取数据源对象,并将其设置到 SqlSessionFactoryBean 工厂中。然后,通过调用 factoryBean.setConfigLocation 方法设置 MyBatis 主配置文件的位置,这里是使用 ClassPathResource 加载类路径下的 mybatis.cfg.xml 文件。最后,将该工厂对象返回。
由于使用了 @Bean 注解,该方法返回的 SqlSessionFactoryBean 工厂对象将被 Spring 容器管理,并可以在其他组件中使用 @Autowired 注解注入该对象,从而使用该对象来创建 MyBatis 的 SqlSession 对象,访问数据库。
获取事务管理器 DataSourceTransactionManager 的方法,并使用 @Bean 注解将其声明为 Spring 组件。
在该方法中,需要传入一个数据源对象,该数据源对象可以通过 @Autowired 注解注入到该方法中。
在方法中,首先创建了一个 DataSourceTransactionManager 对象,并使用传入的数据源对象设置其数据源属性。然后,将该事务管理器对象返回。
由于使用了 @Bean 注解,该方法返回的事务管理器对象将被 Spring 容器管理,并可以在其他组件中使用 @Autowired 注解注入该对象,从而使用该对象来管理事务,保证事务的一致性和完整性。
@Service //扫描 业务
@Transactional // 实现类的所有方法 都支持事务管理
public class StudentServiceImp implements IStudentService {
@Autowired //通过该注解 将 IStudentMapper 接口的实例注入到该类中
private IStudentMapper mapper;
@Override
public List findAll() {
return mapper.findAll();
}
public void add(StudentBean studentBean) {
mapper.add(studentBean);
}
}
@Autowired
它可以自动地将一个对象注入到另一个对象中,从而完成依赖注入。
当一个类中的某个属性被标记为@Autowired时,Spring框架会自动查找匹配的对象,并将其注入到该属性中。这样,我们就不需要手动创建对象了,Spring框架会自动帮我们完成依赖注入。
@ExtendWith(SpringExtension.class)// JUnit 5 的注解
@ContextConfiguration(classes = MyBatisConfig.class)//加载配置类
public class MyTest {
@Autowired //通过该注解将 IStudentService 接口的实例注入到该测试类中,从而可以使用该接口中定义的方法进行测试。
private IStudentService service;
@Test
public void MyTest(){
StudentBean stu = new StudentBean("BroRiver","男", LocalDate.parse("2000-05-20"),"1335061",90.5);
service.add(stu);
System.out.println(service.findAll());
}
}
@ContextConfiguration
它的作用是加载 MyBatisConfig 类,该类中包含了 MyBatis 和 Spring 的整合配置信息,比如:
将 MyBatis 的配置文件和 mapper 接口的 XML 文件注入到 Spring 容器中,以便 MyBatis 能够访问和使用这些文件。
将 MyBatis 的 mapper 接口和 Spring 的 bean 进行关联,使得 MyBatis 能够在运行时调用 mapper 接口的方法,从而实现对数据库的访问。
配置 MyBatis 与 Spring 的整合,使得 MyBatis 能够通过 Spring 的事务管理器来管理事务,从而保证数据库操作的一致性和完整性。