回顾 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
注入要测试的资源创建一个名为 springboot_04_junit
的 SpringBoot
工程,工程目录结构如下
在 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 ......");
}
}
在 test/java
下创建 com.dcxuexi
包,在该包下创建测试类,将 UserService
注入到该测试类中
@SpringBootTest
class Springboot04JunitApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
userService.findAll();
}
}
运行测试方法:
注意: 这里的引导类所在包必须是测试类所在包及其子包。
例如:
- 引导类所在包是
com.dcxuexi
- 测试类所在包是
com.dcxuexi
如果不满足这个要求的话,就需要在使用
@SpringBootTest
注解时,使用classes
属性指定引导类的字节码对象。如@SpringBootTest(classes = Springboot04JunitApplicationTests.class)
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;
}
Spring Initializr
,并配置模块相关基础信息在 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 + '\'' +
'}';
}
}
在 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);
}
在 test/java
下定义包 com.dcxuexi
,在该包下测试类,内容如下
@SpringBootTest
class Springboot04MybatisApplicationTests {
@Autowired
private UserDao userDao;
@Test
void contextLoads() {
User user = userDao.findByUserId(10);
System.out.println(user);
}
}
我们代码中并没有指定连接哪儿个数据库,用户名是什么,密码是什么。所以这部分需要在 SpringBoot
的配置文件中进行配合。
在 application.yml
配置文件中配置如下内容
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis
username: root
password: root
运行测试方法,我们会看到如下错误信息
错误信息显示在 Spring
容器中没有 UserDao
类型的 bean
。为什么会出现这种情况呢?
原因是 Mybatis
会扫描接口并创建接口的代码对象交给 Spring
管理,但是现在并没有告诉 Mybatis
哪个是 dao
接口。而我们要解决这个问题需要在UserDao
接口上使用 @Mapper
,UserDao
接口改进为
@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数据库端配置时区解决此问题
现在我们并没有指定数据源,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
我们完成这个案例基本是将之前做的拷贝过来,修改成 SpringBoot
的即可,主要从以下几部分完成
pom.xml
配置起步依赖,必要的资源坐标(druid)
application.yml
设置数据源、端口等
配置类
全部删除
dao
设置@Mapper
测试类
页面
放置在resources目录下的static目录中
创建 SpringBoot
工程,在创建工程时需要勾选 web
、mysql
、mybatis
,工程目录结构如下
由于我们工程中使用到了 Druid
,所以需要导入 Druid
的坐标
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.2.11version>
dependency>
将 springmvc_06_ssm
工程中的 java
代码及测试代码连同包拷贝到 springboot_04_ssm
工程,项目结构如下:
需要修改的内容如下:
springmvc_06_ssm
中 config
包下的是配置类,而 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);
}
}
在 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
在 SpringBoot
程序中是没有 webapp
目录的,那么在 SpringBoot
程序中静态资源需要放在什么位置呢?
静态资源需要放在 resources
下的 static
下,如下图所示
gitee 代码下载
github 代码下载