<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## AttributeConvert 可以自定義一個屬性注解,BeetlSQL上遇到此屬性注解,將按照屬性注解的執行類去執行映射,比如對手機號碼的入庫加密,出庫解密。比如對JSON對象序列化成字符串到數據庫,然后從數據庫反序列成成對象。同其他BeetlSQL擴展注解機制類似,實現一個擴展注解,需要使用@Builder注解申明其執行類 ```java @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD}) @Builder(Base64Convert.class) public static @interface Base64 { } ``` 如上申明一個@Base64,用于字段在入庫加密,出庫解密。其實現類使用@Builder注解申明,本例其執行類是Base64Convert。 執行類必須是一個AttributeConvert的子類 ```java public static class Base64Convert implements AttributeConvert { Charset utf8 = Charset.forName("UTF-8"); public Object toDb(ExecuteContext ctx, Class cls, String name, Object pojo) { String value= (String) BeanKit.getBeanProperty(pojo,name); byte[] bs = java.util.Base64.getEncoder().encode(value.getBytes(utf8)); return new String(bs,utf8); } public Object toAttr(ExecuteContext ctx, Class cls, String name, ResultSet rs, int index) throws SQLException { String value = rs.getString(index); return new String(java.util.Base64.getDecoder().decode(value),utf8); } } ``` toDb方法用于將屬性轉化為列,pojo是入庫的POJO對象,name是指其屬性名稱,可以調用BeetlSQL3提供的類BeanKit.getBeanProperty獲取對象屬性值 toAttr將數據庫轉化為屬性。 如下是使用@Base64的一個例子 ```java @Table(name="sys_user") @Data public class UserData{ @AutoID Integer id; @Base64 String name; } ``` 如下是定義了一個@Update注解 ```java @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD}) @Builder(UpdateTimeConvert.class) public @interface UpdateTime { } public class UpdateTimeConvert implements AttributeConvert { @Override public Object toDb(ExecuteContext ctx, Class cls,String name, Object pojo){ Date now = new Date(); BeanKit.setBeanProperty(pojo,now,name); return now; } } ``` 這樣,在每次入庫操作的時候,都取得最新的時間。并調用BeanKit.setBeanProperty賦值給pojo對象,并返回當前時間 。BeetlSQL3通過返回的當前時間做入庫操作,因此調用BeanKit.setBeanProperty 不是必須操作。但POJO對象還需要有一個與數據庫操作結果一致的值。如果未調用。pojo的對應屬性為null。 源碼例子org.beetl.sql.test.annotation.Jackson 是一個把對象序列化成字符串存入數據庫,或者從數據庫取出反序列化成對象。 ```java @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD}) @Builder(JacksonConvert.class) public @interface Jackson { } ``` JacksonConvert 實現了AttributeConvert,以toDb為例子 ```java public class JacksonConvert implements AttributeConvert { ObjectMapper objectMapper = new ObjectMapper(); @Override public Object toDb(ExecuteContext ctx, Class cls,String name, Object dbValue) { Object obj = BeanKit.getBeanProperty(dbValue,name); if(obj==null){ return null; } try { String str = objectMapper.writeValueAsString(obj); return str; } catch (JsonProcessingException e) { throw new IllegalArgumentException(...); } } } ``` AttributeConvert還能影響針對POJO自動生成的內置SQL語句,提供如下方法 ```java default String toAutoSqlPart(DBStyle dbStyle,Class cls,AutoSQLEnum autoSQLEnum, String name){ return null; } ``` 默認情況下,返回nul,不會影響自動生成語句,比如對于內置insert語句,生成的是 ```sql insert into .... value( #{id},#{jsonData} ) ``` 在postgres數據庫,如果json_data列使用了jsonb,那期望內置生成的insert sql語句是 ```sql insert into .... value( #{id},#{jsonData}::JSON ) ``` 針對這個情況,可以`JacksonConvert` 可以重寫toAutoSqlPart ```java default String toAutoSqlPart(DBStyle dbStyle,Class cls,AutoSQLEnum autoSQLEnum, String name){ return "$$::JSON"; } ``` 這里的$$代表了屬性占位符號,BeetlSQL的內置生成sql語句依據此生成合適的sql語句,如替換`$$`,生成`#{jsonData}::JSON`. 或者替換成`?::JSON` 取決于生成方式。 可以參考源碼例子 org.beetl.sql.postgres.JacksonConvert
                  <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>

                              哎呀哎呀视频在线观看