Spring筆記_mybatis

来源:https://www.cnblogs.com/EnkiZhangBlog/archive/2023/03/14/15900640.html
-Advertisement-
Play Games

mybatis 使用資料庫連接池初始化連接資源 將sql語句抽取到xml配置文件中 使用反射、內省等底層技術,自動將實體與表進行屬性與欄位的自動映射 介紹 mybatis 是一個優秀的基於java的持久層框架,它內部封裝了jdbc,使開發者只需要關註sql語句本身,而不需要花費精力去處理載入驅動、創 ...


mybatis

  • 使用資料庫連接池初始化連接資源
  • 將sql語句抽取到xml配置文件中
  • 使用反射、內省等底層技術,自動將實體與表進行屬性與欄位的自動映射

介紹

mybatis 是一個優秀的基於java的持久層框架,它內部封裝了jdbc,使開發者只需要關註sql語句本身,而不需要花費精力去處理載入驅動、創建連接、創建statement等繁雜的過程。mybatis通過xml或註解的方式將要執行的各種 statement配置起來,並通過java對象和statement中sql的動態參數進行映射生成最終執行的sql語句最後mybatis框架執行sql並將結果映射為java對象並返回。採用ORM思想解決了實體和資料庫映射的問題,對jdbc 進行了封裝,屏蔽了jdbc api 底層訪問細節,使我們不用與jdbc api打交道,就可以完成對資料庫的持久化操作。

步驟

  • 添加坐標

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    
  • 創建user數據表

CREATE TABLE USER( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, userName VARCHAR(32) not null, passWord VARCHAR(32) not null )

  • 編寫user實體類
package com.spring.demo;

/**
 * @author Enki
 * @Version 1.0
 */
public class User {
    private int id ;
    private String userName;
    private String passWord;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", passWord='" + passWord + '\'' +
                '}';
    }
}
  • 編寫映射文件UserMapper.xml

    在resource下新建文件夾

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="userMapper">
<!--    結果集封裝的對象時resultType-->
    <select id="findAll" resultType="com.spring.demo.User">
        select * from user
    </select>
</mapper>

找到userMapper文件下的findAll方法並執行結果封住為User類型

  • 核心配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <!--    數據源環境部-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                    <property name="username" value="root"/>
                    <property name="password" value="enki"/>
                </dataSource>
            </environment>
        </environments>
        <!--    載入映射文件-->
        <mappers>
            <mapper resource="com\spring\mybatis\demo\mapper\UserMapper.xml"/>
        </mappers>
    </configuration>
    
  • 編寫測試

    查詢:

    @Test
    public void test() throws IOException {
        //獲得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
        //獲得sqlSession工廠對象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //獲得sqlSession對象
        SqlSession sqlSession = build.openSession();
        //執行操作 參數
        List<User> objects = sqlSession.selectList("userMapper.findAll");
        //測試
        System.out.println(objects);
        sqlSession.close();
    }
    

添加

<!--    添加 values值對應於User的屬性-->
    <insert id="insertUser" parameterType="com.spring.demo.User">
        insert into user values(#{id},#{userName},#{passWord})
    </insert>
   @Test
    public void test02() throws IOException ?。
        //獲得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
        //獲得sqlSession工廠對象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //獲得sqlSession對象
        SqlSession sqlSession = build.openSession();
        //執行操作 參數
        int insert = sqlSession.insert("userMapper.insertUser",new User("zhangsan","2121"));
//mybatis 預設不提交事務 主動提交
        sqlSession.commit();
        //測試
        System.out.println(insert);
        sqlSession.close();
    }

修改

<!--    修改-->
    <update id="updateUser" parameterType="com.spring.demo.User">
        update user set passWord=#{passWord} where userName=#{userName}
    </update>
 @Test
    public void test03() throws IOException {
        //獲得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
        //獲得sqlSession工廠對象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //獲得sqlSession對象
        SqlSession sqlSession = build.openSession();
        //執行操作 參數
        int update = sqlSession.update("userMapper.updateUser", new User("zhangsan", "1111"));
//mybatis 預設不提交事務
        sqlSession.commit();
        //測試
        System.out.println(update);
        sqlSession.close();
    }

刪除

<!--    刪除-->
    <delete id="deleteUser" parameterType="com.spring.demo.User">
        delete from user where userName=#{userName}
    </delete>
    @Test
    public void test04() throws IOException {
        //獲得核心配置文件+
        
        InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
        //獲得sqlSession工廠對象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //獲得sqlSession對象
        SqlSession sqlSession = build.openSession();
        //執行操作 參數
        int delete = sqlSession.delete("userMapper.deleteUser", new User("zhangsan", "1111"));
//mybatis 預設不提交事務
        sqlSession.commit();
        //測試
        System.out.println(delete);
        sqlSession.close();
    }

或者直接用id刪除

