@TableName, @TableId, @TableField, MyBatis-Plus-Feldtypprozessor TypeHandler

Beispiel: @TableName, @TableId und @TableField

@TableName(value = "sys_Log")  //value作用:value指定数据库中的表名
public class SysLog {}

@TableId(type=IdType.AUTO)     //声明主键自增长
 private Long id;

@TableField(value = "email")     //通过tableField进行字段不一致的映射, 比如数据库字段是email,而实体类对应的是mail
private String mail;              

@TableField(select = false)        //查询时,则不返回该字段的值

@TableField(exist = false)         //设置该字段在数据库表中不存在

@TablieField(value = "create_time",fill = FieldFill.INSERT)   //插入时自动填充
 private LocalDateTime createTime;

@TablieField(value = "update_time",fill = FieldFill.INSERT_UPDATE)    //更新时自动填充
 private LocalDateTime updateTime;

2. MyBatis-Plus-Feldtypprozessor TypeHandler

【Hintergrund verwenden】

Wenn der Datenbanktyp nicht dem Java-Objektattributtyp entspricht, besteht die Hoffnung, dass das Problem der Datentypkonvertierung beim Einfügen, Aktualisieren und Abfragen durch Anmerkungen gelöst werden kann.

比如说我们Mysql 中的字段类型 为 BigInt,Java程序中的属性类型为 Date,所以我们在入库的时候就是要将
 Date 类型转化为 Long进行入库,在从数据库中取出来的时候,要从 Long 类型转化为 Date 映射到 JavaBean中

[Hier eine Zuordnungstabelle einfügen]

MySQL-Datentypen Attributtypen der Java-Entitätsklasse veranschaulichen
int Ganze Zahl Unabhängig davon, ob es signiert oder nicht signiert ist, ist der Java-Entitätstyp Integer.
bigint Lang Unabhängig von der Anzahl der bigint(xxx)-Klammern, ob mit oder ohne Vorzeichen, ist der Java-Entitätstyp Long.
bisschen Byte[] -
tinyint Byte Unabhängig davon, ob es signiert oder nicht signiert ist, ist der Java-Entitätstyp Byte im Paket java.lang
smallint Kurz Unabhängig davon, ob es signiert oder nicht signiert ist, ist der Java-Entitätstyp Short.
verkohlen Zeichenfolge Unabhängig davon, ob char ein Codierungstyp wie gbk, utf8, utf8mb4 usw. ist, ist der Java-Entitätstyp String
Varchar Zeichenfolge Unabhängig davon, ob char ein Codierungstyp wie gbk, utf8, utf8mb4 usw. ist, ist der Java-Entitätstyp String
longvarchar Zeichenfolge Unabhängig davon, ob char ein Codierungstyp wie gbk, utf8, utf8mb4 usw. ist, ist der Java-Entitätstyp String
Datum Datum java.util.Datum
Terminzeit Datum java.util.Datum
Zeitstempel Datum java.util.Datum
Zeit Datum java.util.Datum
schweben Schweben Unabhängig davon, ob signiert oder nicht signiert, ist der Java-Entitätstyp Float.
Dezimal Lang -
numerisch Lang -
doppelt Doppelt Unabhängig davon, ob signiert oder nicht signiert, ist der Java-Entitätstyp Double.
Tinytext Zeichenfolge -
Text Zeichenfolge -
Jahr Datum java.util.Datum
Aufzählung Zeichenfolge -

【Prinzip】

MyBatis-Plus-Feldtypprozessor TypeHandler, die Position dieses TypeHandlers ist der Abfangjäger zwischen der Anwendung und der Datenbank, und alle Vorgänge werden über diesen abgewickelt. @TableField ist ein Feldprozessor von mybatis-plus. Dieser Prozessor kann das Problem der Feldtypkonvertierung lösen, erfordert jedoch für die Konvertierung einen Prozessor vom Typ typeHandler Class<? erweitert TypeHandler>.

数据库类型与Java对象属性类型不对应,通过TypeHandler注解的方式,
setParameter方法可以解决插入、更新时的数据转换问题,
getResult方法查询时的数据类型转换问题。这里可以实现TypeHandler类型来实现自定义类型处理器。

