Springboot与MyBatis简单整合

之前搭传统的 ssm 框架,配置文件很多,看了几天文档才把那些 xml 的逻辑关系搞得七七八八,搭起来也是很麻烦,那时我完全按网上那个 demo 的版本要求(jdk 和 tomcat),所以最后是各种问题没成功跑起来。    今天尝试用 springboot 来整合,不敢相信才失败几次就成功了!!  

现在来记录一下过程:

  首先 springboot 基本的建立就不讲了,之前的博客里面有写。

  添加 POM 依赖

    <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-thymeleaf</artifactId>  
    </dependency> 
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
        <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>mysql<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
        <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>mysql-connector-java<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
    
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
        <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>org.mybatis.spring.boot<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
        <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>mybatis-spring-boot-starter<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
        <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">version</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>1.3.0<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">version</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  </pre>

关于 dao 层的依赖就是后面两个 mysql 的 connector 和 mybatis 的 starter(这个可是好东西)

 

开始写代码

这里我们有个简单是数据表:

我们的目的是  用 get 发一个带有 id 值的请求,服务器根据 id 值返回这个图书管理员的全部信息并用 json 的方式直接显示在页面上,

 

Controller:

@RestController
public class LibrarianController {
@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> LibrarianService librarianService;

@GetMapping(</span>"/getLibrarian"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> Librarian getALibrarianInfo(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> id) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">System.out.println("test 🆔 "+id);</span>
    <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> librarianService.selectLibrarian(id);
}

}

RestController 是 responsebody+Controller 两个注解的合体,一般就拿来直接传 json 数据。  为什么可以直接传个对象过去呢?这是因为 springboot 内置了 jackson 模块,可以在 maven 的依赖下看到这方面的 jar 包(之前我写是按网上的教程用 gson 来处理的,比起来这个简直无敌)

然后看到我们注入的 sevice,下面是 service

 

Service

public interface LibrarianService {
    Librarian selectLibrarian(int id);}

就是个接口

 

ServiceImpl

@Service
public class LibrarianServiceImpl implements LibrarianService{
@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> LibrarianMapper librarianMapper;

@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> Librarian selectLibrarian(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> id) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO Auto-generated method stub</span>
    <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> librarianMapper.selectLibrarian(id);
}

}

这里记得要加 @Service 备注,才会被 spring 生成 bean 然后注入到 controller 那里去。

然后看到这里注入了个 mapper

 

Dao:

package com.example.dao;

import org.apache.ibatis.annotations.Mapper;

import com.example.entity.Librarian;

@Mapper
public interface LibrarianMapper {
Librarian selectLibrarian(
int id);
}

这里加的 @Mapper 是 MyBatis 的备注,目的是为了让 spring 能够根据 xml 和这个接口动态生成这个接口的实现。如果是加 @Repository,就是 spring 生成一个 bean,自动注入 service 的相关引用中。

 

然后是 Mapper 的 xml 文件(我的 MyBatis 的相关 sql 用的是 xml)

