1. 程式人生 > 遊戲 >反重力競速遊戲《紅視2》延期至6月17日發售

反重力競速遊戲《紅視2》延期至6月17日發售

Mybatis入門

1 Mybatis概述

1.1 Mybatis概念

  • MyBatis 是一款優秀的持久層框架,用於簡化 JDBC 開發
  • MyBatis 本是 Apache 的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github
  • 官網:https://mybatis.org/mybatis-3/zh/index.html

持久層:

  • 負責將資料到儲存到資料庫的那一層程式碼。
  • JavaEE三層架構:表現層、業務層、持久層

1.2 JDBC 缺點

  • 硬編碼

    • 註冊驅動、獲取連線

      連線資料庫的基本資訊在程式碼中,如果要更換資料庫就需要修改程式碼。

    • SQL語句

      如果表結構發生變化,SQL語句就要進行更改。這也不方便後期的維護。

  • 操作繁瑣

    • 手動設定引數
    • 手動封裝結果集

1.3 Mybatis 優化

  • 硬編碼可以配置到配置檔案
  • 操作繁瑣的地方mybatis都自動完成

如圖所示

2 Mybatis快速入門

需求:查詢user表中所有的資料

  • 建立模組,匯入座標

    在建立好的模組中的 pom.xml 配置檔案中新增依賴的座標

    <dependencies>
        <!--mybatis 依賴-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
    
        <!--mysql 驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
    </dependencies>
    
  • 編寫 MyBatis 核心配置檔案 -- > 替換連線資訊 解決硬編碼問題

    在模組下的 resources 目錄下建立mybatis的配置檔案 mybatis-config.xml,內容如下:

    <?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>
    
        <typeAliases>
            <package name="com.itheima.pojo"/>
        </typeAliases>
        
        <!--
        environments:配置資料庫連線環境資訊。可以配置多個environment,通過default屬性切換不同的environment
        -->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!--資料庫連線資訊-->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                    <property name="username" value="root"/>
                    <property name="password" value="1234"/>
                </dataSource>
            </environment>
    
            <environment id="test">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!--資料庫連線資訊-->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                    <property name="username" value="root"/>
                    <property name="password" value="1234"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
           <!--載入sql對映檔案-->
           <mapper resource="UserMapper.xml"/>
        </mappers>
    </configuration>
    
  • 編寫 SQL 對映檔案 --> 統一管理sql語句,解決硬編碼問題

    在模組的 resources 目錄下建立對映配置檔案 UserMapper.xml,內容如下:

    <?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="test">
        <select id="selectAll" resultType="com.itheima.pojo.User">
            select * from tb_user;
        </select>
    </mapper>
    
  • 編碼

    • 建立 User類

      public class User {
          private int id;
          private String username;
          private String password;
          private String gender;
          private String addr;
          
          //省略了 setter 和 getter
      }
      
    • 編寫 MybatisDemo 測試類

      public class MyBatisDemo {
      
          public static void main(String[] args) throws IOException {
              //1. 載入mybatis的核心配置檔案,獲取 SqlSessionFactory
              String resource = "mybatis-config.xml";
              InputStream inputStream = Resources.getResourceAsStream(resource);
              SqlSessionFactory sqlSessionFactory = new
                  SqlSessionFactoryBuilder().build(inputStream);
      
              //2. 獲取SqlSession物件,用它來執行sql
              SqlSession sqlSession = sqlSessionFactory.openSession();
              //3. 執行sql
              List<User> users = sqlSession.selectList("test.selectAll"); //引數是一個字串,該字串必須是對映配置檔案的namespace.id
              System.out.println(users);
              //4. 釋放資源
              sqlSession.close();
          }
      }
      

解決SQL對映檔案的警告提示:

在入門案例對映配置檔案中存在報紅的情況。問題如下:

  • 產生的原因:Idea和資料庫沒有建立連線,不識別表資訊。它並不影響程式的執行。
  • 解決方式:在Idea中配置MySQL資料庫連線。

IDEA中配置MySQL資料庫連線

  • 點選IDEA右邊框的 Database ,在展開的介面點選 + 選擇 Data Source ,再選擇 MySQL

3 Mapper代理開發

3.1 Mapper代理開發概述

