1. 程式人生 > >Spring Boot整合mybatis全註解入門教程

Spring Boot整合mybatis全註解入門教程

一、簡介
MyBatis是支援自定義SQL,儲存過程和高階對映的第一類永續性框架。MyBatis消除了幾乎所有的JDBC程式碼以及手動設定引數和檢索結果。MyBatis可以使用簡單的XML或Annotations來配置和對映原語,Map介面和Java POJO(普通舊Java物件)到資料庫記錄。(官網簡介)
二、引入依賴

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId
>
<artifactId>spring-boot-dependencies</artifactId> <version>2.0.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement
>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId
>
<artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.9-rc</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency> </dependencies>

三、配置mybatis
首先需要配置資料來源,本例使用c3p0

@Data
@EnableAutoConfiguration
public class MybatisConfig {
    @Autowired
    private ComboPooledDataSource dataSource;

    @Bean
    public SqlSessionFactory getSqlSessionFactory(){
        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource);
            return sqlSessionFactoryBean.getObject();
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    @Bean
    public SqlSessionTemplate getSqlSessionTemplate() {
        return new SqlSessionTemplate(getSqlSessionFactory());
    }
}

四、使用註解
建立三個表:學生表(student)、課程表(course)和中間表選課表(score)
學生表資料
課程表資料
選課標資料
建立StudentDao

//Mapper和Component註解同時使用的作用是使得Maybatis的sqlSessionTemplate自動掃面Mapper
@Mapper
@Component
public interface StudentDao {
    //注意#和$的區別,mybatis 在對sql語句進行預編譯之前,會對 sql 進行動態解析。
    // #{}預編譯之後是一個佔位符?
    // ${}預編譯以後直接是替換作用

    @Select({"SELECT * FROM student WHERE id = #{id}"})
    @Results(id ="id",//id是對映結果的名稱
            value = {@Result(property = "courseList", column = "id", many = @Many(select = "com.yyh.dao.CourseDao.selectCoursesByStudentId")),//這是一個一對多
                    @Result(property = "id",column = "id")//表的主鍵,不配置此項,查詢出來id會被設定為0
            }
    )
    Student findStudentById(int id);

    @Select("SELECT * FROM student")
    List<Student> findAllStudent();
}

建立CourseDao

@Mapper
@Component
public interface CourseDao {
    @Insert("INSERT INTO course (`name`,`teacher`) VALUES (#{name},#{teacher})")
    int insertCourse(Course course);


    @Select("SELECT * FROM course WHERE id IN (SELECT course_id FROM score WHERE student_id = #{studentId})")
    List<Course> selectCoursesByStudentId(@Param("studentId") int studentId);
}

實體類如下

@Data
public class Student {
    private int id;
    private String code;
    private String name;
    private String age;
    private String phoneNo;
    private List<Course> courseList;
}
@Data
public class Course {
    private int id;
    private String name;
    private String teacher;
    private List<Student> studentList;
}

五、測試
查詢一個學生資訊和他所選課程

{
    "id": 1,
    "code": "Q150",
    "name": "張三",
    "age": "12",
    "phoneNo": "18857121034",
    "courseList": [
        {
            "id": 2,
            "name": "數學",
            "teacher": "Brain"
        },
        {
            "id": 3,
            "name": "java",
            "teacher": "Snow"
        },
        {
            "id": 1,
            "name": "英語",
            "teacher": "Michael"
        },
        {
            "id": 4,
            "name": "python",
            "teacher": "Smith"
        }
    ]
}

六、常用註解說明

