欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler

 更新時(shí)間:2022年08月09日 17:08:08   作者:寧在春  
這篇文章主要為大家介紹了MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

今天遇上這樣的一個(gè)情況,數(shù)據(jù)庫(kù)類型與Java對(duì)象屬性類型不對(duì)應(yīng),這種情況該如何處理

在 MySQL 中,字段的屬性為 BigInt,按道理來(lái)說(shuō),對(duì)應(yīng)Java中的Long類型。

但實(shí)際上項(xiàng)目中與之對(duì)應(yīng)的 Java對(duì)象中的屬性的類型是 Date類型,直接給我這個(gè)廢物當(dāng)頭一棒

而且不是一兩張表,是比較多的表處于DateBigInt混用的情況,

你說(shuō)要好好用Date就好好用Date,要好好用時(shí)間戳就好好用時(shí)間戳啊,還混用,類型還不對(duì)應(yīng),麻了

(別問(wèn)這個(gè)項(xiàng)目怎么出現(xiàn)這種事情的,就是來(lái)了人,又走了人,然后填坑)

保持微笑??(此處口吐芬芳xxxxxx)

一、思考

我想知道出現(xiàn)這種情況,你是如何思考的?

我的思考是,到底是改數(shù)據(jù)庫(kù),還是改程序代碼比較好。

但是無(wú)論哪一種我都不敢輕舉妄動(dòng),所以我做的第一步是把數(shù)據(jù)庫(kù)和代碼備份,確保不會(huì)被玩壞。

我也問(wèn)了同事,他的建議是讓我改程序。

但是怎么說(shuō)勒,我細(xì)細(xì)比較了改代碼和改程序的麻煩程度,改數(shù)據(jù)表麻煩會(huì)少很多,我就在表結(jié)構(gòu)中的Bigint 類型改為 datatime 類型,而且當(dāng)時(shí)我的任務(wù),是只局限于一兩張業(yè)務(wù)表,影響范圍不大,引用也不多。

我就興沖沖的把表結(jié)構(gòu)改了,然后把任務(wù)完成了~

等到今天上午,我之前詢問(wèn)的那個(gè)同事也遇到這個(gè)問(wèn)題,他就向上面的經(jīng)理提了一嘴,說(shuō)時(shí)間類型不對(duì),問(wèn)他標(biāo)準(zhǔn)是哪一種,經(jīng)理說(shuō)是時(shí)間戳,我心里一涼~,麻了,(此處省略一萬(wàn)句)

聽(tīng)完,我就苦逼的把表結(jié)構(gòu)改回來(lái)了,此時(shí)備份就發(fā)生作用了~

還原完數(shù)據(jù)表后,我就打算去改程序代碼了

周一寫 bug,bug 改一周

突然他和我聊到,xxx,你知道MybatisPlus,有什么方法可以做這種轉(zhuǎn)換嗎?

這每一個(gè)都要改,太麻煩了,而且業(yè)務(wù)代碼中肯定也用到了,這改起來(lái)代價(jià)太大了,有沒(méi)有注解的方式可以解決轉(zhuǎn)換問(wèn)題。

很淺顯的思考,但是我能夠感覺(jué)到自己的經(jīng)驗(yàn)的不足,對(duì)于很多偷懶(思考),我還是差的太遠(yuǎn)了。

二、解決方式

因?yàn)橛玫降?ORM 框架是 MybatisPlus,所以首先找的就是有沒(méi)有官方的支持。

繼而就在官網(wǎng)找到一個(gè)字段類型處理器,一看才發(fā)現(xiàn),是學(xué)過(guò)的東西啊,只怪用的太少,知道的太少啊。

然后根據(jù)這個(gè)線索繼續(xù)找,就了解到 MyBatis-Plus 字段類型處理器 TypeHandler

這個(gè) TypeHandler 處于的位置,就是應(yīng)用程序和數(shù)據(jù)庫(kù)之間的攔截器,所有的操作,都會(huì)走一遍這里。

就翻看源碼,想用一個(gè)東西,最快的方式就是看一下源碼的實(shí)現(xiàn)

2.1、TypeHandler源碼

  public interface TypeHandler<T> {
   /**
     * 入庫(kù)前的類型轉(zhuǎn)換
    */
   void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
   /**
     * 得到結(jié)果。
     * 查詢后的數(shù)據(jù)處理
    */
   T getResult(ResultSet rs, String columnName) throws SQLException;
   T getResult(ResultSet rs, int columnIndex) throws SQLException;
   T getResult(CallableStatement cs, int columnIndex) throws SQLException;
 }