<!--    刪除-->
<delete id="deleteUser" parameterType="java.lang.Integer">
    delete from user where userName=#{id}
</delete>

所以可以根據sql語句的所需要的參數類型進行對paramterType的類型進行對應,不一定必須寫資料庫的封裝類型

映射部分屬性

常用配置解析

資料庫環境的配置 支持多環境配置

其中,事務管理器(transactionManager)類型有兩種:

• JDBC:這個配置就是直接使用了JDBC 的提交和回滾設置,它依賴於從數據源得到的連接來管理事務作用域。

• MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如JEE

應用伺服器的上下文)。 預設情況下它會關閉連接,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設置

為 false 來阻止它預設的關閉行為。

其中,數據源(dataSource)類型有三種:

• UNPOOLED:這個數據源的實現只是每次被請求時打開和關閉連接。

• POOLED:這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來。(JDBC使用POOLED)

• JNDI:這個數據源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置數據源,然後放置

一個 JNDI 上下文的引用

mapper標簽

用於載入映射,載入方式如下:

  • 使用相對於類路徑的資源引用

  • 使用完全限定資源定位符(URL)

  • 使用映射器介面實現類的完全限定類名

  • 將包內映射器介面實現全部註冊為映射器

properties標簽

單獨抽取出來,明確分工

typeAliases標簽

用於設置別名

<typeAliases>
    <typeAlias type="com.spring.demo.User" alias="user"/>
</typeAliases>

常用apl SqlSessionFactory build(InputStream inputStream)

//獲得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
//獲得sqlSession工廠對象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//獲得sqlSession對象
SqlSession sqlSession = build.openSession();
方法 解析
openSession() 會預設開啟一個事務,但事務不會自動提交,也就意味著需要手動提交
openSession(boolean autoCommit) 參數為是否自動提交,如果設置為true,那麼不需要手動提交事務

SqlSession實例對象

可以查詢單個對象

mybatis的代理開發

mapper介面開發方法需要編寫Mapper介面由mybatis框架根據介面定義創建介面的動態代理對象;

需要遵循以下規範:

  • Mapper.xml文件中的namespace與mapper介面的全限定名相同

  • Mapper介面方法名和Mapper.xml中定義的每個statement的id相同

  • Mapper介面方法的輸入參數類型和mapper.xml中定義的每個sql的parameterType的類型相同

  • Mapper介面方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同

測試

public static void main(String[] args) throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession session = build.openSession();

    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.findAll();
    System.out.println(users);
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MyBatis 1、簡介 1.1 什麼是Mybatis MyBatis 是一款優秀的持久層框架; 它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、介面和 J ...
  • 版權聲明:原創不易,本文禁止抄襲、轉載,侵權必究! 一、去吧!皮卡丘! 使用turtle(海龜庫)製作而成,感覺挺好玩的,哈哈@>_<@,效果如下: 由於源碼過長,這裡僅展示部分代碼: from turtle import * import turtle as t from random impor ...
  • 在做項目的時候,安裝MybatisX插件可以讓我們不用寫實體類,加快我們的開發速度,讓我們更專註於業務邏輯的開發,可是最近在做項目的時候,發現MybatisX插件的MybatisX-Generator無法生成實體類,但是其它的文件都可以自動生成。 原因:idea的版本(本人電腦idea版本是2021 ...
  • 引言 大家好,我是蠟筆小曦。 我們在通過程式向某個網頁發起請求時,實際上是模擬瀏覽器進行http(超文本傳輸協議)請求,這就要求我們需要按照固定的格式進行代碼構造。 一般請求數據分為三部分:請求行、請求頭、請求體,如果每次都手動進行這些內容的構造,無疑會花費大量的時間,準確性也難以保證。 現在就給大 ...
  • python語言基礎 1.1 python語法特點 1.1.1 註釋規則 什麼是註釋? 所謂註釋,就是在代碼中添加標註性的文字,進而更好的幫助我們更好的閱讀代碼,註釋又分為單行註釋和多行註釋。 1. 單行註釋 1 單行註釋用: # 來註釋 2 例: 3 print("hello word! ") # ...
  • 一、進位數的表示 十進位——直接表示:10二進位——(首碼):0B1010八進位——(首碼):0O12十六進位——(首碼):0XA 二、進位轉換 (1)十進位轉其他 十進位轉二進位: bin(10)十進位轉八進位: oct(10)十進位轉十六進位:hex(10) 備註:註意以上輸出類型均為字元串,另 ...
  • 飢漢模式 package com.cz.single; /** * @author 卓亦葦 * @version 1.0 * 2023/3/11 21:31 */ public class Hungry { private byte[] data1 = new byte[1024]; private ...
  • 事務基礎 事務 事務 是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。 特性 原子性(Atomicity):事務是不可分割的最小操作單元,要麼全部成功,要麼全部失敗。 一致性(Consistency):事 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...