全民學後端快餐教程(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