日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.mapper代理

1.mybatis開發dao的方法----引入(為啥要使用mapper代理)

1.SqlSession使用范圍

1.SqlSessionFactoryBuilder

  • 通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory
  • 將SqlSessionFactoryBuilder當成一個工具類使用即可,不需要使用單例管理SqlSessionFactoryBuilder。
  • 在需要創建SqlSessionFactory時候,只需要new一次SqlSessionFactoryBuilder即可。

2.SqlSessionFactory

通過SqlSessionFactory創建SqlSession,使用單例模式管理sqlSessionFactory(工廠一旦創建,使用一個實例)將來mybatis和spring整合后,使用單例模式管理sqlSessionFactory。

3.SqlSession

  • SqlSession是一個面向用戶(程序員)的接口。
  • SqlSession中提供了很多操作數據庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象)。
  • SqlSession是線程不安全的,在SqlSesion實現類中除了有接口中的方法(操作數據庫的方法)還有數據域屬性。
  • SqlSession最佳應用場合在方法體內,定義成局部變量使用。

2.原始dao開發方法(程序員需要寫dao接口和dao實現類)

1.思路

程序員需要寫dao接口和dao實現類。

需要向dao實現類中注入SqlSessionFactory,在方法體內通過SqlSessionFactory創建SqlSession

2.dao接口

3.dao接口實現類

public class UserDaoImpl implements UserDao {// 需要向dao實現類中注入SqlSessionFactory// 這里通過構造方法注入private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic User findUserById(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("test.findUserById", id);// 釋放資源sqlSession.close();return user;}@Overridepublic void insertUser(User user) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//執行插入操作sqlSession.insert("test.insertUser", user);// 提交事務sqlSession.commit();// 釋放資源sqlSession.close();}@Overridepublic void deleteUser(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//執行插入操作sqlSession.delete("test.deleteUser", id);// 提交事務sqlSession.commit();// 釋放資源sqlSession.close();}}

?

?

?

?

?

4.測試代碼:

5.總結原始 dao開發問題

  • dao接口實現類方法中存在大量模板方法,設想能否將這些代碼提取出來,大大減輕程序員的工作量。
  • 調用sqlsession方法時將statement的id硬編碼了
  • 調用sqlsession方法時傳入的變量,由于sqlsession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,不利于程序員開發。

?

?

2.mapper代理方法(程序員只需要mapper接口(相當 于dao接口))

1.思路(mapper代理開發規范)

