• SpringBoot整合Mybatis


    SpringBoot整合Mybatis

    1.需求说明/图解

    1. 将 Spring Boot 和 MyBatis 整合
    2. 查询出一条数据

    2.综合案例

    1.代码+配置实现

    1. 创建数据库和表
    CREATE DATABASE `springboot_mybatis` ;
    USE `springboot_mybatis` ;
    CREATE TABLE `monster` (
    	`id` INT NOT NULL AUTO_INCREMENT,
    	`age` INT NOT NULL,
    	`birthday` DATE DEFAULT NULL,
    	`email` VARCHAR ( 255 ) DEFAULT NULL,
    	`gender` CHAR ( 1 ) DEFAULT NULL,
    	`name` VARCHAR ( 255 ) DEFAULT NULL,
    	`salary` DOUBLE NOT NULL,
    PRIMARY KEY ( `id` ) 
    ) CHARSET = utf8;
    
    
    insert into monster values(null, 20, '2000-11-11', 'nmw@sohu.com', '男', '牛魔王', 5000.88); 
    insert into monster values(null, 10, '2011-11-11', 'bgj@sohu.com', '女', '白骨精', 8000.88);
    
    
    SELECT * FROM `monster` ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ​ 2.创建工程名为springboot_mybatis, maven项目- pom.xml 需要引入相关依赖.

    
    <parent>
        <artifactId>spring-boot-starter-parentartifactId>
        <groupId>org.springframework.bootgroupId>
        <version>2.5.3version>
    parent>
    
    
    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
    
        
        <dependency>
            <groupId>org.mybatis.spring.bootgroupId>
            <artifactId>mybatis-spring-boot-starterartifactId>
            <version>2.2.2version>
        dependency>
    
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
        dependency>
    
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-configuration-processorartifactId>
        dependency>
    
        
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
        dependency>
    
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
        dependency>
    
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.1.17version>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    1. 创建 resources/application.yml , 配置数据源参数, 并完成 Spring Boot 项目启动测试
    server:
      port: 9090
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
        username: root
        password: root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220817225537215

    1. 切换数据源为 druid , 修改 pom.xml(如果没有 mybatis-stater , 加入即可.) 添加配置文件src\main\java\com\llp\springboot\mybatis\config\DruidDataSourceConfig.java, 完成测试
    
    <dependency>
       <groupId>com.alibabagroupId>
       <artifactId>druidartifactId>
       <version>1.1.17version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    @SpringBootTest
    public class ApplicationTest {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Test
        public void t1(){
            Class<? extends DataSource> aClass = jdbcTemplate.getDataSource().getClass();
            System.out.println(aClass);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ​ 5.创建src\main\java\com\llp\springboot\mybatis\bean\Monster.java

    @Data
    public class Monster {
        private Integer id;
        private Integer age;
        private Date birthday;
        private String email;
        private String name;
        private String gender;
        private Double salary;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ​ 6.创建src\main\java\com\llp\springboot\mybatis\dao\MonsterMapper.java

    public interface MonsterMapper {
    
        Monster getMonsterById(@Param("id") Integer id);
    }
    
    • 1
    • 2
    • 3
    • 4

    ​ 7.创建src\main\resources\mapper\MonsterMapper.xml

    
    DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.llp.springboot.mybatis.dao.MonsterMapper">
    
    
    <select id="getMonsterById" resultType="Monster">
       select * from monster where id = #{id}
    select>
    
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ​ 8.配置mybatis

    yaml方式配置

    #mybatis配置
    mybatis:
      #指定要扫描的mapper.xml位置; classpath:mapper/*.xml 扫描在类路径下的mapper目录下的。xml文件
      mapper-locations: classpath:mapper/*.xml
      #配置类型别名,通常指定实体类所在包,这样我们在xml中resultType="com.llp.springboot.mybatis.bean.Monster"就可以简写成Monster
      type-aliases-package: com.llp.springboot.mybatis.bean
      #配置mybatis sql打印日志
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        #启用自动驼峰配置
        map-underscore-to-camel-case: true
    
      #通过config-location可以指定mybatis-config.xml,这样就可以用传统的方式来配置mybatis
      #config-location: classpath:mybatis-config.xml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    mybatis-config.xml配置文件方式

    在springboot中配置mybatis非常快捷,但如果需要配置项目较多的话可以引入传统的mybatis配置文件来进行配置

    
    DOCTYPE configuration
          PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
       
       <settings>
          <setting name="logImpl" value="STDOUT_LOGGING"/>
       settings>
    
       
       <typeAliases>
          <package name="com.llp.springboot.mybatis.bean"/>
       typeAliases>
    
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    9.配置mapper接口包扫描的两种方式

    方式一,在启动类中配置包扫描

    @SpringBootApplication
    @MapperScan(basePackages = {"com.llp.springboot.mybatis.dao"})
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    方式二,在mapper接口中添加@mapper注解

    //使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。
    @Mapper
    public interface MonsterMapper {
        //方法,根据id返回Monster对象
        public Monster getMonsterById(Integer id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    @mapper注解和@repository的区别

    @mapper注解是mybatis的注解,使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。而动态的生成bean去注入,在ide中可能会冒红,但这并不语法上的错误。

    @repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl
    @Repository注解修饰哪个类,则表明这个类具有对对象进行CRUD(增删改查)的功能,而且@Repository是@Component注解的一个派生品,所以被@Repository注解的类可以自动的被@ComponentScan 通过路径扫描给找到。

    ​ 10.测试一把

    @Autowired
    private MonsterMapper monsterMapper;
    @Test
    public void getMonsterById(){
        //Monster(id=1, age=20, birthday=Sat Nov 11 00:00:00 CST 2000, email=nmw@sohu.com, name=牛魔王, gender=男, salary=5000.88)
        Monster monster = monsterMapper.getMonsterById(1);
        System.out.println(monster);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.注意事项和细节说明

    1. spring boot 整合 mybatis 取出的日期, 出现 8 小时时差 解决方案 : @JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”,timezone=“GMT+8”)

    MonsterController

    @RestController
    public class MonsterController {
    
        @Autowired
        private MonsterService monsterService;
    
        @RequestMapping("/getMonster/{id}")
        public Monster getMonsterById(@PathVariable("id") Integer id){
            return monsterService.getMonsterById(id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    MonsterServiceImpl

    @Service
    public class MonsterServiceImpl implements MonsterService {
    
        @Autowired
        private MonsterMapper monsterMapper;
    
        @Override
        public Monster getMonsterById(Integer id) {
            return monsterMapper.getMonsterById(id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    返回给浏览器的时间是格林威治时间,真实的时间是2000-11-11 00:00:00,这是因为我们属于东八区,相差了八个小时导致的

    image-20220818230753119

    解决办法:在需要转换时间的类中添加注解 @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”)

    @Data
    public class Monster {
        private Integer id;
        private Integer age;
        //这里通过注解来解决时区问题
        //GMT 就是格林尼治标准时间
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date birthday;
        private String email;
        private String name;
        private String gender;
        private Double salary;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    php switch case 多条件使用同一个case
    Leetcode 238. 除自身以外数组的乘积
    Go 文件读写
    Linux网络基础-5
    手把手教你搭建园林园艺小程序商城
    Spring Boot中整合WebSocket
    黑马JVM总结(十八)
    vue的响应式原理:依赖追踪
    Ubuntu搭建团队文档协作在线平台
    解题-->在线OJ(十九)
  • 原文地址:https://blog.csdn.net/qq_44981526/article/details/126415678