註解 使用物件 相對應的 XML 描述
@CacheNamespace <cache> 為給定的名稱空間(比如類)配置快取。屬性有:implemetation, eviction, flushInterval, size, readWrite, blocking 和properties。
@Property N/A <property> 指定引數值或佔位值(placeholder)(能被 mybatis-config.xml內的配置屬性覆蓋)。屬性有:name, value。(僅在MyBatis 3.4.2以上版本生效)
@CacheNamespaceRef <cacheRef> 參照另外一個名稱空間的快取來使用。屬性有:value, name。如果你使用了這個註解,你應設定 value 或者 name 屬性的其中一個。value 屬性用於指定 Java 型別而指定名稱空間(名稱空間名就是指定的 Java 型別的全限定名),name 屬性(這個屬性僅在MyBatis 3.4.2以上版本生效)直接指定了名稱空間的名字。
@ConstructorArgs 方法 <constructor> 收集一組結果傳遞給一個結果物件的構造方法。屬性有:value,它是形式引數陣列。
@Arg N/A <arg> <idArg> 單引數構造方法,是 ConstructorArgs 集合的一部分。屬性有:id, column, javaType, jdbcType, typeHandler, select 和 resultMap。id 屬性是布林值,來標識用於比較的屬性,和<idArg> XML 元素相似。
@TypeDiscriminator 方法 <discriminator> 一組例項值被用來決定結果對映的表現。屬性有:column, javaType, jdbcType, typeHandler 和 cases。cases 屬性是例項陣列。
@Case N/A <case> 單獨例項的值和它對應的對映。屬性有:value, type, results。results 屬性是結果陣列,因此這個註解和實際的 ResultMap 很相似,由下面的 Results 註解指定。
@Results 方法 <resultMap> 結果對映的列表,包含了一個特別結果列如何被對映到屬性或欄位的詳情。屬性有:value, id。value 屬性是 Result 註解的陣列。這個 id 的屬性是結果對映的名稱。
@Result N/A <result> <id> 在列和屬性或欄位之間的單獨結果對映。屬性有:id, column, javaType, jdbcType, typeHandler, one, many。id 屬性是一個布林值,來標識應該被用於比較(和在 XML 對映中的<id>相似)的屬性。one 屬性是單獨的聯絡,和 <association> 相似,而 many 屬性是對集合而言的,和<collection>相似。它們這樣命名是為了避免名稱衝突。
@One N/A <association> 複雜型別的單獨屬性值對映。屬性有:select,已對映語句(也就是對映器方法)的全限定名,它可以載入合適型別的例項。fetchType會覆蓋全域性的配置引數 lazyLoadingEnabled。注意 聯合對映在註解 API中是不支援的。這是因為 Java 註解的限制,不允許迴圈引用。
@Many N/A <collection> 對映到複雜型別的集合屬性。屬性有:select,已對映語句(也就是對映器方法)的全限定名,它可以載入合適型別的例項的集合,fetchType 會覆蓋全域性的配置引數 lazyLoadingEnabled。注意 聯合對映在註解 API中是不支援的。這是因為 Java 註解的限制,不允許迴圈引用
@MapKey 方法 這是一個用在返回值為 Map 的方法上的註解。它能夠將存放物件的 List 轉化為 key 值為物件的某一屬性的 Map。屬性有: value,填入的是物件的屬性名,作為 Map 的 key 值。
@Options 方法 對映語句的屬性 這個註解提供訪問大範圍的交換和配置選項的入口,它們通常在對映語句上作為屬性出現。Options 註解提供了通俗易懂的方式來訪問它們,而不是讓每條語句註解變複雜。屬性有:useCache=true, flushCache=FlushCachePolicy.DEFAULT, resultSetType=FORWARD_ONLY, statementType=PREPARED, fetchSize=-1, timeout=-1, useGeneratedKeys=false, keyProperty=”id”, keyColumn=”“, resultSets=”“。值得一提的是, Java 註解無法指定 null 值。因此,一旦你使用了 Options 註解,你的語句就會被上述屬性的預設值所影響。要注意避免預設值帶來的預期以外的行為。        注意: keyColumn 屬性只在某些資料庫中有效(如 Oracle、PostgreSQL等)。請在插入語句一節檢視更多關於 keyColumn 和 keyProperty 兩者的有效值詳情。
@Insert @Update @Delete @Select 方法 <insert> <update> <delete> <select> 這四個註解分別代表將會被執行的 SQL 語句。它們用字串陣列(或單個字串)作為引數。如果傳遞的是字串陣列,字串之間先會被填充一個空格再連線成單個完整的字串。這有效避免了以 Java 程式碼構建 SQL 語句時的“丟失空格”的問題。然而,你也可以提前手動連線好字串。屬性有:value,填入的值是用來組成單個 SQL 語句的字串陣列。
@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider 方法 <insert> <update> <delete> <select> 允許構建動態 SQL。這些備選的 SQL 註解允許你指定類名和返回在執行時執行的 SQL 語句的方法。(自從MyBatis 3.4.6開始,你可以用 CharSequence 代替 String 來返回型別返回值了。)當執行對映語句的時候,MyBatis 會例項化類並執行方法,類和方法就是填入了註解的值。你可以把已經傳遞給對映方法了的物件作為引數,”Mapper interface type” 和 “Mapper method” 會經過 ProviderContext (僅在MyBatis 3.4.5及以上支援)作為引數值。(MyBatis 3.4及以上的版本,支援多引數傳入)屬性有: type, method。type 屬性需填入類。method 需填入該類定義了的方法名。注意 接下來的小節將會討論類,能幫助你更輕鬆地構建動態 SQL。
@Param 引數 N/A 如果你的對映方法的形參有多個,這個註解使用在對映方法的引數上就能為它們取自定義名字。若不給出自定義名字,多引數(不包括 RowBounds 引數)則先以 “param” 作字首,再加上它們的引數位置作為引數別名。例如 #{param1}, #{param2},這個是預設值。如果註解是 @Param(“person”),那麼引數就會被命名為 #{person}。
@SelectKey 方法 <selectKey> 這個註解的功能與 <selectKey> 標籤完全一致,用在已經被 @Insert 或 @InsertProvider 或 @Update 或 @UpdateProvider 註解了的方法上。若在未被上述四個註解的方法上作 @SelectKey 註解則視為無效。如果你指定了 @SelectKey 註解,那麼 MyBatis 就會忽略掉由 @Options 註解所設定的生成主鍵或設定(configuration)屬性。屬性有:statement 填入將會被執行的 SQL 字串陣列,keyProperty 填入將會被更新的引數物件的屬性的值,before 填入 true 或 false 以指明 SQL 語句應被在插入語句的之前還是之後執行。resultType 填入 keyProperty 的 Java 型別和用 Statement、 PreparedStatement 和 CallableStatement 中的 STATEMENT、 PREPARED 或 CALLABLE 中任一值填入 statementType。預設值是 PREPARED。
@ResultMap 方法 N/A 這個註解給 @Select 或者 @SelectProvider 提供在 XML 對映中的 <resultMap> 的id。這使得註解的 select 可以複用那些定義在 XML 中的 ResultMap。如果同一 select 註解中還存在 @Results 或者 @ConstructorArgs,那麼這兩個註解將被此註解覆蓋。
@ResultType 方法 N/A 此註解在使用了結果處理器的情況下使用。在這種情況下,返回型別為 void,所以 Mybatis 必須有一種方式決定物件的型別,用於構造每行資料。如果有 XML 的結果對映,請使用 @ResultMap 註解。如果結果型別在 XML 的 <select> 節點中指定了,就不需要其他的註解了。其他情況下則使用此註解。比如,如果 @Select 註解在一個將使用結果處理器的方法上,那麼返回型別必須是 void 並且這個註解(或者@ResultMap)必選。這個註解僅在方法返回型別是 void 的情況下生效。
@Flush 方法 N/A 如果使用了這個註解,定義在 Mapper 介面中的方法能夠呼叫 SqlSession#flushStatements() 方法。(Mybatis 3.3及以上)

