SpringBoot整合Mybatis(一)

一、环境准备

  1. 开发工具 IDEA
  2. MySQL数据库(注意版本,下文有说)

二、数据准备

直接上图(就不给具体代码了)
在这里插入图片描述

三、搭建流程

1. 项目搭建

搭建流程如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这时,拿起水杯喝口水,等他创建完成,目录结构如下所示:

在这里插入图片描述
现对该目录结构做个简单介绍:
在这里插入图片描述

2. 代码实现

1. pom文件(dependencies依赖部分)

<dependencies>
      <!-- springboot 相关依赖jar包,有先前选择的第二步spring web生成 -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <!-- spring-mybatis集成jar包 -->
      <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <version>2.1.4</version>
      </dependency>
      <!-- mysql JDBC jar包 -->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <scope>runtime</scope>
      </dependency>
      <!-- lombok包,项目中直接使用即可,第一步选择生成 -->
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
      </dependency>
      <!-- 测试用,占时不用管 -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
  </dependencies>

重点,敲黑板

可以看的,MySQL的JDBC包没有给出具体版本号,这里默认时当前最新版本,具体那个版本可以去https://mvnrepository.com/上面查询,因此要看你本地使用的MySQL版本(前面提到过),若版本为MySQL 8 及以上,那么可以不做修改,没问题,若版本为MySQL 8 以下(本人是5.56版本),那么必须指定低版本的版本号,如下所示,否则启动报错(亲测):

<!-- mysql JDBC jar包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <!--- 指定低版本的版本号 ->
    <version>5.1.49</version>
    <scope>runtime</scope>
</dependency>

PS:MySQL 8 版本以上和以下的JDBC的驱动程序也不一样(自己使用的MySQL版本很重要),这个后面再说。

2. 新建项目结构(MVC结构)

如下所示:

在这里插入图片描述

3. 配置文件

基于上面的包结构,来写配置文件

前面也说过,创建工程后resource下会有一个默认的配置文件application.properties,现在将其重命名为application.yml。

为什么要用yml配置文件,这里简单说下,就是yml文件使用更简单、更直观,像具体了解两者区别可以。。。
配置文件分三部分,一是服务器配置,而是MyBatis配置,三是MySQL连接配置,如下:
1) 服务器配置

server:
  port: 8888 
  servlet:
    context-path: /myFirstSpringBoot
  • server.port:设置端口,默认8080
  • server.servlet.context-path:配置项目统一路径,在ngnix分发中起重要作用。设置此值后,访问的URL就变为了http://localhost:8888/myFirstSprignBoot;也可以不设置,URL为http://localhost:8888/

2)Mybatis配置

mybatis:
  type-aliases-package: com.example.demo.bean
  mapper-locations: classpath:demo/mybatis/*.xml
  • mybatis.type-aliases-pakage:配置实体类全路径包名,可以不配置此项吗?答案是可以,具体后面再说
  • mybatis.mapper-locations:配置xml文件路径,也不是必配项,原因和区别后面说

3) MySQL连接配置

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot
    username: root
    password:
  • spring.datasource.driver-class-name: 配置数据库驱动程序,前面已经提到过,MySQL 8 和之前版本的驱动程序是不一样的,这里具体说说:MySQL 8版本以下版本的驱动程序如上所示: com.mysql.jdbc.Driver;8 及以上版本的驱动程序为:com.mysql.cj.jdbc.Driver。搭建根据自己使用的版本对号入座

  • spring.datasource.url: 配置数据库地址,最后面的springboot为数据库名,这是最简洁的写法,最普通的写法如下所示:useUnicode和characterEncoding配合使用表示使用Unicode字符集,且使用UTF-8编码

    url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8
    

    另外,在使用连接池时,最好再添加两个参数autoReconnect=true&failOverReadOnly=false,分别表示数据库连接断开后自动重连、重连成功后的连接为非可读的,具体代码如下:

    url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
    
  • spring.datasource.username: 数据库用户名

  • spring.datasource.password:对应的密码

PS:
spring.datasource.password写法与给出的实例写法完全不一样,因为这是springboot自带的配置文件 .properties文件格式的写法,是不是感觉很冗余,没有yml格式写法简洁?

完整的yml配置文件如下:

#Part One
#服务器相关设置
server:
  port: 8080 #设置端口,默认8080
  servlet:
    context-path: /myFirstSpringBoot  #配置项目统一路径,在ngnix分发中起重要作用
    #设置此值后,访问的URL就变为了http://localhost:8888/myFirstSprignBoot
    #也可以不设置,URL为http://localhost:8888/



#Part Two
#MyBatis相关配置
mybatis:
  type-aliases-package: com.example.demo.bean #配置实体类全路径包名
  mapper-locations: classpath:demo/mybatis/*.xml  #配置xml文件路径,
#                                                当xml文件路径与mapper接口路径一样时,可以不配置此项
#                                                当两者路径不一样时,必须在此处指明xml文件的路径,否则spring找不到xml文件



#Part Three
#MySQL JDBC相关配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
    username: root
    password:

4. 代码实现

结构、配置文件介绍完了,该直接上代码了,很简单,就不做过多说明了。
1)Contrller层

package com.example.demo.controller;

import com.example.demo.bean.Student;
import com.example.demo.service.DemoService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@RestController
public class DemoController {

    @Resource
    private DemoService demoService;

    @RequestMapping("/queryAll")
    public List<Student> queryAll(){
        System.out.println("调用queryAll接口!");
        return demoService.queryAll();
    }
}

2)Service层

package com.example.demo.service;

import com.example.demo.bean.Student;
import com.example.demo.mapper.DemoMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author czm
 * @create 2020/11/25 22:57
 */
