數據庫訪問中間件

目錄

一、ORM

二、Mybatis

1、Mybatis瞭解

2、springboot整合Mybatis

3、springboot整合Mybatis和Rest    

三、JPA

4、SpringData JPA 簡介及入門

5、SpringData JPA 基本使用


一、ORM

    ORM:對象關係映射(Jbject Relational Mapping),實現面向對象編程語言裏不同類型系統的數據之間的轉換。將程序對象和關係數據庫之間相互映射。
    異構性:ORM可以解決數據庫與程序之間的異構性,比如字符串的表示,Java:String、Oracle:varchar2、MySQL:varchar、SQLserver:nvarchar。
    映射:ORM提供了實現持久化層的另一種模式,採用映射元數據(XML)來描述對象-關係的映射細節,使得ORM中間件能在任何一個Java應用的業務邏輯層和數據庫直接充當橋樑。

經典ORM框架:
        Hibernate:全自動的框架,強大、複雜、笨重、學習成本高。
        Mybatis:半自動的框架(懂數據庫的人才能操作)必須自己寫sql。
        JPA:Java Persistence API,是Java自帶的框架。

二、Mybatis

1、Mybatis瞭解

Mybatis介紹
        持久層框架,前身iBatis,支持定製化SQL、存儲過程及高級映射。
        使用XML或註解來配置和映射原生信息。將接口和POJOS映射成數據庫中的記錄。

Mybatis架構
        接口層:數據查詢、數據增加、數據修改、數據刪除、配置信息維護接口
        數據處理層:參數映射、SQL解析、SQL執行、結果映射
        框架支撐層:事務、連接池、緩存、SQL語句配置方式:基於XML、基於註解
        引導層:基於XML配置方式、基於Java API方式
    數據處理層:    
        參數映射(參數映射配置、參數映射解析、參數類型解析)
        SQL解析(SQL語句配置、SQL語句解析、SQL語句動態生成)
        SQL執行(單條、批量、複用)
        結果映射:(結果映射配置、結果映射轉換、結果類型轉換)

Mybatis工作流程
        SqlMapConfig.xml配置文件(映射)--SqlSessionFactory(數據庫配置、全局)--SqlSession會話連接--executor(執行)--MappendStatement(參數、SQL、結果映射)--數據庫

Mybatis結構
        Configuration:MappendStatement(SqlSource、ResultMap)、BoundSql
        JDBC:ResultSet、Statement(PreparedStatement、SimpleStatement、CallableStatement)

Mybatis主要成員
        SqlSession:是Mybatis頂層API接口、作爲和數據庫交互的會話訪問、完成數據庫增刪改查功能
        Executor:Mybatis執行器,是Mybatis調度的核心,負責SQL動態語句的生成,和查詢緩存的維護
        StatementHandler:負責處理JDBC的Statement的交互,包括對Statement設置參數,以及將JDBC返回的ResultSet結果集轉換成List
        ParameterHandler:負責將用戶傳遞的參數值,對Statement對象設置參數
        ResultSetHandler:負責將ResultSet集合轉換成List
        TypeHandler<T>:負責jdbcType與javaType之間的數據轉換(1、對Statement對象設置特定的參數    2、對Statement返回的結果集ResultSet,取出特定的列)

