微信公衆號:一個優秀的廢人 若有問題或建議,請後臺留言,我會盡力解決你的問題。php
如題,今天介紹 SpringBoot 與 Mybatis 的整合以及 Mybatis 的使用,本文經過註解的形式實現。前端
MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 能夠對配置和原生 Map 使用簡單的 XML 或註解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成數據庫中的記錄。java
優勢:mysql
缺點:git
sql 語句,建立表,插入數據:github
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`age` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES ('1', 'aaa', '21');
INSERT INTO `student` VALUES ('2', 'bbb', '22');
INSERT INTO `student` VALUES ('3', 'ccc', '23');
複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nasus</groupId>
<artifactId>mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis</name>
<description>mybatis Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- 啓動 web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis 依賴 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- mysql 鏈接類 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- druid 數據庫鏈接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<!-- lombok 插件 用於簡化實體代碼 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
複製代碼
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
複製代碼
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
@Id
@GeneratedValue
private Integer id;
private String name;
private Integer age;
}
複製代碼
使用了 lombok 簡化了代碼。web
import com.nasus.mybatis.domain.Student;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
@Mapper
public interface StudentMapper {
@Insert("insert into student(name, age) values(#{name}, #{age})")
int add(Student student);
@Update("update student set name = #{name}, age = #{age} where id = #{id}")
int update(@Param("name") String name, @Param("age") Integer age, @Param("id") Integer id);
@Delete("delete from student where id = #{id}")
int delete(int id);
@Select("select id, name as name, age as age from student where id = #{id}")
Student findStudentById(@Param("id") Integer id);
@Select("select id, name as name, age as age from student")
List<Student> findStudentList();
}
複製代碼
這裏有必要解釋一下,@Insert 、@Update、@Delete、@Select 這些註解中的每個表明了執行的真實 SQL。 它們每個都使用字符串數組 (或單獨的字符串)。若是傳遞的是字符串數組,它們由每一個分隔它們的單獨空間串聯起來。這就當用 Java 代碼構建 SQL 時避免了「丟失空間」的問題。 然而,若是你喜歡,也歡迎你串聯單獨 的字符串。屬性:value,這是字符串 數組用來組成單獨的 SQL 語句。算法
@Param 若是你的映射方法的形參有多個,這個註解使用在映射方法的參數上就能爲它們取自定義名字。若不給出自定義名字,多參數(不包括 RowBounds 參數)則先以 "param" 做前綴,再加上它們的參數位置做爲參數別名。例如 #{param1},#{param2},這個是默認值。若是註解是 @Param("id"),那麼參數就會被命名爲 #{id}。spring
import com.nasus.mybatis.domain.Student;
import java.util.List;
public interface StudentService {
int add(Student student);
int update(String name, Integer age, Integer id);
int delete(Integer id);
Student findStudentById(Integer id);
List<Student> findStudentList();
}
複製代碼
實現類:sql
import com.nasus.mybatis.dao.StudentMapper;
import com.nasus.mybatis.domain.Student;
import com.nasus.mybatis.service.StudentService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper studentMapper;
/** * 添加 Student * @param name * @param age * @return */
@Override
public int add(Student student) {
return studentMapper.add(student);
}
/** * 更新 Student * @param name * @param age * @param id * @return */
@Override
public int update(String name, Integer age, Integer id) {
return studentMapper.update(name,age,id);
}
/** * 刪除 Student * @param id * @return */
@Override
public int delete(Integer id) {
return studentMapper.delete(id);
}
/** * 根據 id 查詢 Student * @param id * @return */
@Override
public Student findStudentById(Integer id) {
return studentMapper.findStudentById(id);
}
/** * 查詢全部的 Student * @return */
@Override
public List<Student> findStudentList() {
return studentMapper.findStudentList();
}
}
複製代碼
import com.nasus.mybatis.domain.Student;
import com.nasus.mybatis.service.StudentService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/Student")
public class StudentController {
@Autowired
private StudentService studentService;
@PostMapping("")
public int add(@RequestBody Student student){
return studentService.add(student);
}
@PutMapping("/{id}")
public int updateStudent(@PathVariable("id") Integer id, @RequestParam(value = "name", required = true) String name, @RequestParam(value = "age", required = true) Integer age){
return studentService.update(name,age,id);
}
@DeleteMapping("/{id}")
public void deleteStudent(@PathVariable("id") Integer id){
studentService.delete(id);
}
@GetMapping("/{id}")
public Student findStudentById(@PathVariable("id") Integer id){
return studentService.findStudentById(id);
}
@GetMapping("/list")
public List<Student> findStudentList(){
return studentService.findStudentList();
}
}
複製代碼
其餘接口已經過 postman 測試,無問題。
源碼下載:github 地址
以上爲 SpringBoot 實戰 (九) | 整合 Mybatis 的教程,除了註解方式實現之外,Mybatis 還提供了 XML 方式實現。想了解更多用法請移步官方文檔。
最後,對 Python 、Java 感興趣請長按二維碼關注一波,我會努力帶給大家價值,若是以爲本文對你哪怕有一丁點幫助,請幫忙點好看,讓更多人知道。
另外,關注以後在發送 1024 可領取免費學習資料。資料內容詳情請看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享