Spring Boot整合MyBatis调用数据库

写博客有时候需要一点小情调,以后就每次以应景的诗开始吧。
                        泊秦淮 杜牧
                    烟笼寒水月笼沙,夜泊秦淮近酒家。
                    商女不知亡国恨,隔江犹唱后庭花。
     Spring Boot整合MyBatis调用数据库

写这篇博客的起因:
  工作中使用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.创建启动类
@RestController
public class CourseController {
    @Autowired
    private CourseManager courseManager;

    @GetMapping(value = "/findCourseById")
    public String findCourseById(@RequestParam("id") Long id) {
        return courseManager.findCourseById(id);
    }
}

这样最小的Spring boot就创建好了

三、相应逻辑

1.Controller层
/**
 * @Author chenshuai
 * @data 2019/3/23 14:56
 */
@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

Spring Boot整合MyBatis调用数据库

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两个地方,啰嗦了这么多。