SpringBoot整合Junit与Mybatis

1. SpringBoot整合Junit

回顾 Spring 整合 junit

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {
    
    @Autowired
    private BookService bookService;
    
    @Test
    public void testSave(){
        bookService.save();
    }
}

使用 @RunWith 注解指定运行器,使用 @ContextConfiguration 注解来指定配置类或者配置文件。而 SpringBoot 整合 junit 特别简单,分为以下三步完成

  • 在测试类上添加 SpringBootTest 注解
  • 使用 @Autowired 注入要测试的资源
  • 定义测试方法进行测试

1.1 环境准备

创建一个名为 springboot_04_junitSpringBoot 工程,工程目录结构如下

SpringBoot整合Junit与Mybatis_第1张图片

com.dcxuexi.service 下创建 UserService 接口,内容如下

public interface UserService {
    public  void  findAll();
}

com.dcxuexi.service.impl 包写创建一个 UserServiceImpl 类,使其实现 UserService 接口,内容如下

@Service
public class UserServiceImpl implements UserService {
    
    @Override
    public void findAll() {
        System.out.println("UserServiceImpl findAll, running ......");
    }
    
}

1.2 编写测试类

test/java 下创建 com.dcxuexi 包,在该包下创建测试类,将 UserService 注入到该测试类中

@SpringBootTest
class Springboot04JunitApplicationTests {

	@Autowired
	private UserService userService;

	@Test
	void contextLoads() {
		userService.findAll();
	}

}

运行测试方法:

SpringBoot整合Junit与Mybatis_第2张图片

注意: 这里的引导类所在包必须是测试类所在包及其子包。

例如:

  • 引导类所在包是 com.dcxuexi
  • 测试类所在包是 com.dcxuexi

如果不满足这个要求的话,就需要在使用 @SpringBootTest 注解时,使用 classes 属性指定引导类的字节码对象。如 @SpringBootTest(classes = Springboot04JunitApplicationTests.class)

2. SpringBoot整合Mybatis

2.1 回顾Spring整合Mybatis

Spring 整合 Mybatis 需要定义很多配置类

  • SpringConfig 配置类

    • 导入 JdbcConfig 配置类

    • 导入 MybatisConfig 配置类

      @Configuration
      @ComponentScan("com.itheima")
      @PropertySource("classpath:jdbc.properties")
      @Import({JdbcConfig.class,MyBatisConfig.class})
      public class SpringConfig {
      }
      
      
  • JdbcConfig 配置类

    • 定义数据源(加载properties配置项:driver、url、username、password)

      public class JdbcConfig {
          @Value("${jdbc.driver}")
          private String driver;
          @Value("${jdbc.url}")
          private String url;
          @Value("${jdbc.username}")
          private String userName;
          @Value("${jdbc.password}")
          private String password;
      
          @Bean
          public DataSource getDataSource(){
              DruidDataSource ds = new DruidDataSource();
              ds.setDriverClassName(driver);
              ds.setUrl(url);
              ds.setUsername(userName);
              ds.setPassword(password);
              return ds;
          }
      }
      
  • MybatisConfig 配置类

    • 定义 SqlSessionFactoryBean

    • 定义映射配置

      @Bean
      public MapperScannerConfigurer getMapperScannerConfigurer(){
          MapperScannerConfigurer msc = new MapperScannerConfigurer();
          msc.setBasePackage("com.dcxuexi.dao");
          return msc;
      }
      
      @Bean
      public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
          SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
          ssfb.setTypeAliasesPackage("com.dcxuexi.domain");
          ssfb.setDataSource(dataSource);
          return ssfb;
      }
      
      

2.2 SpringBoot整合Mybatis

2.2.1 创建模块

  • 创建新模块,选择 Spring Initializr,并配置模块相关基础信息

SpringBoot整合Junit与Mybatis_第3张图片

SpringBoot整合Junit与Mybatis_第4张图片

  • 选择当前模块需要使用的技术集(MyBatis、MySQL)

    SpringBoot整合Junit与Mybatis_第5张图片

2.2.2 定义实体类

com.dcxuexi.domain 包下定义实体类 User,内容如下

public class User {
    private  Integer userId;
    private  String email;
    private  String userName;
    private  String branchName;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getBranchName() {
        return branchName;
    }

    public void setBranchName(String branchName) {
        this.branchName = branchName;
    }

    @Override
    public String toString() {
        return "{" +
                "userId=" + userId +
                ", email='" + email + '\'' +
                ", userName='" + userName + '\'' +
                ", branchName='" + branchName + '\'' +
                '}';
    }
}

2.2.3 定义dao接口

