😧 SpringBoot(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 😧 SpringBoot

3,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 注入要测试的资源
  • 定义测试方法进行测试


3.1  环境准备


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


网络异常,图片无法展示
|


com.itheima.service 下创建 BookService 接口,内容如下


public interface BookService {
    public void save();
}


com.itheima.service.impl 包写创建一个 BookServiceImpl 类,使其实现 BookService 接口,内容如下


@Service
public class BookServiceImpl implements BookService {
    @Override
    public void save() {
        System.out.println("book service is running ...");
    }
}

3.2  编写测试类


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


@SpringBootTest
class Springboot07TestApplicationTests {
    @Autowired
    private BookService bookService;
    @Test
    public void save() {
        bookService.save();
    }
}


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


例如:


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


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


4,SpringBoot整合mybatis


4.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.itheima.dao");
    return msc;
}
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
    SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
    ssfb.setTypeAliasesPackage("com.itheima.domain");
    ssfb.setDataSource(dataSource);
    return ssfb;
}

4.2  SpringBoot整合mybatis


4.2.1  创建模块


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


网络异常,图片无法展示
|


  • 选择当前模块需要使用的技术集(MyBatis、MySQL)
    网络异常,图片无法展示
    |


4.2.2  定义实体类


com.itheima.domain 包下定义实体类 Book,内容如下


public class Book {
    private Integer id;
    private String name;
    private String type;
    private String description;
    //setter and  getter
    //toString
}


4.2.3  定义dao接口


com.itheima.dao 包下定义 BookDao 接口,内容如下


public interface BookDao {
    @Select("select * from tbl_book where id = #{id}")
    public Book getById(Integer id);
}


4.2.4  定义测试类


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


@SpringBootTest
class Springboot08MybatisApplicationTests {
 @Autowired
 private BookDao bookDao;
 @Test
 void testGetById() {
  Book book = bookDao.getById(1);
  System.out.println(book);
 }
}


4.2.5  编写配置


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


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


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


4.2.6  测试


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


网络异常,图片无法展示
|


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


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


@Mapper
public interface BookDao {
    @Select("select * from tbl_book where id = #{id}")
    public Book getById(Integer id);
}


注意:


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


4.2.7  使用Druid数据源


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


  • 导入 Druid 依赖


<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>
  • application.yml 配置文件配置可以通过 spring.datasource.type 来配置使用什么数据源。配置文件内容可以改进为
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

5,案例


SpringBoot 到这就已经学习完毕,接下来我们将学习 SSM 时做的三大框架整合的案例用 SpringBoot 来实现一下。我们完成这个案例基本是将之前做的拷贝过来,修改成 SpringBoot 的即可,主要从以下几部分完成


  1. pom.xml
    配置起步依赖,必要的资源坐标(druid)
  2. application.yml
    设置数据源、端口等
  3. 配置类
    全部删除
  4. dao
    设置@Mapper
  5. 测试类
  6. 页面
    放置在resources目录下的static目录中


5.1  创建工程


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


网络异常,图片无法展示
|


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


<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>


5.2  代码拷贝


springmvc_11_page 工程中的 java 代码及测试代码连同包拷贝到 springboot_09_ssm 工程,按照下图进行拷贝


网络异常,图片无法展示
|


需要修改的内容如下:


  • Springmvc_11_pageconfig 包下的是配置类,而 SpringBoot 工程不需要这些配置类,所以这些可以直接删除
  • dao 包下的接口上在拷贝到 springboot_09-ssm 工程中需要在接口中添加 @Mapper 注解
  • BookServiceTest 测试需要改成 SpringBoot 整合 junit


@SpringBootTest
public class BookServiceTest {
    @Autowired
    private BookService bookService;
    @Test
    public void testGetById(){
        Book book = bookService.getById(2);
        System.out.println(book);
    }
    @Test
    public void testGetAll(){
        List<Book> all = bookService.getAll();
        System.out.println(all);
    }
}

5.3  配置文件


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


  • 服务的端口号
  • 连接数据库的信息
  • 数据源


server:
  port: 80
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db #?servierTimezone=UTC
    username: root
    password: root

5.4  静态资源


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


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


网络异常,图片无法展示
|

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Java 关系型数据库 MySQL
😧 SpringBoot(三)
😧 SpringBoot
96 1
|
XML 前端开发 Java
😧 SpringBoot(二)
😧 SpringBoot
83 1
|
XML Java 程序员
😧 Spring_day03(一)
😧 Spring_day03
99 1
|
前端开发 Java 关系型数据库
😧 SpringBoot(一)
😧 SpringBoot
98 0
|
存储 Java Maven
😧 Spring_day01 ✅(二)
😧 Spring_day01 ✅
66 0
|
Java 数据库连接 数据库
😧 Spring_day03(五)
😧 Spring_day03
60 0
|
druid Java 数据库连接
😧 Spring_day02 ✅(五)
😧 Spring_day02 ✅
109 0
|
Java Maven 索引
😧 Spring_day01 ✅(四)
😧 Spring_day01 ✅
69 0
|
Java Spring 容器
😧 Spring_day03(二)
😧 Spring_day03
89 0
|
监控 Java 测试技术
😧 Spring_day03(四)
😧 Spring_day03
80 0