找到接口,看一下源碼中針對(duì)已有屬性是如何處理,我們仿寫一份,達(dá)到我們的要求即可啊.

2.2、BaseTypeHandler 源碼

有這么多,我們直接看一下 BaseTypeHandler 是什么樣的處理邏輯,

一方面 base 嗎,基礎(chǔ)嗎,我們就看看基礎(chǔ)是什么樣的處理啦,另外一方面他是抽象類嗎,說(shuō)明它其他實(shí)現(xiàn)類的基類嗎。

 public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler<T> {
   @Override
   public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
     if (parameter == null) {
       if (jdbcType == null) {
         throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters.");
       }
       try {
         ps.setNull(i, jdbcType.TYPE_CODE);
       } catch (SQLException e) {
         throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . "
               + "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. "
               + "Cause: " + e, e);
       }
     } else {
       try {
         setNonNullParameter(ps, i, parameter, jdbcType);
       } catch (Exception e) {
         throw new TypeException("Error setting non null for parameter #" + i + " with JdbcType " + jdbcType + " . "
               + "Try setting a different JdbcType for this parameter or a different configuration property. "
               + "Cause: " + e, e);
       }
     }
   }
   @Override
   public T getResult(ResultSet rs, String columnName) throws SQLException {
     try {
       return getNullableResult(rs, columnName);
     } catch (Exception e) {
       throw new ResultMapException("Error attempting to get column '" + columnName + "' from result set.  Cause: " + e, e);
     }
   }
   @Override
   public T getResult(ResultSet rs, int columnIndex) throws SQLException {
     try {
       return getNullableResult(rs, columnIndex);
     } catch (Exception e) {
       throw new ResultMapException("Error attempting to get column #" + columnIndex + " from result set.  Cause: " + e, e);
     }
   }
   @Override
   public T getResult(CallableStatement cs, int columnIndex) throws SQLException {
     try {
       return getNullableResult(cs, columnIndex);
     } catch (Exception e) {
       throw new ResultMapException("Error attempting to get column #" + columnIndex + " from callable statement.  Cause: " + e, e);
     }
   }
     // 這里就是設(shè)置為 不為 null 時(shí)的入庫(kù)
   public abstract void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
   /**
    * 獲取可為空的結(jié)果。
    */
   public abstract T getNullableResult(ResultSet rs, String columnName) throws SQLException;
   public abstract T getNullableResult(ResultSet rs, int columnIndex) throws SQLException;
   public abstract T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException;
 }

看起來(lái)好像很長(zhǎng)很多的樣子:當(dāng)我們?nèi)サ裟切┡袛?,精?jiǎn)一下:

 public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler<T> {
   @Override
   public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
       // 設(shè)置不為null的參數(shù),進(jìn)行入庫(kù) ,此處是抽象類,下層還有實(shí)現(xiàn)類,
       // 記住這里,待會(huì)帶你看實(shí)現(xiàn)類,你就知道了
       setNonNullParameter(ps, i, parameter, jdbcType);
   }
   @Override
   public T getResult(ResultSet rs, String columnName) throws SQLException {
       //  這里從數(shù)據(jù)庫(kù)中獲取到數(shù)據(jù),然后進(jìn)行類型的一個(gè)設(shè)置
       return getNullableResult(rs, columnName);
   }
   @Override
   public T getResult(ResultSet rs, int columnIndex) throws SQLException {
       //這兩個(gè)抽象方法,給我的感覺(jué)是一模一樣的,包括下一個(gè)也是如此
       return getNullableResult(rs, columnIndex);
   }
   @Override
   public T getResult(CallableStatement cs, int columnIndex) throws SQLException {
       return getNullableResult(cs, columnIndex);
   }
 }