com.dcxuexi.dao 包下定义 UserDao 接口,内容如下

public interface UserDao {

    @Select("select user_id as userId,email,user_name as userName, branch_name as branchNmae from platform_user where user_id = #{userId}")
    public User findByUserId(Integer userId);
    
}

2.2.4 定义测试类

test/java 下定义包 com.dcxuexi ,在该包下测试类,内容如下

@SpringBootTest
class Springboot04MybatisApplicationTests {

	@Autowired
	private UserDao userDao;

	@Test
	void contextLoads() {
		User user = userDao.findByUserId(10);
		System.out.println(user);
	}

}

2.2.5 编写配置

我们代码中并没有指定连接哪儿个数据库,用户名是什么,密码是什么。所以这部分需要在 SpringBoot 的配置文件中进行配合。

application.yml 配置文件中配置如下内容

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis
    username: root
    password: root

2.2.6 测试

运行测试方法,我们会看到如下错误信息

SpringBoot整合Junit与Mybatis_第6张图片

错误信息显示在 Spring 容器中没有 UserDao 类型的 bean。为什么会出现这种情况呢?

原因是 Mybatis 会扫描接口并创建接口的代码对象交给 Spring 管理,但是现在并没有告诉 Mybatis 哪个是 dao 接口。而我们要解决这个问题需要在UserDao 接口上使用 @MapperUserDao 接口改进为

@Mapper
public interface UserDao {

    @Select("select user_id as userId,email,user_name as userName, branch_name as branchName from platform_user where user_id = #{userId}")
    public User findByUserId(Integer userId);

}

注意:

SpringBoot 版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区 jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC,或在MySQL数据库端配置时区解决此问题

2.2.7 使用Druid数据源

现在我们并没有指定数据源,SpringBoot 有默认的数据源,我们也可以指定使用 Druid 数据源,按照以下步骤实现

  • 导入 Druid 依赖

    		<dependency>
    			<groupId>com.alibabagroupId>
    			<artifactId>druidartifactId>
    			<version>1.2.11version>
    		dependency>
    
  • application.yml 配置文件配置

    可以通过 spring.datasource.type 来配置使用什么数据源。配置文件内容可以改进为

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
        username: root
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
    

3. 案例(整合SSM)

我们完成这个案例基本是将之前做的拷贝过来,修改成 SpringBoot 的即可,主要从以下几部分完成

  1. pom.xml

    配置起步依赖,必要的资源坐标(druid)

  2. application.yml

    设置数据源、端口等

  3. 配置类

    全部删除

  4. dao

    设置@Mapper

  5. 测试类

  6. 页面

    放置在resources目录下的static目录中

3.1 创建工程

创建 SpringBoot 工程,在创建工程时需要勾选 webmysqlmybatis,工程目录结构如下

SpringBoot整合Junit与Mybatis_第7张图片

由于我们工程中使用到了 Druid ,所以需要导入 Druid 的坐标

		<dependency>
			<groupId>com.alibabagroupId>
			<artifactId>druidartifactId>
			<version>1.2.11version>
		dependency>

3.2 代码拷贝

springmvc_06_ssm 工程中的 java 代码及测试代码连同包拷贝到 springboot_04_ssm 工程,项目结构如下:

SpringBoot整合Junit与Mybatis_第8张图片

需要修改的内容如下:

  • springmvc_06_ssmconfig 包下的是配置类,而 SpringBoot 工程不需要这些配置类,所以这些可以直接删除

  • dao 包下的接口上在拷贝到 springboot_04_ssm 工程中需要在接口中添加 @Mapper 注解

  • UserServiceTest 测试需要改成 SpringBoot 整合 Junit

    @SpringBootTest
    public class UserServiceTest {
    
        @Autowired
        private UserService userService;
    
        @Test
        public void testGetById(){
            User user = userService.findByUserId(10);
            System.out.println(user);
        }
    
        @Test
        public void testGetAll(){
            List<User> userList = userService.findAll();
            System.out.println(userList);
        }
    }
    

3.3 配置文件

application.yml 配置文件中需要配置如下内容

  • 服务的端口号
  • 连接数据库的信息
  • 数据源
server:
  port: 80

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

3.4 静态资源

SpringBoot 程序中是没有 webapp 目录的,那么在 SpringBoot 程序中静态资源需要放在什么位置呢?

静态资源需要放在 resources 下的 static 下,如下图所示

SpringBoot整合Junit与Mybatis_第9张图片


项目代码

  • gitee 代码下载

  • github 代码下载

你可能感兴趣的:(SpringBoot,mybatis,spring,boot,junit,java,maven)