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)"><</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">></span>mysql<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">></span>mysql-connector-java<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">></span>org.mybatis.spring.boot<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">></span>mybatis-spring-boot-starter<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">version</span><span style="color: rgba(0, 0, 255, 1)">></span>1.3.0<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">version</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">></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)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 可根据自己的需求,是否要使用 </span><span style="color: rgba(0, 128, 0, 1)">--></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">resultMap</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">></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)"></</span><span style="color: rgba(128, 0, 0, 1)">select</span><span style="color: rgba(0, 0, 255, 1)">></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/javaspring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_library
spring.datasource.username=root
spring.datasource.password=4008mybatis.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