七、其他配置
applicant.properties檔案

#為空的屬性在轉換時忽略掉
spring.jackson.default-property-inclusion=non_empty

#將資料庫中下劃線命名風格自動轉換為駝峰式命名風格
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=30
mybatis.configuration.auto-mapping-unknown-column-behavior=WARNING

相關推薦

Spring Boot整合mybatis註解入門教程

一、簡介 MyBatis是支援自定義SQL,儲存過程和高階對映的第一類永續性框架。MyBatis消除了幾乎所有的JDBC程式碼以及手動設定引數和檢索結果。MyBatis可以使用簡單的XML或Annotations來配置和對映原語,Map介面和Java POJO

spring boot整合mybatis基於註解開發以及動態sql的使用

  讓我們回憶一下上篇部落格中mybatis是怎樣發揮它的作用的,主要是三類檔案,第一mapper介面,第二xml檔案,第三全域性配置檔案(application.properties),而今天我們就是來簡化mybatis的工作的——利用註解替代xml配置檔案。   先貼出mapper介面程式碼 @

Spring Boot 整合 Mybatis Annotation 註解的完整 Web 案例

摘要: 原創出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉載,保留摘要,謝謝! 『 公司需要人、產品、業務和方向,方向又要人、產品、業務和方向,方向… 迴圈』 本文提綱 一、前言 二、執行 springboot-mybatis-annotation 工程 三、spr

