十七SpringBoot2核心技术——整合Mybatis

Posted 上善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十七SpringBoot2核心技术——整合Mybatis相关的知识,希望对你有一定的参考价值。

整合mybatis

1.1、添加mybatis、数据库驱动依赖

<dependencies>
    <!--SpringBoot框架web项目起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!--mybatis整合springboot框架的起步依赖-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis-spring.version}</version>
    </dependency>
</dependencies>

1.2、编写pojo、controller、service、mapper层代码


Student.java

package com.xbmu.pojo;

public class Student {
    private Integer id;
    private String name;
    private Integer age;
    /* 省略set 与 get 方法 */
}

StudentController.java

package com.xbmu.controller;

import com.xbmu.pojo.Student;
import com.xbmu.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class StudentController {

    @Autowired
    private StudentService studentService;

    @RequestMapping("/findStuById")
    public @ResponseBody Object findStuById(Integer id){
        Student student = studentService.findStuById(id);
        return student;
    }
}

StudentService.java

package com.xbmu.service;

import com.xbmu.pojo.Student;

public interface StudentService {
    Student findStuById(Integer id);
}

StudentServiceImpl.java

package com.xbmu.service.impl;

import com.xbmu.pojo.Student;
import com.xbmu.service.StudentService;
import com.xbmu.mapper.StudentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper studentMapper;

    @Override
    public Student findStuById(Integer id) {
        return studentMapper.findStuById(id);
    }
}

StudentMapper.java

package com.xbmu.mapper;

import com.xbmu.pojo.Student;
import org.apache.ibatis.annotations.Mapper;

@Mapper // 扫描dao接口到spring容器
public interface StudentMapper {
    Student findStuById(Integer id);
}

StudentMapper.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.xbmu.mapper.StudentMapper">
    <select id="findStuById" parameterType="java.lang.Integer" resultType="com.xbmu.pojo.Student">
        SELECT id,name,age FROM t_student
        <where>
            id = #{id}
        </where>
    </select>
</mapper>

1.3、spring核心配置文件

# springboot核心配置文件
# 指定内嵌 tomcat 端口号
server:
  port: 8080
  servlet:
    context-path: / # 指定上下文根,默认 /

# 设置连接数据库的配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springdb?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
    username: root
    password: root

1.4、手动指定资源文件夹

默认情况下,Mybatis 的 xml 映射文件不会编译到 target 的 class 目录下,所以我们需要在 pom.xml 文件中配置 resource。

<build>
   <!--
        手动指定文件夹为resources
    -->
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
    <!--springboot编译打包插件-->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

1.5、启动,运行访问

1.6、@Mappper 、@MapperScan(basePackages = “包名”)

@Mapper作用:mybatis 自动扫描数据持久层的映射文件及 dao 接口的关系。需要在每一个Mapper接口类上添加,作用扫描dao接口。
@MapperScan(basePackages = "包名")作用:是在springboot启动入口类上添加的,它是扫描所有的包。
MainApplication.java

package com.xbmu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "com.xbmu.mapper")
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

如果在springboot启动入口类上配置了@MapperScan注解,就不需要再在每个mapper接口上配置@Mapper注解了。

1.7、Mapper映射文件的存放位置

关于Mapper映射文件存放的位置的写法有以下两种:
1.将Mapper接口和Mapper映射文件存放到 src/main/java同一目录下,还需要在pom文件中手动指定资源文件夹路径resources

<build>
    <!--
        手动指定文件夹为resources
    -->
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

2.将Mapper接口和Mapper映射文件分开存放
Mapper接口类存放到src/main/java目录下;
Mapper映射文件存放到resources(类路径)

1.8、Mapper映射文件存放到resources(类路径)

因为springboot不能自动编译接口映射的xml文件,还需要手动在pom文件中指定,所以有的公司直接将映射文件放到resources目录下。

  • 在resources目录下新建目录mapper存放映射文件,将StudentMapper.xml文件移到resources/mapper目录下
  • 在application.yml配置文件中指定映射文件的位置,这个配置只有接口和映射文件不在同一个包的情况下,才需要指定
# 指定mybatis映射文件的路径
mybatis:
  mapper-locations: classpath:mapper/*.xml

MainApplication.java

package com.xbmu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "com.xbmu.mapper")
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

1.9、SpringBoot事务支持

SpringBoot使用事务非常简单,底层依然采用的是spring本身提供的事务管理。

  • 在入口类中使用注解@EnableTransactionManagement开启事务支持。

@EnableTransactionManagement 可选,但是 业务方法上 必须添加@Transactional

package com.xbmu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@MapperScan(basePackages = "com.xbmu.mapper") // 开启扫描mapper接口的包以及子包
@EnableTransactionManagement //开启事务支持(可选项,但@Transactional 必须添加)
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}
  • 在访问数据库的service类或方法上添加注解@Transactional即可。
package com.xbmu.service.impl;

import com.xbmu.pojo.Student;
import com.xbmu.service.StudentService;
import com.xbmu.mapper.StudentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper studentMapper;
    
    @Override
    @Transactional //添加此注解说明该方法添加的事务管理
    public Integer updateStuById(Student student) {
        Integer rows = studentMapper.updateStuById(student);
        //在此构造一个除数为 0 的异常,测试事务是否起作用
        int i = 10 / 0;
        return rows;
    }
}

以上是关于十七SpringBoot2核心技术——整合Mybatis的主要内容,如果未能解决你的问题,请参考以下文章

十六SpringBoot2核心技术——整合jsp

十六SpringBoot2核心技术——整合jsp

二十一SpringBoot2核心技术——整合activiti7

十九SpringBoot2核心技术——整合Alibaba Dubbo

十九SpringBoot2核心技术——整合Alibaba Dubbo

二十SpringBoot2核心技术——整合logback