摘要:通過配置文件通過配置導入指定的使用的方式屬性的同學也可以通過配置通過配置先配置文件使用的方式再配置注意中對象需要添加托管給方能正常使用。建議與任選其一,建議使用通過注解的方式使用,當然如果習慣配置的方式也可以使用。
導讀:
在上篇文章中我們介紹了spring-data-jpa的一些常用方法,在這篇文章中我們在介紹關于mybatis與Spring Boot 的集成,及一些常用方法
集成:這里有兩種方式,一種是常規的Spring 應用的集成方式,一種就是Spring Boot 的應用的集成方式,本篇文章所使用的方式為第二種:(想了解第一種的同學可以點擊我)
1.添加pom依賴:2.兩種集成方式 a.通過注解:org.mybatis.spring.boot mybatis-spring-boot-starter 1.2.0
1).包掃描:
@SpringBootApplication @MapperScan("cn.sunxyz.mapper") public class SpringBootMybatisApplication { public static void main(String[] args) { SpringApplication.run(SpringBootMybatisApplication.class, args); } }
2).注解聲明:
@Mapper public interface UserMapper { }
二者任選其一即可,建議使用包掃描的方式。
b.通過配置文件1).通過yml配置
spring: datasource: ##導入指定的sql schema: import.sql url: jdbc:mysql://localhost:3306/spring-boot?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver platform: mysql #使用 yml的方式 mybatis: type-aliases-package: cn.sunxyz.domain mapper-locations: ["mapper/UserMapper.xml"]
屬性mybatis.xml的同學也可以通過xml配置
2).通過xml配置
<1>.先配置yml文件
#使用 xml的方式 mybatis: config-location: mybatis-config.xml
<2>.再配置mybatis-config.xml
注意:b.1,b.2中 XXXMapper對象需要添加@Mapper托管給Spring Boot方能正常使用。
建議:a與b任選其一,建議使用a.通過注解 的方式使用,當然如果習慣xml配置的方式也可以使用xml。
(也許稱為三種會更好些)
實體類對象
public class User { private Integer id; private String name; private String password; /**省略set/get**/ }a.注解
1).普通查詢(簡單查詢):
@Mapper public interface UserMapper { // 獲取主鍵 @Insert("INSERT INTO user(name,password) VALUES (#{name}, #{password}) ") @Options(useGeneratedKeys = true, keyProperty = "id") int insert(User user); @Delete("DELETE FROM user WHERE id = #{id}") int delete(@Param("id") Integer id); @Update("UPDATE user SET name = #{name}, password = #{password} WHERE id = #{id}") int update(User user); @Select("SELECT id, name, password FROM user WHERE id = #{id}") @Results(id = "userMap", value = { @Result(column = "id", property = "id", javaType = Integer.class), @Result(column = "name", property = "name", javaType = String.class), @Result(column = "password", property = "password", javaType = String.class) }) User findById(Integer id); @Select("SELECT * FROM user") @ResultMap("userMap") ListfingAll(); }
2).復雜查詢(動態sql):
mappper對象:
@Mapper public interface UserMapper { // 動態生成sql @SelectProvider(type = UserMapperProvider.class, method = "findByNameLike") ListfindByNameLike(String name); //多參使用map @SelectProvider(type = UserMapperProvider.class, method = "findByNameAndPassword") List findByNameAndPassword(String name, String password); @InsertProvider(type = UserMapperProvider.class, method = "insert") int insertUser(User user); @DeleteProvider(type = UserMapperProvider.class, method = "delete") int deleteUser(Integer id); }
mappperProvider對象:
public class UserMapperProvider { // 動態生成sql public String findByName(String name) { String sql = "SELECT * FROM user"; if (StringUtils.isEmpty(name)) { return sql; } sql += " WHERE name LIKE "%" + name + "%""; return sql; } // 使用工具類來準備相同的 SQL 語句 public String findByNameLike(String name) { return new SQL() { { SELECT("id, name, password"); FROM("user"); WHERE("name LIKE "%" + name + "%""); } }.toString(); } public String findByNameAndPassword(Mapb).xml的方式:map) { String name = (String) map.get("param1"); String password = (String) map.get("param2"); return new SQL() { { SELECT("id, name, password"); FROM("user"); WHERE("name = " + name); AND(); WHERE("password = " + password); } }.toString(); } public String update(User user) { return new SQL() { { if (!StringUtils.isEmpty(user.getId())) { UPDATE("user"); if (!StringUtils.isEmpty(user.getName())) { SET("name = #{name}"); } if (user.getPassword() != null) { SET("password = #{password}"); } WHERE("id = #{id}"); } } }.toString(); } public String insert(User user) { return new SQL() { { INSERT_INTO("user"); VALUES("name", "#{name}"); VALUES("password", "#{password}"); } }.toString(); } public String delete(Integer id) { return new SQL() { { DELETE_FROM("user"); WHERE("id = #{id}"); } }.toString(); } }
3.xml配置方式:
mapper對象:
@Mapper public interface UserMapper { int insertUserXml(User user); }
mapper.xml文件:
混合:
4).注解/xml 混合
這兩種方式可以配合使用比如:
@Mapper public interface UserMapper { int insertUserXml(User user); @Delete("DELETE FROM user WHERE id = #{id}") int delete(@Param("id") Integer id); }
省略mapper.xml文件
建議: 一般情況下不建議用混合,如果有簡單的查詢和復雜的查詢,建議1).普通查詢(簡單查詢) 與 3.xml配置方式 進行混合查詢
添加pom依賴:
com.github.pagehelper pagehelper 4.1.0
添加配置:
@Configuration public class MyBatisConfiguration { @Bean public PageHelper pageHelper() { PageHelper pageHelper = new PageHelper(); Properties p = new Properties(); p.setProperty("offsetAsPageNum", "true"); p.setProperty("rowBoundsWithCount", "true"); p.setProperty("reasonable", "true"); pageHelper.setProperties(p); return pageHelper; } }
使用:
public void contextLoads() { PageHelper.startPage(1,2);//無法與 注解生成動態sql同步使用 Listusers = userMapper.fingAll(); // List users = userMapper.findByNameLike("user"); logger.info(users.toString()); }
坑: 在使用2).復雜查詢(動態sql) 進行查詢時會出現異常,如果你正打算使用PageHelper一定要多加留意。
結語:拖了好久終于又開動了,這篇文章中還有許多內容沒有講到,MyBatis中還有很多東西與細節需要留意,如果在開發中不會有太多的負責查詢建議使用Spring Data JPA 。
參考資料:Spring Boot整合MyBatis
第五章 springboot + mybatis
SpringBoot集成mybatis 推薦里面有一些關于MyBatis內容的擴展
Spring Boot MyBatis連接Mysql數據庫【從零開始學Spring Boot】
官方文檔
MyBatis入門學習教程(推薦)
Mybatis操作MySql數據庫
mybaits學習文檔(推薦參考后面的注解文檔)
彩蛋
之前寫的一個例子 spring-boot-mybatis
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66887.html
摘要:主要有兩種解決方案,一種是使用注解解決一切問題,一種是簡化后的老傳統。新建項目默認為,直接改為,另外新增一個用戶不同環境使用不同的配置文件用。配置指定配置文件為配置開啟駝峰命名轉換,如。 倉庫地址:spring-boot-learning歡迎star、fork,給作者一些鼓勵 前言 Mybatis 初期使用比較麻煩,需要各種配置文件、實體類、Dao 層映射關聯、還有一大推其它配置。my...
摘要:引入了新的環境和概要信息,是一種更揭秘與實戰六消息隊列篇掘金本文,講解如何集成,實現消息隊列。博客地址揭秘與實戰二數據緩存篇掘金本文,講解如何集成,實現緩存。 Spring Boot 揭秘與實戰(九) 應用監控篇 - HTTP 健康監控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:本文章的源碼再文章末尾什么是查詢緩存有一級緩存和二級緩存。默認開啟一級緩存。證明了一級緩存只是在數據庫會話內部共享的。但是,整合到中后,一級緩存就會被關閉。根據時間表比如沒有刷新間隔緩存不會以任何時間順序來刷新。 倉庫地址:spring-boot-learning歡迎star、fork,給作者一些鼓勵 學習SpringBoot集成Mybatis的第二章,了解到Mybatis自帶的緩存機...
摘要:本文章的源碼再文章末尾什么是查詢緩存有一級緩存和二級緩存。默認開啟一級緩存。證明了一級緩存只是在數據庫會話內部共享的。但是,整合到中后,一級緩存就會被關閉。根據時間表比如沒有刷新間隔緩存不會以任何時間順序來刷新。 倉庫地址:spring-boot-learning歡迎star、fork,給作者一些鼓勵 學習SpringBoot集成Mybatis的第二章,了解到Mybatis自帶的緩存機...
閱讀 1536·2021-11-24 10:17
閱讀 1031·2021-09-29 09:43
閱讀 2164·2021-09-23 11:21
閱讀 2159·2019-08-30 14:13
閱讀 1295·2019-08-29 13:58
閱讀 3157·2019-08-28 17:51
閱讀 1803·2019-08-26 13:29
閱讀 2973·2019-08-26 10:13