SpringBoot自學教程 | 第四篇:Spring Boot整合mybatis

整合 com 字段 apach param pack image ice rac   引入依賴   1:在pom文件引入mybatis-spring-boot-starter的依賴: 1 <dependency> 2 <groupId>

dubbox在異構系統中的使用-整合mybatis註解方式到spring

原來在spring中使用mybatis一直採用了mapper-xml配置檔案方式,編寫Mapper介面檔案,然後編寫對應的sql指令碼xml配置檔案,最後在spring-context.xml配置檔案中配置mapper。得益於eclipse良好的程式碼提示功能,整合並不困難。

spring boot整合mybatis深坑之c3p0的詳細配置

text context ati reat source ast type fig oot 項目地址:https://gitee.com/zhangjunqing/spring-boot/tree/master/springboot-mybatis-notice 本人在c3

spring boot 整合mybatis

參考 plugins odin system stack name incr xmlns xsd 參考: http://blog.csdn.net/saytime/article/details/74783296 spring boot可以使用全註解的方式進行開發,極大的提

spring boot整合mybatis+mybatis-plus

可靠 nic false system ttr .post 代碼生成 -i filters Spring boot對於我來說是一個剛接觸的新東西,學習過程中,發現這東西還是很容易上手的,Spring boot沒配置時會默認使用Spring data jpa,這東西可以說一個

企業分布式微服務雲SpringCloud SpringBoot mybatis (十三)Spring Boot整合MyBatis

ech 字段 osc 操作 with public assert 連接 ref Spring中整合MyBatis就不多說了,最近大量使用Spring Boot,因此整理一下Spring Boot中整合MyBatis的步驟。搜了一下Spring Boot整合MyBatis的文

Spring Boot整合MyBatis學習總結

Spring Boot MyBatis druid數據源 druid sql監控 公司的很多項目都陸陸續續引入了Spring Boot,通過對Spring Boot的接觸了解發現其真的是大大地簡化了開發、簡化了依賴配置,很多功能註解一下就可以實現,真的是太方便了。下面記錄了一個Sp

spring boot整合mybatis

tis ott 最簡 boot.s driver 大連 ins pla configure spring boot本來可以使用jpa進行數據庫操作,但是考慮到jpa的資料比較少,學習成本比較大,不是所有的人都可以十分了解,因此考慮采用mybatis來進行數據庫操作。 1、新

spring boot 整合mybatis:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

pri ssp path 內容 方案 sta 問題 xmapp not 最近在學習SpringBoot,遇到些異常情況: 1、異常信息 org.apache.ibatis.binding.BindingException: Invalid bound statement (

spring bootmybatis使用註解進行模糊查詢

cat 遇到 google 使用註解 ring list bat prop ber 小白一枚,spring boot 2.0.5在使用mybatis進行註解模糊查詢時遇到一些低級的錯誤,現記錄下來錯誤示例:“select * from user where name lik

spring boot 整合mybatis(好用!!!!)

com true pla 12px 保密 center 性別 request context springboot整合mybatis 1.pom依賴 <!-- 引入freeMarker的依賴包. --> <dependency>

Spring Boot】(23)、Spring Boot整合Mybatis

首先新增mybatis依賴: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</

Spring Boot整合MyBatis實戰

一 新建pom <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g

Spring boot 整合MyBatis(1)

一、Spring boot整合MyBatis Mybatis提供了mybatis-spring-boot-starter 目前 1.3.x 是最新版 https://github.com/mybatis/spring-boot-startergit下載地址

Spring Boot 整合 MyBatis(四)

Spring Boot 整合 MyBatis A、ORM框架是什麼? 物件關係對映(Object Relational Mapping,簡稱 ORM)模式是一種為了解決面向物件與關係資料庫存在的 互不匹配的現象技術。簡單的說,ORM 是通過使用描述物件

Spring-boot整合Mybatis踩坑:不能找到@MapperScan標籤

       開發工具:Ideal        使用場景:Demo 問題描述:        Spring

Spring Boot 整合Mybatis非starter時,mapper一直無法注入解決

本來呢,直接使用mybatis-spring-boot-starter還是挺好的,但是我們系統比較複雜,有多個數據源,其中一個平臺自己的資料來源,另外一些是動態配置出來的,兩者完全沒有關係。所以直接使用mybatis-spring-boot-starter就很麻煩了,會報下列錯誤: Caused by