2.3、BigIntegerTypeHandler 源碼中的實(shí)現(xiàn)類

 public class BigIntegerTypeHandler extends BaseTypeHandler<BigInteger> {
   @Override
   public void setNonNullParameter(PreparedStatement ps, int i, BigInteger parameter, JdbcType jdbcType) throws SQLException {
     // 這里是轉(zhuǎn)為 BigDecimal ,所以這里就算 setBigDecimal,
     // 那么我們就可以猜測(cè),它還支持其他的方法,Date的話,那就是setDate
     ps.setBigDecimal(i, new BigDecimal(parameter));
   }
   @Override
   public BigInteger getNullableResult(ResultSet rs, String columnName) throws SQLException {
     BigDecimal bigDecimal = rs.getBigDecimal(columnName);
       // 這里是rs.getBigDecimal ,我們待會(huì)去試一下能否getDate就可以了
     return bigDecimal == null ? null : bigDecimal.toBigInteger();
   }
    // 這兩個(gè)暫時(shí)沒(méi)有做了解,Debug的時(shí)候,斷點(diǎn)沒(méi)有執(zhí)行到這,后期再補(bǔ)一塊的知識(shí)
    // 但是為了以防萬(wàn)一,我們待會(huì)也會(huì)照著它的方式將代碼改成這樣
   @Override
   public BigInteger getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
     BigDecimal bigDecimal = rs.getBigDecimal(columnIndex);
     return bigDecimal == null ? null : bigDecimal.toBigInteger();
   }
   @Override
   public BigInteger getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
     BigDecimal bigDecimal = cs.getBigDecimal(columnIndex);
     return bigDecimal == null ? null : bigDecimal.toBigInteger();
   }
 }

這個(gè)實(shí)現(xiàn)類,沒(méi)什么代碼,而且就是set、get ,并沒(méi)有其他的一些處理邏輯什么的。

那么我們也照這樣的方式實(shí)現(xiàn)一個(gè)。

2.4、嘗試

先明確目標(biāo),我們Mysql 中的字段類型 為 BigInt,Java程序中的屬性類型為 Date,

所以我們?cè)谌霂?kù)的時(shí)候就是要將 Date 類型轉(zhuǎn)化為 Long進(jìn)行入庫(kù),

在從數(shù)據(jù)庫(kù)中取出來(lái)的時(shí)候,要從 Long 類型轉(zhuǎn)化為 Date 映射到 JavaBean中

我們直接copy上面的代碼,然后進(jìn)行一些更改

 public class MyDateTypeHandler implements TypeHandler<Date>{
     /**
      * 入庫(kù)前的類型轉(zhuǎn)換 即執(zhí)行insert、update方法時(shí)會(huì)執(zhí)行
      */
     @Override
     public void setParameter(PreparedStatement ps, int i, Date parameter,
             JdbcType jdbcType) throws SQLException {
         log.info("setParameter(PreparedStatement ps, int i, Date parameter,JdbcType jdbcType)....");
         log.info("[{}],[{}]",parameter,jdbcType);
         ps.setLong(i, parameter.getTime());
     }
     /**
      * 查詢后的數(shù)據(jù)處理
      * 這就是查詢出來(lái),進(jìn)行映射的時(shí)候,會(huì)執(zhí)行這段代碼
      */
     @Override
     public Date getResult(ResultSet rs, String columnName) throws SQLException {
         log.info("getResult(ResultSet rs, String columnName)....",columnName);
         return new Date(rs.getLong(columnName));
     }
     @Override
     public Date getResult(ResultSet rs, int columnIndex) throws SQLException {
         log.info("getResult(ResultSet rs, int columnIndex)....");
         return new Date(rs.getLong(columnIndex));
     }
     @Override
     public Date getResult(CallableStatement cs, int columnIndex)
             throws SQLException {
         log.info("getResult(CallableStatement cs, int columnIndex)....");
         return cs.getDate(columnIndex);
     }
 }

咋一眼好像成功啦,但是我們忽略了一個(gè)問(wèn)題,就是MybatisPlus怎么知道它的存在?

那些默認(rèn)允許進(jìn)行相互進(jìn)行類型轉(zhuǎn)換的Handler,它在程序啟動(dòng)的時(shí)候,就已經(jīng)被注冊(cè)了。

但是我們寫了這個(gè)類,一方面沒(méi)有被MybatisPlus知曉,另一方面還沒(méi)有指明給誰(shuí)使用,我們又該怎么使用?

基于此,我寫了一個(gè)小Demo,希望大家能夠弄明白,以后遇上也能夠解決一些問(wèn)題

三、實(shí)踐案例

實(shí)現(xiàn)目標(biāo)

Mysql 中的表的字段為Bigint,Java程序中為 Date 類型,我們希望還是可以一如既往的使用

