SpringBoot整合Mybatis

  |   0 评论   |   0 浏览

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` ;

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

<!--导入springboot父工程-规定写法-->
<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>2.5.3</version>
</parent>

<!--引入相关的依赖-->
<dependencies>
    <!--引入web starter-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--引入mybatis starter-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.2</version>
    </dependency>

    <!--引入mysql驱动: 这里使用版本仲裁 8.0.26-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!--引入配置处理器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>

    <!--引入lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <!--引入test starter-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <!--引入druid依赖-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.17</version>
    </dependency>
</dependencies>
  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

image-20220817225537215

  1. 切换数据源为 druid , 修改 pom.xml(如果没有 mybatis-stater , 加入即可.) 添加配置文件src\main\java\com\llp\springboot\mybatis\config\DruidDataSourceConfig.java, 完成测试
<!--引入druid依赖,引入druid-spring-boot-starter也是可以的,但这里只想使用配置类的方式所有引入druid依赖就足够了-->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.1.17</version>
</dependency>
@SpringBootTest
public class ApplicationTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void t1(){
        Class<? extends DataSource> aClass = jdbcTemplate.getDataSource().getClass();
        System.out.println(aClass);
    }
}

​ 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;
}

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

public interface MonsterMapper {

    Monster getMonsterById(@Param("id") Integer id);
}

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

<?xml version="1.0" encoding="UTF-8"?>
<!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>

​ 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

mybatis-config.xml配置文件方式

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

   <!--配置MyBatis自带的日志输出-查看原生的sql-->
   <settings>
      <setting name="logImpl" value="STDOUT_LOGGING"/>
   </settings>

   <!--
     1. 如果一个包下有很多的类,我们可以直接引入包
     2. 这样该包下面的所有类名,可以直接使用
   -->
   <typeAliases>
      <package name="com.llp.springboot.mybatis.bean"/>
   </typeAliases>

</configuration>

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

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

@SpringBootApplication
@MapperScan(basePackages = {"com.llp.springboot.mybatis.dao"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

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

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

@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);
}

3.注意事项和细节说明

  1. spring boot 整合 mybatis 取出的日期, 出现 8 小时时差 解决方案 : @JsonFormat(pattern="yyyy-MM-dd HH🇲🇲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);
    }
}

MonsterServiceImpl

@Service
public class MonsterServiceImpl implements MonsterService {

    @Autowired
    private MonsterMapper monsterMapper;

    @Override
    public Monster getMonsterById(Integer id) {
        return monsterMapper.getMonsterById(id);
    }
}

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

image-20220818230753119

解决办法:在需要转换时间的类中添加注解 @JsonFormat(pattern = "yyyy-MM-dd HH🇲🇲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;
}

标题:SpringBoot整合Mybatis
作者:llp
地址:https://llinp.cn/articles/2022/08/18/1660835825241.html