[TypeHandler-Quellcode; Sie können auf BaseTypeHandler und BigIntegerTypeHandler verweisen, um die Verarbeitungsklasse entsprechend Ihren eigenen Anforderungen anzupassen und TypeHandler zu implementieren]

 public interface TypeHandler<T> {
 
   /**
     * 入库前的类型转换;用于把 java 对象设置到 PreparedStatement 的参数中
    */
   void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
 
   /**
     * 得到结果。
     * 查询后的数据处理; 用于从 ResultSet 中根据列名取出数据转换为 java 对象
    */
   T getResult(ResultSet rs, String columnName) throws SQLException;
  
    // 用于从 ResultSet 中根据索引位置取出数据转换为 java 对象
   T getResult(ResultSet rs, int columnIndex) throws SQLException;
     
   // 用于从 CallableStatement 中根据存储过程取出数据转换为 java 对象
   T getResult(CallableStatement cs, int columnIndex) throws SQLException;
 
 }

【BaseTypeHandler implementiert TypeHandler】

 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 {
       // 设置不为null的参数,进行入库 ,此处是抽象类,下层还有实现类,
         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);
     }
   }
 
     // 这里就是设置为 不为 null 时的入库
   public abstract void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
 
   /**
    * 获取可为空的结果。
    */
   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;
 
 }
 

【BigIntegerTypeHandler erbt BaseTypeHandler】

用于 java 类型 BigDecimal,jdbc 类型 REAL、DECIMAL、NUMERIC
public class BigIntegerTypeHandler extends BaseTypeHandler<BigInteger> {
 
   @Override
   public void setNonNullParameter(PreparedStatement ps, int i, BigInteger parameter, JdbcType jdbcType) throws SQLException {
     // 这里是转为 BigDecimal ,所以这里就算 setBigDecimal,
     // 那么我们就可以猜测,它还支持其他的方法,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 ,我们待会去试一下能否getDate就可以了
     return bigDecimal == null ? null : bigDecimal.toBigInteger();
   }
 
    // 这两个暂时没有做了解,Debug的时候,断点没有执行到这,后期再补一块的知识
    // 但是为了以防万一,我们待会也会照着它的方式将代码改成这样
   @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();
   }
 }
 

【üben】

In der tatsächlichen Entwicklung können wir den Typ org.apache.ibatis.type.BaseTypeHandler erben, um einen benutzerdefinierten Typprozessor zu implementieren. Dieser Typ ist ein abstrakter Typ. Er implementiert die TypeHandler-Methode, um den allgemeinen Prozess zu kapseln, behandelt Ausnahmen und definiert mehrere ähnliche abstrakte Methoden, wie unten gezeigt.
Das Erben des BaseTypeHandler-Typs kann die Entwicklungsschwierigkeiten erheblich reduzieren.

·

[ Zum Beispiel ] In „Benutzer“ gibt es ein Attribut vom Typ „Liste“, und das entsprechende in der Datenbank gespeicherte Feld ist vom Typ „VARCHAR“. Sie müssen TypeHandler verwenden, um beim Einfügen Daten vom Listentyp in die Verarbeitung vom Typ String zu konvertieren, und beim Abfragen müssen Sie die Abfragezeichenfolge in den Listentyp konvertieren.

1. Erben Sie BaseTypeHandler, um einen benutzerdefinierten TypeHandler zu implementieren


public class ListTypeHandler extends BaseTypeHandler<List<String>> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, String.join(",", parameter));
    }

    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String s = rs.getString(columnName);
        return s == null ? null : Arrays.asList(s.split(","));
    }

    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String s = rs.getString(columnIndex);
        return s == null ? null : Arrays.asList(s.split(","));
    }

    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String s = cs.getString(columnIndex);
        return s == null ? null : Arrays.asList(s.split(","));
    }
}


2. Kommentieren Sie das angegebene Feld

@TableField(typeHandler = ListTypeHandler .class)

AbstractJsonTypeHandler

mybatisplus hat die Implementierungsklasse von AbstractJsonTypeHandler für FastJson, Gson und Jackson JSON für Java-Objekte bereitgestellt;

//json从数据库中取出转换成对象

@TableField(typeHandler = FastjsonTypeHandler.class)
private 实体类 xxx;

Auffüllen

Verwenden Sie Zuordnungsanmerkungen für Entitätsklassen:
@TableName(value = „a“, autoResultMap = true)
Wenn der Parameter autoResultMap true ist, bedeutet dies, dass einzelne Felder während der Abfrageverarbeitung automatisch in Objekte konvertiert werden. Dies ist nur für Situationen geeignet, in denen TypeHandler und jdbcTyped sind festgelegt. autoResultMap ordnet automatisch zu und wird normalerweise zusammen mit @TableField() verwendet, um die Standardisierung der Zuordnung zu bestimmen.

Guess you like

Origin blog.csdn.net/Little_Arya/article/details/131014171