写这篇博客的起因:
工作中使用mybatis,知道怎么用,但是他是怎么与Spring boot整合使用不太清楚。
看书上说使用mybatis的时候,需要先使用SqlSessionFactoryBuilder创建一个单例的SqlSessionFactory(数据库线程池),然后使用SqlSessionFactory生产出SqlSession(数据库连接),并且还需要加载Dao层,还需要在MyBatis-Config.xml里面配置映射文件,看起来真是很复杂啊,但是我在Spring boot框架的时候并没有需要如此多的配置。因此我配了一个最小的Spring boot 和Mybatis整合的框架。
注:假如你只需要看如何配置MyBatis,请直接跳到第四点,跳过开始的三点。喜欢看源代码的直接跳过看源代码,git 仓库地址如下:https://github.com/ShuaiChenL/mybatis
一、创建Maven项目
1.创建一个maven项目,使用modules添加两个模块
如下:
<modules>
<module>mybatis-test-0323-api</module>
<module>mybatis-test-0323-impl</module>
</modules>
2.创建api和impl模块,impl依赖于api
1.) api 和 impl都需要添加一个spring-boot-start-parent,如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
2.)impl模块需要依赖api,
<!-- 依赖api -->
<dependency>
<groupId>com.shanghai.uofst</groupId>
<artifactId>mybatis-test-0323-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
二、创建Spring Boot项目
1.引入spring boot web start依赖
<!-- spring boot 启动文件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.创建启动类
@SpringBootApplication
@MapperScan("com.shanghai.uofst.dao.course")
public class SpringBootStart {
public static void main(String[] args) {
SpringApplication.run(SpringBootStart.class, args);
}
}
这样最小的Spring boot就创建好了
三、相应逻辑
1.Controller层
@RestController
@RequestMapping("/course")
public class CourseController {
@Autowired
private CourseManager courseManager;
@GetMapping(value = "/findCourseById")
public String findCourseById(@RequestParam("id") Long id) {
return courseManager.findCourseById(id);
}
}
2.Manager层
public interface CourseManager {
/***
* 通过id找课程
* @return
*/
String findCourseById(Long id);
}
3.manager impl层
@Service("courseManager")
public class CourseManagerImpl implements CourseManager {
@Autowired
private CourseDao courseDao;
@Override
public String findCourseById(Long id) {
Course course = courseDao.findCourseById(id);
return " id : " + course.getId()
+ "\n courseId : " + course.getCourseId()
+ "\n title : " + course.getCourseId()
+ "\n dept_name : " + course.getDeptName()
+ "\n credits : " + course.getCredits();
}
}
4.dao层
public interface CourseDao {
/**
* 根据id查找课程信息
* @param id
* @return
*/
Course findCourseById(@Param("id") Long id);
}
5.Model(在api模块,其他的都在impl模块)
@Data
public class Course extends BaseModel {
private static final long serialVersionUID = -8035953895041685970L;
/** 课程id*/
private String courseId;
/** 课程名称 */
private String title;
/** 院系 */
private String deptName;
/** 学分 */
private String credits;
}
这里的@Data使用的lombok(不用写get、set、toString方法,简洁代码),引入相应的依赖即可:
<!-- lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
6.映射文件
然后我们再写对应的映射文件CourseMapper-ext.xml
<mapper namespace="com.shanghai.uofst.dao.course.CourseDao">
<resultMap id="CourseResultExt" type="com.shanghai.uofst.model.Course">
</resultMap>
<sql id="CourseColumnsExt">
id as id,
course_id as courseId,
title as title,
dept_name as deptName,
credits as credits
</sql>
<select id="findCourseById" resultMap="CourseResultExt">
select <include refid="CourseColumnsExt"/>
from course
where id = #{id}
</select>
</mapper>
是的,那么到现在应该怎么办呢,我们有一个数据库,我们应该怎么才能使我们的Dao层能调通数据库,怎么样才能使mybatis发挥它的作用呢?配置
四、配置相关mybatis文件
1.application文件
使用如下语句:
mybatis.mapper-location : 放映射的地址
mybatis.config-location:放mabatis配置的地址
type-aliases-package:放model的地址
下面展示application.xml里面的配置,上面是数据库的配置信息,下面为mybatis的配置
spring:
application:
name: mybatis-test-0323
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/cheney
username: root
password: password
server:
port: 2510
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/**/*.xml
type-aliases-package: com.shanghai.uofst.model
2.数据库驱动需要添加依赖(不然会报错)
<!-- 引入数据库Driver依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
3.添加 Mybatis spring boot starter依赖
<!-- 引入Mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
4.启动类添加dao扫描(在这里映射dao层的接口,spring boot很神奇)
@RequestMapping("/course")
@RestController
@RequestMapping("/course")
public class CourseController {
@Autowired
private CourseManager courseManager;
@GetMapping(value = "/findCourseById")
public String findCourseById(@RequestParam("id") Long id) {
return courseManager.findCourseById(id);
}
}
这样就配置完毕,即可使用。这里其实需要注意的是application.yml和@MapperScan两个地方,啰嗦了这么多。