MybatisPlus的方法,實(shí)現(xiàn)save、list類似這種方法的正常調(diào)用,而無(wú)需我在保存的時(shí)候,將前端傳過(guò)來(lái)的數(shù)據(jù)手動(dòng)轉(zhuǎn)換為時(shí)間戳,再存放至數(shù)據(jù)庫(kù)。查詢時(shí)亦是如此

3.1、數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)

 SET NAMES utf8mb4;
 SET FOREIGN_KEY_CHECKS = 0;
 -- ----------------------------
 -- Table structure for handler_test
 -- ----------------------------
 DROP TABLE IF EXISTS `handler_test`;
 CREATE TABLE `handler_test`  (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
   `date` bigint(50) NOT NULL COMMENT '存時(shí)間戳',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 -- ----------------------------
 -- Records of handler_test
 -- ----------------------------
 INSERT INTO `handler_test` VALUES (1, '測(cè)試數(shù)據(jù)1', 1659967236);
 INSERT INTO `handler_test` VALUES (2, '測(cè)試數(shù)據(jù)2', 1659967236);
 INSERT INTO `handler_test` VALUES (3, '測(cè)試插入數(shù)據(jù)', 1659968162926);
 INSERT INTO `handler_test` VALUES (4, '測(cè)試插入數(shù)據(jù)', 1659972053771);
 INSERT INTO `handler_test` VALUES (5, '測(cè)試插入數(shù)據(jù)', 1659972815670);
 SET FOREIGN_KEY_CHECKS = 1;

3.2、相關(guān)代碼

我只貼出了相關(guān)的代碼,其余代碼在源碼倉(cāng)庫(kù)中有,別慌,家人們

service

 public interface IHandlerTestService extends IService<HandlerTest> {
 }

TypeHandler 實(shí)現(xiàn)類

 /**
  * @author Ning zaichun
  */
 @Slf4j
 @MappedJdbcTypes({JdbcType.BIGINT})  //對(duì)應(yīng)數(shù)據(jù)庫(kù)類型
 @MappedTypes({Date.class})            //java數(shù)據(jù)類型
 public class MyDateTypeHandler implements TypeHandler<Date>{
     /**
      * 入庫(kù)前的類型轉(zhuǎn)換
      */
     @Override
     public void setParameter(PreparedStatement ps, int i, Date parameter,
             JdbcType jdbcType) throws SQLException {
         log.info("setParameter(PreparedStatement ps, int i, Date parameter,JdbcType jdbcType)....");
         log.info("[{}],[{}]",parameter,jdbcType);
         ps.setLong(i, parameter.getTime());
     }
     /**
      * 查詢后的數(shù)據(jù)處理
      */
     @Override
     public Date getResult(ResultSet rs, String columnName) throws SQLException {
         log.info("getResult(ResultSet rs, String columnName)....");
         log.info("[{}]",columnName);
         return new Date(rs.getLong(columnName));
     }
     @Override
     public Date getResult(ResultSet rs, int columnIndex) throws SQLException {
         log.info("getResult(ResultSet rs, int columnIndex)....");
         return new Date(rs.getLong(columnIndex));
     }
     @Override
     public Date getResult(CallableStatement cs, int columnIndex)
             throws SQLException {
         log.info("getResult(CallableStatement cs, int columnIndex)....");
         return cs.getDate(columnIndex);
     }
 }

實(shí)體類的修改,有兩點(diǎn),

第一點(diǎn),需要在實(shí)體類上加上

@TableName(value = "handler_test",autoResultMap = true)

value 是對(duì)應(yīng)表名,autoResultMap 說(shuō)的

是否自動(dòng)構(gòu)建 resultMap 并使用,

只生效與 mp 自動(dòng)注入的 method,

如果設(shè)置 resultMap 則不會(huì)進(jìn)行 resultMap 的自動(dòng)構(gòu)建并注入,

只適合個(gè)別字段 設(shè)置了 typeHandler 或 jdbcType 的情況

第二點(diǎn)就是要在需要處理的字段上加上

@TableField(typeHandler = MyDateTypeHandler.class)

注解,class就寫我們自己編寫 Handler.class即可

 @Data
 @TableName(value = "handler_test",autoResultMap = true)
 @EqualsAndHashCode(callSuper = false)
 public class HandlerTest implements Serializable {
     private static final long serialVersionUID = 1L;
     private String name;
     /**
      * 存時(shí)間戳
      */
     @TableField(typeHandler = MyDateTypeHandler.class)
     @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date date;
 }

弄完上述這兩點(diǎn),我們還有一個(gè)問(wèn)題,我之前提到一個(gè)注冊(cè),雖然我們指定了,也寫好了,但實(shí)際上,還并沒(méi)有注冊(cè)到一個(gè)存儲(chǔ) TypeHandler 一個(gè) Map 集合中去的,也就是說(shuō)Mybatis 在遇到的時(shí)候,其實(shí)還是不知道它的存在的~。

但其實(shí)只需要在配置文件中加一行即可,原諒我這么繞圈子,只是希望說(shuō)明白這是一步步得來(lái)的

type-handlers-package 后面填寫的是我們Handler 存放的包路徑。

有這一步即可。

3.3、測(cè)試

 @RunWith(SpringRunner.class)
 @SpringBootTest
 @ContextConfiguration(classes = HandlerApplication.class)
 public class HandlerServiceTest {
     @Autowired
     IHandlerTestService handlerTestService;
     @Test
     public void test1(){
         List<HandlerTest> list = handlerTestService.list();
         list.forEach(System.out::println);
     }
     @Test
     public void test2(){
         HandlerTest handlerTest = new HandlerTest();
         handlerTest.setDate(new Date());
         handlerTest.setName("測(cè)試插入數(shù)據(jù)");
         handlerTestService.save(handlerTest);
     }
 }

測(cè)試插入

 ==>  Preparing: SELECT name,date FROM handler_test
 ==> Parameters: 
 <==    Columns: name, date
 <==        Row: 測(cè)試數(shù)據(jù)1, 1659967236
 2022-08-08 23:55:25.854  INFO 7368 --- [           main] com.nzc.demo.handler.MyDateTypeHandler   : getResult(ResultSet rs, String columnName)....
 1659967236
 <==        Row: 測(cè)試數(shù)據(jù)2, 1659967236
 2022-08-08 23:55:25.855  INFO 7368 --- [           main] com.nzc.demo.handler.MyDateTypeHandler   : getResult(ResultSet rs, String columnName)....
 1659967236
 <==        Row: 測(cè)試插入數(shù)據(jù), 1659968162926
 2022-08-08 23:55:25.855  INFO 7368 --- [           main] com.nzc.demo.handler.MyDateTypeHandler   : getResult(ResultSet rs, String columnName)....
 1659968162926
 <==        Row: 測(cè)試插入數(shù)據(jù), 1659972053771
 2022-08-08 23:55:25.855  INFO 7368 --- [           main] com.nzc.demo.handler.MyDateTypeHandler   : getResult(ResultSet rs, String columnName)....
 1659972053771
 <==        Row: 測(cè)試插入數(shù)據(jù), 1659972815670
 2022-08-08 23:55:25.855  INFO 7368 --- [           main] com.nzc.demo.handler.MyDateTypeHandler   : getResult(ResultSet rs, String columnName)....
 1659972815670
 <==        Row: 測(cè)試插入數(shù)據(jù), 1659974106847
 2022-08-08 23:55:25.855  INFO 7368 --- [           main] com.nzc.demo.handler.MyDateTypeHandler   : getResult(ResultSet rs, String columnName)....
 1659974106847
 <==        Row: 測(cè)試插入數(shù)據(jù), 1659974125542
 2022-08-08 23:55:25.855  INFO 7368 --- [           main] com.nzc.demo.handler.MyDateTypeHandler   : getResult(ResultSet rs, String columnName)....
 1659974125542
 <==      Total: 7
 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@145113f]
 HandlerTest(name=測(cè)試數(shù)據(jù)1, date=Tue Jan 20 13:06:07 CST 1970)
 HandlerTest(name=測(cè)試數(shù)據(jù)2, date=Tue Jan 20 13:06:07 CST 1970)
 HandlerTest(name=測(cè)試插入數(shù)據(jù), date=Mon Aug 08 22:16:02 CST 2022)
 HandlerTest(name=測(cè)試插入數(shù)據(jù), date=Mon Aug 08 23:20:53 CST 2022)
 HandlerTest(name=測(cè)試插入數(shù)據(jù), date=Mon Aug 08 23:33:35 CST 2022)
 HandlerTest(name=測(cè)試插入數(shù)據(jù), date=Mon Aug 08 23:55:06 CST 2022)
 HandlerTest(name=測(cè)試插入數(shù)據(jù), date=Mon Aug 08 23:55:25 CST 2022)
 2022-08-08 23:55:25.863  INFO 7368 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closing ...
 2022-08-08 23:55:25.869  INFO 7368 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed
 