@Service
public class DemoService {

    @Resource
    private DemoMapper demoMapper;

    public List<Student> queryAll(){
        return demoMapper.queryAll();
    }
}

3)Mapper层

package com.example.demo.mapper;

import com.example.demo.bean.Student;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author czm
 * @create 2020/11/25 22:56
 */
@Mapper
public interface DemoMapper {
    List<Student> queryAll();
}

4)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.example.demo.mapper.DemoMapper">

    <resultMap id="StudentMap" type="Student">
        <id property="id" column="id"></id>
        <result property="stuId" column="stu_id"></result>
        <result property="name" column="name"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>
    </resultMap>

    <select id="queryAll" resultMap="StudentMap">
        select * from student;
    </select>
    
</mapper>

5)启动类

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

PS:注意点

1. mybatis的两个配置项

具体mybatis配置如下:

mybatis:
  type-aliases-package: com.example.demo.bean #配置实体类全路径包名
  mapper-locations: classpath:demo/mybatis/*.xml  #配置xml文件路径,

第一项,mybatis.type-aliases-package

配置实体类全路径包名,配置此项后,在xml文件里写实体类时就不需要加包名了,如下:

<resultMap id="StudentMap" type="Student">
   <id property="id" column="id"></id>
    <result property="stuId" column="stu_id"></result>
    <result property="name" column="name"></result>
    <result property="sex" column="sex"></result>
    <result property="address" column="address"></result>
</resultMap>

若是不配置此项,则必须在实体类前加全限定包名,如下:

<resultMap id="StudentMap" type="com.example.demo.bean.Student">
   <id property="id" column="id"></id>
    <result property="stuId" column="stu_id"></result>
    <result property="name" column="name"></result>
    <result property="sex" column="sex"></result>
    <result property="address" column="address"></result>
</resultMap>

第二项:mapper-locations

配置xml文件的路径,当xml文件路径与mapper接口路径一样时,可以不配置此项;当两者路径不一样时,必须在此处指明xml文件的路径,否则spring找不到xml文件。

此例中,mapper接口的路径为com.example.demo.mapper,即com/example/demo/mapper,而mapper.xml文件的路径为demo/mybatis,不一样,必须配置此项,若mapper.xml的路径也为com/example/demo/mapper,如下,则可以不配置此项.

注意:在resource中新建路径时,必须层级建立【com->example->demo->mapper】,而不能一次建完【com.example.demo.mapper】,这样只是见了一个文件,文件名为com.example.demo.mapper,并没有一个层级关系。
在这里插入图片描述

2. 配置自动扫描mapper接口

我们看mapper接口内容:

@Mapper
public interface DemoMapper {
    List<Student> queryAllStudent();
}

可以看到,mapper即可有一个注解@Mapper,作用是编译后springboot为相应的mapper生成实体类,供Service层调用。

试想下,若是不是一个mapper接口,而是几十个呢,是不是意味着我们要写几十个@Mapper注解,因此Spring Boot提供了一个@MapperScan注解,防止项目的启动类上,这样配置后,就不需要再每个Mapper接口上添加@Mapper注解了,SpringBoot会自动扫描@MapperScan声明的路径下的所有Mapper接口,如下:

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

可以看到,多了一行@MapperScan注解,括号内的表示Mapper接口所在的路径,有多个路径是一如下方式配置:

@MapperScan("{"com.example.demo.mapper1", "com.example.demo.mapper2"}")

PS,以上提到的三个注意点,两种实现方式都可以同时存在,但是不能少,看个人喜好和编码习惯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值