之前我們寫的程式碼是基本使用方式,它也存在硬編碼的問題,如下:

這裡呼叫 selectList() 方法傳遞的引數是對映配置檔案中的 namespace.id值。這樣寫也不便於後期的維護。如果使用 Mapper 代理方式(如下圖)則不存在硬編碼問題。

通過上面的描述可以看出 Mapper 代理方式的目的:

  • 解決原生方式中的硬編碼
  • 簡化後期執行SQL

3.2 使用Mapper代理要求

使用Mapper代理方式,必須滿足以下要求:

  • 定義與SQL對映檔案同名的Mapper介面,並且將Mapper介面和SQL對映檔案放置在同一目錄下。如下圖:

  • 設定SQL對映檔案的namespace屬性為Mapper介面全限定名

  • 在 Mapper 介面中定義方法,方法名就是SQL對映檔案中sql語句的id,並保持引數型別和返回值型別一致

3.3 案例程式碼實現

  • com.itheima.mapper 包下建立 UserMapper介面,程式碼如下:

    public interface UserMapper {
        List<User> selectAll();
        User selectById(int id);
    }
    
  • resources 下建立 com/itheima/mapper 目錄,並在該目錄下建立 UserMapper.xml 對映配置檔案

    <!--
        namespace:名稱空間。必須是對應介面的全限定名
    -->
    <mapper namespace="com.itheima.mapper.UserMapper">
        <select id="selectAll" resultType="com.itheima.pojo.User">
            select *
            from tb_user;
        </select>
    </mapper>
    
  • 建立 MybatisDemo2 測試類,程式碼如下:

    /**
     * Mybatis 代理開發
     */
    public class MyBatisDemo2 {
    
        public static void main(String[] args) throws IOException {
    
            //1. 載入mybatis的核心配置檔案,獲取 SqlSessionFactory
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            //2. 獲取SqlSession物件,用它來執行sql
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //3. 執行sql
            //3.1 獲取UserMapper介面的代理物件
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> users = userMapper.selectAll();
    
            System.out.println(users);
            //4. 釋放資源
            sqlSession.close();
        }
    }
    

注意:

如果Mapper介面名稱和SQL對映檔名稱相同,並在同一目錄下,則可以使用包掃描的方式簡化SQL對映檔案的載入。也就是將核心配置檔案的載入對映配置檔案的配置修改為

<mappers>
    <!--載入sql對映檔案-->
    <!-- <mapper resource="com/itheima/mapper/UserMapper.xml"/>-->
    <!--Mapper代理方式-->
    <package name="com.itheima.mapper"/>
</mappers>

4 核心配置檔案

核心配置檔案中現有的配置之前已經給大家進行了解釋,而核心配置檔案中還可以配置很多內容。我們可以通過查詢官網看可以配置的內容

接下來我們先對裡面的一些配置進行講解。

4.1 多環境配置

在核心配置檔案的 environments 標籤中其實是可以配置多個 environment ,使用 id 給每段環境起名,在 environments 中使用 default='環境id' 來指定使用哪兒段配置。我們一般就配置一個 environment 即可。

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <!--資料庫連線資訊-->
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
            <property name="username" value="root"/>
            <property name="password" value="1234"/>
        </dataSource>
    </environment>

    <environment id="test">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <!--資料庫連線資訊-->
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
            <property name="username" value="root"/>
            <property name="password" value="1234"/>
        </dataSource>
    </environment>
</environments>=

4.2 類型別名

在對映配置檔案中的 resultType 屬性需要配置資料封裝的型別(類的全限定名)。而每次這樣寫是特別麻煩的,Mybatis 提供了 類型別名(typeAliases) 可以簡化這部分的書寫。

首先需要先在核心配置檔案中配置類型別名,也就意味著給pojo包下所有的類起了別名(別名就是類名),不區分大小寫。內容如下:

<typeAliases>
    <!--name屬性的值是實體類所在包-->
    <package name="com.itheima.pojo"/> 
</typeAliases>

通過上述的配置,我們就可以簡化對映配置檔案中 resultType 屬性值的編寫

<mapper namespace="com.itheima.mapper.UserMapper">
    <select id="selectAll" resultType="user">
        select * from tb_user;
    </select>
</mapper>