mapper.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.dao.LibrarianMapper">
<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)"> 可根据自己的需求,是否要使用 </span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">resultMap </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="Librarian"</span><span style="color: rgba(255, 0, 0, 1)"> id</span><span style="color: rgba(0, 0, 255, 1)">="LibrarianMap"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">id </span><span style="color: rgba(255, 0, 0, 1)">column</span><span style="color: rgba(0, 0, 255, 1)">="id"</span><span style="color: rgba(255, 0, 0, 1)"> property</span><span style="color: rgba(0, 0, 255, 1)">="id"</span><span style="color: rgba(255, 0, 0, 1)"> jdbcType</span><span style="color: rgba(0, 0, 255, 1)">="INTEGER"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">result </span><span style="color: rgba(255, 0, 0, 1)">column</span><span style="color: rgba(0, 0, 255, 1)">="userName"</span><span style="color: rgba(255, 0, 0, 1)"> property</span><span style="color: rgba(0, 0, 255, 1)">="useName"</span><span style="color: rgba(255, 0, 0, 1)"> jdbcType</span><span style="color: rgba(0, 0, 255, 1)">="VARCHAR"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">result </span><span style="color: rgba(255, 0, 0, 1)">column</span><span style="color: rgba(0, 0, 255, 1)">="password"</span><span style="color: rgba(255, 0, 0, 1)"> property</span><span style="color: rgba(0, 0, 255, 1)">="password"</span><span style="color: rgba(255, 0, 0, 1)"> jdbcType</span><span style="color: rgba(0, 0, 255, 1)">="VARCHAR"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">result </span><span style="color: rgba(255, 0, 0, 1)">column</span><span style="color: rgba(0, 0, 255, 1)">="age"</span><span style="color: rgba(255, 0, 0, 1)"> property</span><span style="color: rgba(0, 0, 255, 1)">="age"</span><span style="color: rgba(255, 0, 0, 1)"> jdbcType</span><span style="color: rgba(0, 0, 255, 1)">="INTEGER"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">result </span><span style="color: rgba(255, 0, 0, 1)">column</span><span style="color: rgba(0, 0, 255, 1)">="position"</span><span style="color: rgba(255, 0, 0, 1)"> property</span><span style="color: rgba(0, 0, 255, 1)">="position"</span><span style="color: rgba(255, 0, 0, 1)"> jdbcType</span><span style="color: rgba(0, 0, 255, 1)">="VARCHAR"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">resultMap</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>



<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">select </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="selectLibrarian"</span><span style="color: rgba(255, 0, 0, 1)"> parameterType</span><span style="color: rgba(0, 0, 255, 1)">="INTEGER"</span><span style="color: rgba(255, 0, 0, 1)"> resultMap</span><span style="color: rgba(0, 0, 255, 1)">="LibrarianMap"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
    select *
    from t_librarian 
    where 1=1
        and id = #{id,jdbcType=INTEGER}
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">select</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

</mapper>

第三行的 namespace 很重要噢,它是指定这个 xml 所对应的是哪个 dao(mapper)接口

resultMap 是做个 pojo 和数据库表的对应(这里只写个 Librarian 不用写全路径是因为做了设置,下面会说)

select 标签的 id 对应的就是 mapper 接口中的方法名,parameterType 就是传进来的参数类型

 

简单的配置与设置

好现在讲讲设置,这里会想到,那些 Controller 啊,@Service 啊还有 MyBatis 的注解 @Mapper 什么的 spring 怎么知道在哪呢?不用像 mvc 那样搞个扫描设置吗?

是的要的,这些我们在启动类做了简单的设置:

package com.example.main;

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

/**

  • 指定所扫的包,会自动扫描指定包下的全部标有 @Component 的类,并注册成 bean,
  • 当然包括 @Component 下的子注解 @Service,@Repository,@Controller。
  • @author 85060

/
@SpringBootApplication(scanBasePackages
={"com.example.
"})
@MapperScan(
"com.example.dao")
public class SpringBootDemoApplication {

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    SpringApplication.run(SpringBootDemoApplication.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">, args);
}

}

关于这个 SpringBootApplication,它其实是好几个注解的合体(之前的博客里有讲),所以可以直接在这写扫包的设置,然后那个 @MapperScan 是 MyBatis 提供的设置注解。

 

然后还有点配置文件:

spring.thymeleaf.cache=false        
spring.devtools.restart.enabled=true   
spring.devtools.restart.additional-paths=src/main/java  

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url
=jdbc:mysql://localhost:3306/db_library
spring.datasource.username=root
spring.datasource.password
=4008

mybatis.type-aliases-package=com.example.entity
mybatis.mapperLocations
=classpath:mappers/*.xml

主要有关的是第四行开始的,最后两行一个是设置基本包(包别名)也就是为什么在 mapper.xml 中可以只写一个 Librarian 的原因。

最后一行的很重要,是告诉系统在哪里去找 mapper.xml 文件。

 

上一个最后的效果图:

再放一个项目结构图:

 

 

放两个 springboot 和 mybatis 整合讲得比较好的博客供参考:

https://blog.csdn.net/gebitan505/article/details/54929287(要是着看到这个就省好多功夫了!)

https://blog.csdn.net/blackwoodcliff/article/details/50776155