<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 2.1 一個簡單的權限控制需求 ### 2.1.2 創建實體類 特殊的類型“byte[]"一般對應數據庫中的 BLOB、LONGVARBINARY 以及一些和二進制流有關的字段類型。 **由于Java中的基本類型會有默認值,例如當某個類中存在private int age;字段時,創建這個類時,age會有默認值0。當使用age屬性時,它總會有值。因此在某些情況下,便無法實現使age為null。并且在動態SQL的部分,如果使用age!=null進行判斷,結果總會為true,因而會導致很多隱藏的問題。** ## 2.2 使用XML方式 ``` ??? <mappers> ??????? <mapper resource="tk.mybatis.simple.mapper"/> ??? </mappers> ``` 1. 這種配置方式會先查找tk.mybatis.simple.mapper包下所有的接口,循環對接口進行如下操作: 2. 判斷接口對應的命名空間是否已經存在,如果不存在就拋出異常,存在進行下來的操作。 3. 加載接口對應的 XML 映射文件,將接口全限定名轉換為路徑,例如,將接口tk.mybatis.simple.mapper.UserMapper轉換為tk/mybatis/simple/mapper/UserMapper.xml,以.xml為后綴搜索XML資源,如果找到就解析XML。 4. 處理接口中的注解方法。 ## 2.3 select用法 *因為接口方法是可以重載的,所以接口中可以出現多個同名但參數不同的方法,但是XML中id的值不能重復,因而接口中的所有同名方法會對應著XML中的同一個id的方法。最常見的用法就是,同名方法中其中的一個方法增加一個 RowBound 類型的參數用于實現分頁查詢。* XML中的resultType(或resultMap中的type)決定的接口中寫的返回值類型,兩者要一致。 MyBatis 還提供了一個全局屬性mapUnderscoreToCamelCase,通過配置這個屬性為true可以自動將以下畫線方式命名的數據庫列映射到Java對象的駝峰式命名屬性中。想要使用該功能,在MyBatis-config.xml中增加如下配置。 <setting name="mapUnderscoreToCamelCase" value="true"/> 注意!:xml中sql語句返回類型最好使用restultMap不要用resultType,因為resultType映射時屬性名和列名必須一致。 XML中的select標簽的id屬性值和定義的接口方法名是一樣的。MyBatis就是通過這種方式將接口方法和XML中定義的SQL語句關聯到一起的。 **resultMap標簽** · jdbcType:列對應的數據庫類型。插入、更新、刪除操作可能為空的列進行處理。這是JDBC jdbcType的需要,不是MyBatis的需要。 ?type: 必填, 用于配置查詢列所映射到的Java對象類型 ##### 測試類 ``` /** ?* 生成sqlSessionFactory實例 ?* 基礎測試類 ?*/ public class BaseMapperTest { ?????private static SqlSessionFactory sqlSessionFactory; ????? ?????@BeforeClass ?????public static void init(){ ??????????try { ??????????? Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); ??????????? sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); ??????????? reader.close(); ??????? } catch (IOException ignore) { ??????? ??ignore.printStackTrace(); ??????? } ?????} ?????public SqlSession getSqlSession(){ ??????????return sqlSessionFactory.openSession(); ?????} } public class UserMapperTest extends BaseMapperTest { ????? ?????@Test ?????public void testSelectById(){ ??????????//獲取 sqlSession ??????????SqlSession sqlSession = getSqlSession(); ??????????try { ??????????????//獲取 UserMapper 接口 ??????????????UserMapper userMapper = sqlSession.getMapper(UserMapper.class); ??????????????//調用UserMapper 接口中的 selectById 方法,查詢 id = 1 的用戶 ??????????????SysUser user = userMapper.selectById(1l); ??????????????//user 不為空 ??????????????Assert.assertNotNull(user); ??????????????//userName = <u>admin</u> ??????????????Assert.assertEquals("admin", user.getUserName()); ??????????} finally { ??????????????//不要忘記關閉 sqlSession ??????????????sqlSession.close(); ??????????} ?????} } ``` ## 2.4 insert用法 注意 : 插入表時,為確定記錄的唯一性。 1.用數據庫自己生成的值 2.從序列當中取值作為主鍵值 (可以【mysql】和不可以【oracle】自己生成主鍵值的數據庫都能用) ### 2.4.1 簡單的insert方法 ``` ?????<insert id="insert"> ??????????insert into sys_user( ??????????????user_name, user_password, user_email, ??????????????user_info, head_img, create_time) ??????????values( ??????????????#{userName}, #{userPassword}, #{userEmail}, ??????????????#{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP}) ?????</insert> ``` 先看<insert>元素,這個標簽包含如下屬性。 · id:命名空間中的唯一標識符,可用來代表這條語句。 · parameterType:即將傳入的語句參數的完全限定類名或別名。這個屬性是可選的,因為MyBatis可以推斷出傳入語句的具體參數,因此不建議配置該屬性。 · flushCache:默認值為true,任何時候只要語句被調用,都會清空一級緩存和二級緩存。· timeout:設置在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。 · statementType:對于STATEMENT、PREPARED、CALLABLE,MyBatis會分別使用對應的 Statement、PreparedStatement、CallableStatement,默認值為PREPARED。· useGeneratedKeys:默認值為 false。如果設置為 true,MyBatis 會使用 JDBC的getGeneratedKeys方法來取出由數據庫內部生成的主鍵。 · keyProperty:MyBatis通過getGeneratedKeys獲取主鍵值后將要賦值的屬性名。如果希望得到多個數據庫自動生成的列,屬性值也可以是以逗號分隔的屬性名稱列表。 · keyColumn:僅對INSERT和UPDATE有用。通過生成的鍵值設置表中的列名,這個設置僅在某些數據庫(如 PostgreSQL)中是必須的,當主鍵列不是表中的第一列時需要設置。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 · databaseId:如果配置了databaseIdProvider(4.6節有詳細配置方法),MyBatis會加載所有的不帶databaseId的或匹配當前databaseId的語句。如果同時存在帶databaseId和不帶databaseId的語句,后者會被忽略。此處<insert>中的 SQL 就是一個簡單的 INSERT 語句,將所有的列都列舉出來,在values中通過#{property}方式從參數中取出屬性的值。 為了防止類型錯誤,對于一些特殊的數據類型,建議指定具體的 jdbcType 值。例如headImg指定BLOB類型,createTime指定TIMESTAMP類型。特別說明!BLOB對應的類型是ByteArrayInputStream,就是二進制數據流。由于數據庫區分date、time、datetime類型,但是Java中一般都使用java.util.Date類型。因此為了保證數據類型的正確,需要手動指定日期類型,date、time、datetime對應的JDBC類型分別為DATE、TIME、TIMESTAMP。 數據庫的datetime類型可以存儲DATE(time部分默認為00:00:00)和TIMESTAMP(時間戳)這兩種類型的時間,不能存儲TIME類型的時間。 ### ?2.4.2 使用JDBC方式返回主鍵自增的值 ?用數據庫內部自動生成的主鍵值給指定的列 (id) 賦值。 下面的insert語句當中不用再寫id列列名和值。 ``` <insert id="insert2" useGeneratedKeys="true" keyProperty="id"> </insert> ``` keyColumn :??數據庫表中主鍵列的名字。 當需要設置多個屬性時, 使用逗號隔開 這種情況下通常還需要設置 keyColumn 屬性, 按順序指定數據庫的列。 keyProperty: 主鍵列對應的java類中屬性名。 useGeneratedKeys = true使用自動生成的主鍵值給指定列賦值。 ### ?2.4.3 使用selectKey返回主鍵的值 ?有些數據庫(如 Oracle) 不提供主鍵自增的功能, 而是使用序列得到一個值。?使用<selectKey>標簽來獲取主鍵的值, 這種方式不僅適用于不提供主鍵自增功能的數據庫, 也適用于提供主鍵自增功能的數據庫。 ###### Oracle: ``` <!-- Oracle 的例子,查詢多個列的時候需要 keyColumn --> <insert id="insertOracle"> <selectKey keyColumn="id" resultType="long" keyProperty="id" order="BEFORE"> SELECT SEQ_USER.nextval from dual </selectKey> insert into sys_user( id, user_name, user_password, user_email, user_info, head_img, create_time) values( #{id}, #{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP}) </insert> ``` ###### insert語句中要寫主鍵列 (id) insert into sys_user(id,...) **原因** ?在Oracle數據庫中,需要先從序列獲取id值, 然后將值賦給入參,再插入到數據庫中。 order = "BEFORE" * * * ###### MySQL ``` <insert id="insert3"> insert into sys_user( user_name, user_password, user_email, user_info, head_img, create_time) values( #{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP}) <selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> </insert> ``` ###### insert語句中不需要寫主鍵列 (id) insert into sys_user(username,...) **原因** 在MySQL數據庫中,先執行insert語句,再將獲得的主鍵值插入到表中,order="AFTER"。 keyProperty="id" 應該可以不寫。 ## ?2.5 update用法 根據id更新表中一條數據 ## 2.6 delete用法 根據id刪除表中一條數據 //判斷值是否相等 ?Assert.assertEquals(1, result); //判斷不為空 Assert.assertNull(user.getId()); ## ?2.7 Mapper接口方法有多個參數的用法 ###### mapper方法接口有多個參數時,加參數前加@param注解: ![40249da3d7f015fb1529c9b9a42dbca8.png](en-resource://database/546:1) ![acfe0fde89fc9246ae80daa29d56a6d8.png](en-resource://database/549:1) ###### 一個mapper方法接口有多個參數時的錯誤用法及報錯信息: ![65f57fa93c6a6b541eafc012b0cf7d24.png](en-resource://database/547:1) ![3e9c3ea97e7c09d10261a04fe31c726a.png](en-resource://database/545:1) **報錯原因:**?這個錯誤表示, XML可用的參數只有0、 1、 param1、 param2, 沒userId。 0和1 , param1和param2都是MyBatis根據參數位置自定義的名這時如果將XML中的#{userId}改為#{0}或#{param1}, 將#{enabled}改為#{1}或#{param2}, 這個方法就可以被正常調用了,但不要這么做。 但當只有一個參數(基本類型或擁有TypeHandler配置的類型) 的時候, MyBatis不關心這個參數叫什么名字就會直接把這個唯一的參數值拿來使用。 **接口中參數是兩個或兩個以上的JavaBean時,代碼如圖:** ![84559d2d237afc31953978b53f768811.png](en-resource://database/548:1) ?在XML中就不能直接使用#{userId}和#{enabled}了, 而是要通過點取值方式使用#{user.id}和#{role.enabled}從兩個JavaBean中取出指定屬性的值。 ## ?2.8 Mapper接口動態代理實現原理 *為什么Mapper接口沒有實現類卻能被正常調用呢?* *動態代理不熟悉 需要讀關于代理設計模式的代碼*
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看