  • 程序員還需要編寫mapper.xml映射文件
  • 程序員編寫mapper接口需要遵循一些開發規范,mybatis可以自動生成mapper接口實現類代理對象。

開發規范:

1、在mapper.xml中namespace等于mapper接口地址

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

3、mapper.java接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型一致。

4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。

總結:

以上開發規范主要是對下邊的代碼進行統一生成:

User user = sqlSession.selectOne("test.findUserById", id);

sqlSession.insert("test.insertUser", user);

。。。。

2.mapper.java(不寫實現類)

3.mapper.xml(切記id要與接口方法名保持一致,輸入和返回類型要保持一致

?

4.在SqlMapConfig.xml中加載mapper.xml

5.測試

一些問題總結

1.代理對象內部調用selectOne或selectList

如果mapper方法返回單個pojo對象(非集合對象),代理對象內部通過selectOne查詢數據庫。

如果mapper方法返回集合對象,代理對象內部通過selectList查詢數據庫。

2.mapper接口方法參數只能有一個是否影響系統 開發

mapper接口方法參數只能有一個,系統是否不利于擴展維護。

系統框架中,dao層的代碼是被業務層公用的。

即使mapper接口只有一個參數,可以使用包裝類型的pojo滿足不同的業務方法的需求。

注意:持久層方法的參數可以包裝類型、map。。。,service方法中建議不要使用包裝類型(不利于業務層的可擴展)。

?

?

2.SqlMapConfig.xml(mybatis核心配置文件)

mybatis的全局配置文件SqlMapConfig.xml,配置內容如下:

  • properties(屬性)
  • settings(全局配置參數)
  • typeAliases(類型別名)
  • typeHandlers(類型處理器)
  • objectFactory(對象工廠)
  • plugins(插件)

environments(環境集合屬性對象)

? ? ?environment(環境子屬性對象)

? ? ? ? ? ?transactionManager(事務管理)

? ? ? ? ? ?dataSource(數據源)

  • mappers(映射器)

1.properties屬性

需求:

將數據庫連接參數單獨配置在db.properties中,只需要在SqlMapConfig.xml中加載db.properties的屬性值。

在SqlMapConfig.xml中就不需要對數據庫連接參數硬編碼。

將數據庫連接參數只配置在db.properties中,原因:方便對參數進行統一管理,其它xml可以引用該db.properties。

在sqlMapConfig.xml加載屬性文件:

properties特性:

注意: MyBatis 將按照下面的順序來加載屬性:

  • 在 properties 元素體內定義的屬性首先被讀取。
  • 然后會讀取properties 元素中resource或 url 加載的屬性,它會覆蓋已讀取的同名屬性。
  • 最后讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
  • 建議:

    不要在properties元素體內添加任何屬性值,只將屬性值定義在properties文件中。

    在properties文件中定義屬性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX

    2.settings全局參數配置

    mybatis框架在運行時可以調整一些運行參數。

    比如:開啟二級緩存、開啟延遲加載。。

    全局參數將會影響mybatis的運行行為。

    詳細參見“學習資料/mybatis-settings.xlsx”文件

    3.typeAliases(別名)重點

    需求:

    在mapper.xml中,定義很多的statement,statement需要parameterType指定輸入參數的類型、需要resultType指定輸出結果的映射類型。

    如果在指定類型時輸入類型全路徑,不方便進行開發,可以針對parameterType或resultType指定的類型定義一些別名,在mapper.xml中通過別名定義,方便開發。

    mybatis默認支持別名

    ?

    別名

    映射的類型

    _byte

    byte

    _long

    long

    _short

    short

    _int

    int

    _integer

    int

    _double

    double

    _float

    float

    _boolean

    boolean

    string

    String

    byte

    Byte

    long

    Long

    short

    Short

    int

    Integer

    integer

    Integer

    double

    Double

    float

    Float

    boolean

    Boolean

    date

    Date

    decimal

    BigDecimal

    bigdecimal

    BigDecimal

    自定義別名

  • 單個別名定義
  • ?

    ?

    引用別名:

    批量定義別名(常用)

    4.typeHandlers(類型處理器)

    mybatis中通過typeHandlers完成jdbc類型和java類型的轉換。

    通常情況下,mybatis提供的類型處理器滿足日常需要,不需要自定義.

    mybatis支持類型處理器:

    類型處理器

    Java類型

    JDBC類型

    BooleanTypeHandler

    Booleanboolean

    任何兼容的布爾值

    ByteTypeHandler

    Bytebyte

    任何兼容的數字或字節類型

    ShortTypeHandler

    Shortshort

    任何兼容的數字或短整型

    IntegerTypeHandler

    Integerint

    任何兼容的數字和整型

    LongTypeHandler

    Longlong

    任何兼容的數字或長整型

    FloatTypeHandler

    Floatfloat

    任何兼容的數字或單精度浮點型

    DoubleTypeHandler

    Doubledouble

    任何兼容的數字或雙精度浮點型

    BigDecimalTypeHandler

    BigDecimal

    任何兼容的數字或十進制小數類型

    StringTypeHandler

    String

    CHARVARCHAR類型

    ClobTypeHandler

    String

    CLOBLONGVARCHAR類型

    NStringTypeHandler

    String

    NVARCHARNCHAR類型

    NClobTypeHandler

    String

    NCLOB類型

    ByteArrayTypeHandler

    byte[]

    任何兼容的字節流類型

    BlobTypeHandler

    byte[]

    BLOBLONGVARBINARY類型

    DateTypeHandler

    Datejava.util

    TIMESTAMP類型

    DateOnlyTypeHandler

    Datejava.util

    DATE類型

    TimeOnlyTypeHandler

    Datejava.util

    TIME類型

    SqlTimestampTypeHandler

    Timestampjava.sql

    TIMESTAMP類型

    SqlDateTypeHandler

    Datejava.sql

    DATE類型

    SqlTimeTypeHandler

    Timejava.sql

    TIME類型

    ObjectTypeHandler

    任意

    其他或未指定類型

    EnumTypeHandler

    Enumeration類型

    VARCHAR-任何兼容的字符串類型,作為代碼存儲(而不是索引)。

    5.mappers(映射配置)

    通過resource加載單個映射文件

    通過mapper接口加載單個mapper

    按照上邊的規范,將mapper.java和mapper.xml放在一個目錄 ,且同名。

    批量加載mapper(推薦使用)

    ?

    3.輸入映射

    1.需求

    ?

    完成用戶信息的綜合查詢,需要傳入查詢條件很復雜(可能包括用戶信息、其它信息,比如商品、訂單的)

    2.定義包裝類型pojo

    針對上邊需求,建議使用自定義的包裝類型的pojo。

    在包裝類型的pojo中將復雜的查詢條件包裝進去。

    3.mapper.xml

    在UserMapper.xml中定義用戶信息綜合查詢(查詢條件復雜,通過高級查詢進行復雜關聯查詢)。

    ?

    4.mapper.java

    5.測試代碼

    ?

    ?

    ?

    ?

    4.輸出映射

    1.resultType

    使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列才可以映射成功。

    如果查詢出來的列名和pojo中的屬性名全部不一致,沒有創建pojo對象。

    只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象

    輸出簡單類型

    需求

    用戶信息的綜合查詢列表總數,通過查詢總數和上邊用戶綜合查詢列表才可以實現分頁。

    mapper.xml

    mapper.java

    測試代碼

    小結

    查詢出來的結果集只有一行且一列,可以使用簡單類型進行輸出映射。

    2.輸出pojo對象和pojo列表

    不管是輸出的pojo單個對象還是一個列表(list中包括pojo),在mapper.xml中resultType指定的類型是一樣的。

    在mapper.java指定的方法返回值類型不一樣:

    1、輸出單個pojo對象,方法返回值是單個對象類型

    2、輸出pojo對象list,方法返回值是List<Pojo>

    生成的動態代理對象中是根據mapper方法的返回值類型確定是調用selectOne(返回單個對象調用)還是selectList (返回集合對象調用 ).

    3.resultMap

    mybatis中使用resultMap完成高級輸出結果映射。

    1.resultMap使用方法

    如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系。

    1、定義resultMap

    2、使用resultMap作為statement的輸出映射類型

    2.將下邊的sql使用User完成映射

    SELECT id id_,username username_ FROM USER WHERE id=#{value}

    User類中屬性名和上邊查詢列名不一致。

    定義reusltMap

    使用resultMap作為statement的輸出映射類型

    mapper.java

    測試

    4.小結

    使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列才可以映射成功。

    如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系。

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。