摘要:提供映射標簽,支持對象與數據庫的字段關系映射提供對象關系映射標簽,支持對象關系組建維護提供標簽,支持編寫動態。層實現類添加更新刪除根據查詢查詢所有的層構建測試結果其他接口已通過測試,無問題。
微信公眾號:一個優秀的廢人前言
如有問題或建議,請后臺留言,我會盡力解決你的問題。
如題,今天介紹 SpringBoot 與 Mybatis 的整合以及 Mybatis 的使用,本文通過注解的形式實現。
什么是 MybatisMyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以對配置和原生 Map 使用簡單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成數據庫中的記錄。
優點:
簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個 jar 文件+配置幾個 sql 映射文件易于學習,易于使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
靈活:mybatis 不會對應用程序或者數據庫的現有設計強加任何影響。 sql 寫在 xml 里,便于統一管理和優化。通過 sql 基本上可以實現我們不使用數據訪問框架可以實現的所有功能,或許更多。
解除 sql 與程序代碼的耦合:通過提供 DAL 層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql 和代碼的分離,提高了可維護性。
提供映射標簽,支持對象與數據庫的 orm 字段關系映射
提供對象關系映射標簽,支持對象關系組建維護
提供xml標簽,支持編寫動態 sql。
缺點:
編寫 SQL 語句時工作量很大,尤其是字段多、關聯表多時,更是如此。
SQL 語句依賴于數據庫,導致數據庫移植性差,不能更換數據庫。
框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層數據庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速數據庫修改。
二級緩存機制不佳
準備工作IDEA
JDK1.8
SpringBoot 2.1.3
sql 語句,創建表,插入數據:
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");pom.xml 文件配置依賴
application.yaml 配置文件4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.3.RELEASE com.nasus mybatis 0.0.1-SNAPSHOT mybatis mybatis Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 2.0.0 mysql mysql-connector-java runtime com.alibaba druid 1.1.9 org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.hibernate.javax.persistence hibernate-jpa-2.1-api 1.0.0.Final org.springframework.boot spring-boot-maven-plugin
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 簡化了代碼。
dao 層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") ListfindStudentList(); }
這里有必要解釋一下,@Insert 、@Update、@Delete、@Select 這些注解中的每一個代表了執行的真實 SQL。 它們每一個都使用字符串數組 (或多帶帶的字符串)。如果傳遞的是字符串數組,它們由每個分隔它們的多帶帶空間串聯起來。這就當用 Java 代碼構建 SQL 時避免了“丟失空間”的問題。 然而,如果你喜歡,也歡迎你串聯多帶帶 的字符串。屬性:value,這是字符串 數組用來組成多帶帶的 SQL 語句。
@Param 如果你的映射方法的形參有多個,這個注解使用在映射方法的參數上就能為它們取自定義名字。若不給出自定義名字,多參數(不包括 RowBounds 參數)則先以 "param" 作前綴,再加上它們的參數位置作為參數別名。例如 #{param1},#{param2},這個是默認值。如果注解是 @Param("id"),那么參數就會被命名為 #{id}。
service 層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); ListfindStudentList(); }
實現類:
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 Listcontroller 層構建 restful APIfindStudentList() { 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測試結果findStudentList(){ return studentService.findStudentList(); } }
其他接口已通過 postman 測試,無問題。
源碼下載:github 地址
后語以上為 SpringBoot 實戰 (九) | 整合 Mybatis 的教程,除了注解方式實現以外,Mybatis 還提供了 XML 方式實現。想了解更多用法請移步官方文檔。
最后,對 Python 、Java 感興趣請長按二維碼關注一波,我會努力帶給你們價值,如果覺得本文對你哪怕有一丁點幫助,請幫忙點好看,讓更多人知道。
另外,關注之后在發送 1024 可領取免費學習資料。資料內容詳情請看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73369.html
摘要:引入了新的環境和概要信息,是一種更揭秘與實戰六消息隊列篇掘金本文,講解如何集成,實現消息隊列。博客地址揭秘與實戰二數據緩存篇掘金本文,講解如何集成,實現緩存。 Spring Boot 揭秘與實戰(九) 應用監控篇 - HTTP 健康監控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:如要運行多次,請把上次生成的映射文件代碼刪除再運行。層啟動類掃描接口,必須加上提一嘴,這個注解非常的關鍵,這個對應了項目中所對應的包路徑,必須加上,否則會導致異常。另外,關注之后在發送可領取免費學習資料。 微信公眾號:一個優秀的廢人如有問題或建議,請后臺留言,我會盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 與 Mybatis 的整合以及 Mybatis 的使用,之前...
摘要:前提好幾周沒更新博客了,對不斷支持我博客的童鞋們說聲抱歉了。熟悉我的人都知道我寫博客的時間比較早,而且堅持的時間也比較久,一直到現在也是一直保持著更新狀態。 showImg(https://segmentfault.com/img/remote/1460000014076586?w=1920&h=1080); 前提 好幾周沒更新博客了,對不斷支持我博客的童鞋們說聲:抱歉了!。自己這段時...
閱讀 869·2021-11-18 10:02
閱讀 1668·2019-08-30 15:56
閱讀 2569·2019-08-30 13:47
閱讀 2639·2019-08-29 12:43
閱讀 851·2019-08-29 11:19
閱讀 1782·2019-08-28 18:23
閱讀 2668·2019-08-26 12:23
閱讀 3006·2019-08-23 15:29