最近学校课程要求使用spring操作数据库,时间有点久了,操作都不太熟悉了,遇到了很多坑,特此记录一下。
导入依赖
<!-- Spring Framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10.RELEASE</version> <!-- 请根据实际情况选择合适的版本 -->
</dependency>
<!-- Spring Test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.10.RELEASE</version> <!-- 请根据实际情况选择合适的版本 -->
<scope>test</scope>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version> <!-- 请根据实际情况选择合适的版本 -->
<scope>test</scope>
</dependency>
<!-- MySQL Connector/J -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version> <!-- 请根据实际情况选择合适的版本 -->
</dependency>
编写配置类
- 使用Configuration注解注明这是一个配置类
- @ComponentScan("com.javaweb"):用于告诉Spring在指定的包及其子包中,扫描组件(比如带有
@Component
、@Service
、@Repository
、@Controller
等注解的类),并将其注册为 Spring 管理的 Bean。 - @EnableTransactionManagement:用于启用注解驱动的事务管理
@Configuration
@ComponentScan("com.javaweb")
@EnableTransactionManagement
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/javaweb-course");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
编写测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {DatabaseConfig.class})
public class MyTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void testSelectCount(){
Integer integer = jdbcTemplate.queryForObject("select count(*) from user", Integer.class);
System.out.println("the count of user is " + integer);
}
}
-
@RunWith(SpringJUnit4ClassRunner.class):是JUnit框架中的注解,用于指定测试运行器。在这里,它告诉JUnit使用 Spring 提供的测试运行器来执行测试。
在Spring应用程序中进行单元测试时,通常需要加载和配置 Spring 的应用上下文(ApplicationContext)。SpringJUnit4ClassRunner 是 Spring 提供的一个测试运行器,它负责在测试开始之前初始化 Spring 的上下文,以便你的测试类能够使用 Spring 托管的 bean。
有以下几个作用:
1. Spring 上下文初始化: 通过此注解,JUnit 将使用 SpringJUnit4ClassRunner 类来启动 Spring 的上下文,确保你的测试类能够访问应用程序中定义的 bean。
2. 依赖注入:通过上下文初始化,你可以使用 `@Autowired` 或其他 Spring 的依赖注入机制,将 Spring 管理的 bean 注入到测试类中。
3. 事务管理:SpringJUnit4ClassRunner 还提供了对事务的支持。默认情况下,它会在测试方法执行前开启事务,在测试方法执行后回滚事务,以确保测试方法不会修改数据库状态。
如果不使用该注解,则Spring就会出现空指针异常,即无法注入bean对象
2.@ContextConfiguration(classes = {DatabaseConfig.class})是 Spring Test 框架的注解,用于指定加载 Spring 配置的类。在这个特定的例子中,`DatabaseConfig.class` 是用于配置数据库相关的 Spring Bean 的配置类。
作用是告诉 Spring Test 在运行测试时加载哪个配置类来构建应用程序上下文(ApplicationContext)。在这里,DatabaseConfig.class包含了数据库相关的配置信息,例如数据源、`JdbcTemplate` 等。
解析这个注解的参数:
- classes = {DatabaseConfig.class}: 指定配置类,即包含了数据库相关配置的类。
通过在测试中使用 @ContextConfiguration,可以确保在测试执行过程中创建了与实际运行应用程序时相同的应用程序上下文。这有助于确保测试环境与实际环境的一致性,特别是当涉及到数据库或其他外部依赖时。
如果不使用该注解,则会出现无法加载应用程序的上下文