2、springboot整合Mybatis

    基於配置:MySQL配置(datasource)、Mybatis全局配置(mybatis-config.xml)、Mybatis映射文件配置(mapper/*.xml)、實體類的別名配置(即實體類包路徑 mybatis.type-aliases-package)
    基於註解:@Select

3、springboot整合Mybatis和Rest    

    @MapperScan("映射接口包路徑"):用於掃描Mapper映射
    @Resource:表明注入的接口操作數據庫
    ModelMap:用於添加返回前端的響應參數
    @Select(查詢SQL)
    @Results({@Result(property="Java對象關聯的屬性名",column="關聯的數據庫字段名",many=@Many(select="映射的查詢接口的包名.接口名.方法名"))})
    @Many:一對多

三、JPA

4、SpringData JPA 簡介及入門

SpringData:
        爲了簡化構建基於spring框架應用的數據訪問技術。包括對關係數據庫、非關係數據庫、Map-Reduce框架、雲數據服務等訪問支持。
        提供了統一的API標準來實現對數據訪問層的操作。這套標準包含了CRUD(增刪改查)、排序和分頁的相關操作。
    
SpringData特點:
        支持對象關係映射:具備ORM框架的對象關係映射功能
        統一的Repository接口:Repository<T,ID extends Serializable>:統一接口、CrudRepository<T,ID>:基本CRUD操作、PagingAndSortingRepository<T,ID>:基本排序及分頁
        統一的數據訪問模板類xxxTemplate:如MongoTemplate、RedisTemplate

JPA(Java Persistence API):
        是Sun官方提出的Java持久化規範。提供了一種對象/關聯映射工具來管理Java應用中的關係數據。
        它的出現主要爲了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate、TopLink、JDO等ORM框架各自爲營的局面。
        充分吸收了現有ORM框架的基礎上發展而來,具有易於使用、伸縮性強等優點。
        (JPA是規範,不是產品,Hibernate、TopLink、JDO等是產品,如果這些產品實現了這個規範,就可以稱它們爲JPA的實現產品)

接口訪問過程:
    Application--SpringData--SpringData JPA、(SpringData Redis、SpringData MongoDB)--JPA規範--數據庫底層實現:Hibernate、TopLink、JDO等
    程序--通過統一數據訪問API:SpringData來訪問數據庫--通過SpringData JPA訪問關係型數據庫、通過SpringData Redis訪問Redis非關係數據庫、通過SpringData MongoDB來訪問Mongo

SpringData:統一數據訪問API
        通過ObjectMapping:對象關係映射、Templates:模型、Repository Support:Repository的支持 來訪問數據庫
        
SpringData JPA默認底層實現:Hibernate

數據訪問過程:
    程序--SpringData JPA規範--JPA規範--Hibernate(封裝了JDBC操作)--數據庫
    SpringData JPA規範封裝了JPA規範
    
簡單使用:
        pom添加jpa依賴:spring-boot-starter-data-jpa
        自定義接口繼承JpaRepository接口
        定義實體類:@Entity(實體類定義)、@Table(映射表名)、@Id(主鍵ID)、@GeneratedValue(主鍵值生成方式)、@GenericGenerator(主鍵值生成器)、@Column(映射表字段)
                    @Data(lombok註解) @AllArgsConstructor(包含所有參數的構造方法)、@NoArgsConstructor(無參的構造方法)、@Builder(通過構造器來構造對象)

5、SpringData JPA 基本使用

  • 單表SQL操作-使用關鍵字拼湊方法

        注意事項:
            1.實體類屬性名不要出現isXxx、getXxx的名稱,會導致關鍵字拼湊出錯
            2.實體類屬性名中間如果有大寫字母,會導致數據庫的字段名有下劃線隔開。比如屬性名:isMarried,映射到數據庫會變成:is_married,導致無法對應
            3.實體類屬性名類型爲Boolean類型,在某些數據庫中會變成bit(1)類型,默認爲0,其中0爲false,1爲true
            4.使用like模糊查詢,需在參數傳入時需拼接%,否則jpa無法知道需要左模糊、右模糊還是左右模糊。例如參數:"%name%"
        無法解決的問題:
            1.實體類的屬性名與表的字段名無法映射,導致關鍵字找不到(實體類的屬性名中使用了大寫字母,會映射成下劃線,導致數據庫找不到對應字段)
            2.CURD操作方式比較另類
            3.涉及到多表操作

  • 單表SQL操作-使用註解手寫SQL語句(SQL、HQL)

        注意事項:
            1.手寫SQL語句,使用@Query註解,不侷限於查詢操作,增刪改查都可以使用這個註解
            2.如果是刪改操作,需要加@Modifying和@Transactional註解
            3.默認是HQL語句,不能使用select *,如果要使用SQL語句,需在@Query註解加上nativeQuery = true的屬性
            4.傳參方式一:使用?+數字的方式,數字從1開始,代表第幾個參數
            5.傳參方式二:使用:+參數名的方式,這種方式最好配合@Param註解一起使用
            6.HQL語句中的table name,要寫成實體類名,不能寫實際的表名
            7.使用like模糊查詢,需在參數傳入時需拼接%,或者SQL語句中拼接%,否則jpa無法知道需要左模糊、右模糊還是左右模糊。例如參數:"%name%",或SQL:like %:name%
            8.spel表達式:傳入參數爲實體類對象(@Param("user") User user),SQL中獲取實體類對象的屬性值時,使用spel表達式:(where name=:#{#user.name}),

  • 逆向工程操作和多表查詢        

        使用數據接口:構建一個數據接口,裏面的抽象方法就是SQL語句的查詢結果的字段對應的getXXX的抽象方法
            注意事項:使用數據接口來接收查詢結果字段,必須爲要查詢的字段名起別名,否則無法會無法取到
        使用集合(推薦):直接使用List/Map等集合嵌套的方式來獲取到接收數據
        使用VO(View Object):單獨構建一個跟頁面展示數據對應的VO實體類來接收數據

  • JPA逆向工程操作:通過表生成實體類

        1、IDEA連接mysql數據庫(url就寫properties配置的url)
        2、Project Structure,Modules,選中對應的項目,點+加號add,添加jpa,選中項目下面剛添加的jpa,Descriptors窗口中點擊右邊欄+加號,選第一個persistence.xml,OK
        3、打開IDEA左邊欄Persistence窗口,選擇對應的項目右擊,Generate Persistence Mapping,By Database Schema,數據源選之前創建的mysql連接,包路徑選項目entity目錄,
            前綴和後綴不寫,選擇對應的數據庫表,OK
        4、查看項目entity目錄,數據庫表對應的實體類已生成。@Column name有紅色波浪線錯誤,可忽視,也可點擊Assign Data Source,選擇關聯的mysql數據源即可。

  • 多表查詢

        1、查詢結果爲單張表對應的實體對象:直接在SQL語句中關聯多表查詢,返回對象爲實體類即可
        2、使用數據接口接收多表查詢結果:定義接口類,定義查詢結果字段對應的get抽象方法,使用接口類或List<接口類>泛型來接收查詢結果,SQL語句查詢字段起別名:select u.name as uname, b.id as bid from...
        3、使用簡單集合List<Object>來接收查詢結果作爲查詢方法的響應
        4、使用嵌套集合List<Map<String,Object>>來接收查詢結果(推薦)

  • 多表複雜查詢的又一種方式-QueryDSL

    QueryDSL:是一個通用的查詢框架,專注於通過JavaAPI構建類型安全的Sql查詢,也可以說QueryDSL是基於各種ORM框架以及Sql之上的一個通用的查詢框架,QueryDSL的查詢類似於SQL查詢,很全面只不過一個是用SQL一個是用代碼來代替SQL。
        建議:單表或簡單的多表操作,都不推薦使用QueryDSL,使用JPA自帶API簡潔又效率,但是涉及太複雜的查詢,推薦使用QueryDSL。
        QueryDSL的使用:構造器的方式:queryFactory.select(xx,xx).from(xx,xx).where(BooleanBuilder).fetchResults();
        優點:複雜的多表查詢能讓結構清晰效率提高
        缺點:單表以及簡單的多表查詢沒有JPA簡單及效率高
    參考資料:http://www.querydsl.com/static/querydsl/latest/reference/html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章