以上就是MyBatisPlus TypeHandler自定義字段類型轉(zhuǎn)換Handler的詳細(xì)內(nèi)容,更多關(guān)于MyBatisPlus字段類型轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot中通過(guò)8項(xiàng)配置優(yōu)化提升Tomcat性能的配置方法

    SpringBoot中通過(guò)8項(xiàng)配置優(yōu)化提升Tomcat性能的配置方法

    優(yōu)化Spring Boot,Spring Cloud 應(yīng)用程序中Tomcat的配置有助于提高性能和資源利用率,這篇文章主要介紹了SpringBoot中通過(guò)8項(xiàng)配置優(yōu)化提升Tomcat性能的配置方法,需要的朋友可以參考下
    2024-08-08
  • Java代碼注釋規(guī)范(動(dòng)力節(jié)點(diǎn)整理)

    Java代碼注釋規(guī)范(動(dòng)力節(jié)點(diǎn)整理)

    代碼注釋是架起程序設(shè)計(jì)者與程序閱讀者之間的通信橋梁,最大限度的提高團(tuán)隊(duì)開(kāi)發(fā)合作效率。也是程序代碼可維護(hù)性的重要環(huán)節(jié)之一。下面通過(guò)本文說(shuō)一下我們?cè)谌粘i_(kāi)發(fā)中使用的代碼注釋規(guī)范
    2017-03-03
  • JavaWeb實(shí)現(xiàn)簡(jiǎn)單用戶發(fā)送郵件

    JavaWeb實(shí)現(xiàn)簡(jiǎn)單用戶發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)簡(jiǎn)單用戶發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot接值實(shí)現(xiàn)方法詳解

    SpringBoot接值實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了SpringBoot接值實(shí)現(xiàn)方法,SpringBoot接值是指在SpringBoot應(yīng)用程序中接收請(qǐng)求參數(shù),從HTTP請(qǐng)求中獲取參數(shù),并將其綁定到Java對(duì)象中進(jìn)行處理的過(guò)程,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • 基于@JsonSerialize和@JsonInclude注解使用方法

    基于@JsonSerialize和@JsonInclude注解使用方法

    這篇文章主要介紹了@JsonSerialize和@JsonInclude注解使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 帶你深入概括Java!六、方法和方法重載!(推薦)

    帶你深入概括Java!六、方法和方法重載?。ㄍ扑])

    這篇文章主要介紹了Java方法和方法重載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java語(yǔ)言之LinkedList和鏈表的實(shí)現(xiàn)方法

    Java語(yǔ)言之LinkedList和鏈表的實(shí)現(xiàn)方法

    LinkedList是由傳統(tǒng)的鏈表數(shù)據(jù)結(jié)構(gòu)演變而來(lái)的,鏈表是一種基本的數(shù)據(jù)結(jié)構(gòu),它可以動(dòng)態(tài)地增加或刪除元素,下面這篇文章主要給大家介紹了關(guān)于Java語(yǔ)言之LinkedList和鏈表的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-05-05
  • Flowable數(shù)據(jù)庫(kù)表分類及數(shù)據(jù)字典解析

    Flowable數(shù)據(jù)庫(kù)表分類及數(shù)據(jù)字典解析

    這篇文章主要介紹了Flowable數(shù)據(jù)庫(kù)表分類及數(shù)據(jù)字典解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java數(shù)組及arrays類對(duì)數(shù)組的操作實(shí)例

    java數(shù)組及arrays類對(duì)數(shù)組的操作實(shí)例

    下面小編就為大家?guī)?lái)一篇java數(shù)組及arrays類對(duì)數(shù)組的操作實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java基礎(chǔ)入門總結(jié)之序列化和反序列化

    Java基礎(chǔ)入門總結(jié)之序列化和反序列化

    序列化是一種對(duì)象持久化的手段,普遍應(yīng)用在網(wǎng)絡(luò)傳輸、RMI等場(chǎng)景中,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)入門總結(jié)之序列化和反序列化的相關(guān)資料,需要的朋友可以參考下
    2022-02-02

最新評(píng)論