十七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核心技术——整合activiti7
十九SpringBoot2核心技术——整合Alibaba Dubbo