1. Spring整合MyBatis

之前Spring整合MyBatis时,需要定义很多配置类

SpringConfig配置类

@Configuration
@ComponentScan("com.blog")
@PropertySource("jdbc.properties")
@Import({JdbcConfig.class, MyBatisConfig.class})
public class SpringConfig {
}

导入JdbcConfig配置类

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 dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

导入MyBatisConfig配置类

public class MyBatisConfig {

    //定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        //设置模型类的别名扫描
        sqlSessionFactory.setTypeAliasesPackage("com.blog.domain");
        //设置数据源
        sqlSessionFactory.setDataSource(dataSource);
        return sqlSessionFactory;
    }
    //定义bean,返回MapperScannerConfigurer对象
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.blog.dao");
        return msc;
    }
}

2. SpringBoot整合MyBatis

CREATE DATABASE springboot_db;
USE springboot_db;

CREATE TABLE tbl_book
(
    id          INT PRIMARY KEY AUTO_INCREMENT,
    `type`      VARCHAR(20),
    `name`      VARCHAR(50),
    description VARCHAR(255)
);

INSERT INTO `tbl_book`(`id`, `type`, `name`, `description`)
VALUES (1, '计算机理论', 'Spring实战 第五版', 'Spring入门经典教程,深入理解Spring原理技术内幕'),
       (2, '计算机理论', 'Spring 5核心原理与30个类手写实践', '十年沉淀之作,手写Spring精华思想'),
       (3, '计算机理论', 'Spring 5设计模式', '深入Spring源码刨析Spring源码中蕴含的10大设计模式'),
       (4, '计算机理论', 'Spring MVC+Mybatis开发从入门到项目实战',
        '全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手'),
       (5, '计算机理论', '轻量级Java Web企业应用实战', '源码级刨析Spring框架,适合已掌握Java基础的读者'),
       (6, '计算机理论', 'Java核心技术 卷Ⅰ 基础知识(原书第11版)',
        'Core Java第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新'),
       (7, '计算机理论', '深入理解Java虚拟机', '5个纬度全面刨析JVM,大厂面试知识点全覆盖'),
       (8, '计算机理论', 'Java编程思想(第4版)', 'Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉'),
       (9, '计算机理论', '零基础学Java(全彩版)', '零基础自学编程的入门图书,由浅入深,详解Java语言的编程思想和核心技术'),
       (10, '市场营销', '直播就这么做:主播高效沟通实战指南', '李子柒、李佳奇、薇娅成长为网红的秘密都在书中'),
       (11, '市场营销', '直播销讲实战一本通', '和秋叶一起学系列网络营销书籍'),
       (12, '市场营销', '直播带货:淘宝、天猫直播从新手到高手', '一本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');

定义实体类

public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", type='" + type + '\\'' +
                ", name='" + name + '\\'' +
                ", description='" + description + '\\'' +
                '}';
    }
}

定义dao接口: 在com.blog.dao包下定义BookDao接口

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

定义测试类

@SpringBootTest
class Springboot03MybatisApplicationTests {

    @Autowired
    private BookDao bookDao;

    @Test
    void contextLoads() {
        Book book = bookDao.getById(1);
        System.out.println(book);
    }

}

编写配置

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC
    username: root
    password: PASSWORD

运行测试方法,会报错No qualifying bean of type 'com.blog.dao.BookDao',没有类型为“com.blog.dao.BookDao”的限定bean为什么会出现这种情况呢?之前我们在配置MyBatis时,配置了如下内容

@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
    MapperScannerConfigurer msc = new MapperScannerConfigurer();
    msc.setBasePackage("com.blog.dao");
    return msc;
}

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

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

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

</aside>

2.1 使用Druid数据源

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

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

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

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

3. 案例

SpringBoot 到这就已经学习完毕,接下来我们将学习 SSM 时做的三大框架整合的案例用 SpringBoot 来实现一下。先将之前做的SSM整合的代码拷贝过来,修改成SpringBoot的,之后再自己手动敲一遍SpringBoot的全流程,就当复盘了。

3.1 创建工程

创建一个新的SpringBoot工程,注意要勾选Spring WebMyBatis FrameworkMySQL Driver 由于我们工程中使用到了 Druid ,所以需要导入 Druid 的坐标

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

3.2 代码拷贝

将之前的ssm整合工程的代码拷贝过来,将com.blog包下的所有内容拷贝过来,放在对应的位置即可。

需要修改的内容如下:

@Mapper
public interface BookDao {
    @Insert("insert into tbl_book values (null, #{type}, #{name}, #{description})")
    int save(Book book);

    @Update("update tbl_book set type=#{type}, `name`=#{name}, `description`=#{description} where id=#{id}")
    int update(Book book);

    @Delete("delete from tbl_book where id=#{id}")
    int delete(Integer id);

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

    @Select("select * from tbl_book")
    List<Book> getAll();
}

将测试类也修改为SpringBoot的

import com.blog.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookServiceTest {

    @Autowired
    private BookService bookService;

    @Test
    public void testGetById() {
        Book book = bookService.getById(1);
        System.out.println(book);
    }

    @Test
    public void testGetAll() {
        for (Book book : bookService.getAll()) {
            System.out.println(book);
        }
    }
}

3.2 配置文件

在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/springboot_db?serverTimezone=UTC
    username: root
    password: PASSWORD.

3.3 静态资源

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

静态资源需要放在 resources 下的 static 下

那我们再配置一个默认页面,跳转到我们的增删改页面,新建index.html,写入以下内容

<script>
    document.location.href="/pages/books.html"
</script>

这样当我们在浏览器输入localhost,然后直接按回车,就能直接跳转到增删改的页面了,如果以后我们需要频繁测试某一个页面,也可以将上述代码中的地址换为我们要测试的地址,这样就不用老手敲地址了 那么至此,将之前的ssm整合,改为springboot的工作,就完成了