SpringBoot笔记:集成MyBatis
SpringBoot中使用MyBatis与MVC中本质是一样的,只是某些配置可以直接使用注解完成,使编码更加便捷了。
1. pom依赖
集成MyBatis通常需要MyBatis、Spring、数据库驱动三个依赖,但是由于MyBatis有一个整合的专门适配SpringBoot的依赖mybatis-spring-boot-starter,所以只需要配置两个依赖即可,并且由于SpringBoot自动集成了MySQL的数据库驱动,如果使用的是MySQL数据库,配置pom依赖的时候也可以不用配置数据库驱动,当然,一般我们会使用自己的MySQL驱动版本,所以可以修改父工程的默认驱动版本,或者配置依赖的时候指定对应的版本。
<properties>
<java.version>17</java.version>
<!-- 修改父工程管理的依赖版本号 -->
<!-- <mysql.version>8.0.26</mysql.version> -->
</properties>
<dependencies>
<!-- MySQL驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- 可以单独指定版本,也可以在properties节点中修改父工程使用的版本 -->
<version>8.0.26</version>
</dependency>
<!-- mybatis整合spring的起步依赖(不用再分开导入mybatis和spring了) -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
2. 数据库连接配置
在application.properties核心配置文件中配置数据库连接信息:
# 连接数据库的配置信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
3. Mapper.xml配置文件
这个配置文件与Mapper.java接口对应,用于配置Mapper.java接口中方法对应的SQL。Mapper.xml文件的配置有两种,一种是xml文件就放在src/main/java包,编译时由于maven约定不会扫描java包下的非java文件,所以就需要在pom.xml中进行配置:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
另一种方式就是直接在application.properties核心配置文件中配置Mapper.xml文件的路径:
# 指定MyBatis映射文件路径,此时所有的xxxMapper.xml就必须放在指定的这个路径下了,
# 使用了这个配置项之后,就不用在pom中指定resource配置了
mybatis.mapper-locations=classpath:mapper/*.xml
4. MyBatis使用
想要使用MyBatis,通常需要用到xxxMapper.java接口、xxxMapper.xml配置文件、实体类,然后使用xxxMapper.java接口获取数据库数据。以下示例中一些接口、实体类等代码就不给出了,只展示完整流程中的基础代码。
controller定义
package com.yun.demo.controller;
import com.yun.demo.model.Student;
import com.yun.demo.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(value = "/student")
@ResponseBody
public Object queryStudentById(Integer id) {
Student student = studentService.queryStudentById(id);
return student;
}
}
Service类定义
定义service接口和实现类(接口就不给出示例了,只给出实现类),由于在controller中使用了 @Autowired
进行自动装配,所以这里需要使用注解 @Service
将service实现类加入到Spring容器中:
package com.yun.demo.service.impl;
import com.yun.demo.mapper.StudentMapper;
import com.yun.demo.model.Student;
import com.yun.demo.service.StudentService;
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 queryStudentById(Integer id) {
return studentMapper.selectByPrimaryKey(id);
}
}
Mapper.java接口定义
注意到service实现类中的Mapper接口也使用了 @Autowired
进行自动装配,那就意味着需要将Mapper接口也需要加入到Spring容器中,这里有两种方式可以将Mapper接口加入到Spring容器中:一种是在每个Mapper接口上使用 @Mapper
注解,另一种是在启动程序的Application类上使用注解 @MapperScan
将mapper接口的路径一次性配置好,这种方式会自动扫描指定路径下的所有Mapper接口并添加到Spring容器中。
方式一:使用注解@Mapper
package com.yun.demo.mapper;
import com.yun.demo.model.Student;
import org.apache.ibatis.annotations.Mapper;
// @Mapper注解会自动将接口到Spring容器中
@Mapper
public interface StudentMapper {
int deleteByPrimaryKey(Integer id);
int insert(Student row);
int insertSelective(Student row);
Student selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Student row);
int updateByPrimaryKey(Student row);
}
方式二:在启动类中通过注解@MapperScan指定需要扫面的包路径
package com.yun.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
// 自动扫描指定包及其子包下面的所有Mapper到容器中,使用了这个注解后就不用在每个Mapper接口上单独添加@Mapper注解了
@MapperScan(basePackages = "com.yun.demo.mapper")
public class Demo005MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(Demo005MybatisApplication.class, args);
}
}