天天看點

全民學後端快餐教程(3) - 使用MyBatis通路資料庫全民學後端快餐教程(3) - 使用MyBatis通路資料庫

全民學後端快餐教程(3) - 使用MyBatis通路資料庫

上節我們學習了JdbcTemplate來通路資料庫,比起使用原始的JDBC來,還是友善很多的。至少不用去處理大量的Exception。

但是我們還是可以通過一些架構,使工作量變得更少一些。這方面的主流選擇是MyBatis.

MyBatis簡介

MyBatis是由iBatis發展而來的。iBatis最早是由Clinton Begin于2001年開發,後來在2004年捐贈給了Apache基金會。

2010年,iBatis團隊決定從Apache項目中分離出來,并改名myBatis.

MyBatis是支援SQL, 存儲過程和進階映射的持久層架構。

用MyBatis通路資料庫

略不幸的是,myBatis沒有Spring Boot的官方支援,但是myBatis團隊自己提供了與Spring Boot的整合。

引用MyBatis

首先我們引入與Spring Boot配合的依賴。

<!-- MyBatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>           

Mapper

MyBatis通過Mapper的方式來實作SQL語句與函數調用之間的映射。

下面我們寫兩個查詢的SQL語句。需要替換的參數,用#{變量名}來代替就好:

package cn.alios.system.service.prefix;

import cn.alios.system.service.prefix.pojo.Issue;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface IssueMapper {
    @Select("select id, filename, linenum, issuestring from issue where id = #{id};")
    Issue findIssue(Long id);

    @Select("select id, filename, linenum, issuestring from issue where filename like concat('%', #{filename}, '%');")
    Issue findIssueByFileName(String filename);
}           

調用Mapper實作查詢

我們還是先通過@Autowired将issueMapper自動裝配進來:

@Autowired
    IssueMapper issueMapper = null;           

然後就調用就好啦:

@RequestMapping("/findbyid")
    @ResponseBody
    public String testFindById() {
        Issue issue = issueMapper.findIssue((long) 1);
        if (issue != null) {
            return issue.getFilename() + "," + issue.getIssuestring()+ ":" + issue.getLinenum();
        } else {
            return "Test MyBatis failed!";
        }
    }           

我們看下完整的Controller的代碼:

package cn.alios.system.service.prefix.controller;

import cn.alios.system.service.prefix.IssueMapper;
import cn.alios.system.service.prefix.pojo.Issue;
import cn.alios.system.service.prefix.service.JdbcTemplateIssueServiceImpl;
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
@RequestMapping("/test")
public class TestController {
    @Autowired
    JdbcTemplateIssueServiceImpl jdbcTemplateIssueService = null;

    @Autowired
    IssueMapper issueMapper = null;

    @RequestMapping("/")
    @ResponseBody
    public String test() {
        Issue issue = jdbcTemplateIssueService.getIssue((long) 1);
        if (issue != null) {
            return issue.getFilename() + "," + issue.getIssuestring();
        } else {
            return "Test Controller!";
        }
    }

    @RequestMapping("/findbyid")
    @ResponseBody
    public String testFindById() {
        Issue issue = issueMapper.findIssue((long) 1);
        if (issue != null) {
            return issue.getFilename() + "," + issue.getIssuestring()+ ":" + issue.getLinenum();
        } else {
            return "Test MyBatis failed!";
        }
    }

    @RequestMapping("/findbyfilename")
    @ResponseBody
    public String testFindByFileName() {
        Issue issue = issueMapper.findIssueByFileName("test");
        if (issue != null) {
            return issue.getFilename() + "," + issue.getIssuestring()+ ":" + issue.getLinenum();
        } else {
            return "Test MyBatis failed!";
        }
    }
}           

測試一下,mvn package,然後運作。

在browser中測試一下:

http://127.0.0.1:8080/test/findbyfilename

輸出如下:test.java,test:1