Wenn Sie eine ID mit sich führen, wird diese normalerweise in int, long, String usw. gespeichert. In diesem Fall kann sie jedoch verwirrt und in den folgenden Fällen schwer verständlich werden.
public someMethod(int hogeId, int fugaId) { ... }
Wenn Sie dies tun können, können Sie unachtsame Fehler vermeiden. (Wenn Sie es chiguhagu machen, wird die IDE Sie als Fehler anzeigen.)
public someMethod(HogeId hogeId, FugaId fugaId) { ... }
Dies ist zwar leichter zu verstehen, es sind jedoch einige Punkte zu beachten.
Dies kann wie folgt realisiert werden.
PiyoId.java
package your.package;
import your.package.LongId;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
class PiyoId extends LongId {
public PiyoId(String id) { super(id); }
public PiyoId(long id) { super(id); }
}
LongId.java
package your.package;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public abstract class LongId {
private final long id;
public LongId(String id) {
this.id = Long.parseLong(id);
}
public LongIdBase(long id) {
this.id = id;
}
@JsonValue
public long getId() {
return this.id;
}
public String toString() {
return this.getClass().getSimpleName() + "(" + this.id + ")";
}
}
LongIdTypeHandler.java
package your.package;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import your.package.HogeId;
import your.package.LongId;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
//Listen Sie hier die ID-Klassen auf
@MappedTypes(value = {HogeId.class})
public class LongIdTypeHandler<E extends LongId> extends BaseTypeHandler<E> {
private final Class<E> type;
public LongIdTypeHandler(Class<E> type) {
if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}
private E createInstance(boolean wasNull, long id) {
if (wasNull) {
return null;
}
try {
return type.getDeclaredConstructor(long.class).newInstance(id);
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
@Override
public void setNonNullParameter(PreparedStatement ps, int num, E parameter, JdbcType jdbcType) throws SQLException {
long id = rs.getLong(columnName);
return createInstance(rs.wasNull(), id);
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
long id = rs.getLong(columnName);
return createInstance(rs.wasNull(), id);
}
@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
long id = rs.getLong(columnIndex);
return createInstance(rs.wasNull(), id);
}
@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
long id = cs.getLong(columnIndex);
return createInstance(cs.wasNull(), id);
}
}
Um nahtlos konvertieren zu können, muss es eine der folgenden sein:
Einer der folgenden:
@ JsonCreator
Einer der folgenden:
4. Urteil von Getter
5. Führen Sie die Methode mit @ JsonValue
aus
Entsprechen 3 und 5
Beide der folgenden Punkte müssen angesprochen werden:
parameterType =" com. ~ .PiyoId "
angeben und es mit der Beschreibung# {id}
abrufen.long getId ()
in PiyoId
definiert ist.parameterType =" com. ~ .Piyo "
angeben, damit es mit der Beschreibung # {id}
abgerufen werden kann.setNonNullParameter
implementiert. getNullableResult
kann nicht verwendet werden, da die konkrete Klasse unbekannt ist und neue nicht möglich sind.
Damit es in ResultMap von MyBatis ~~ konvertiert werden kann ~~ [2020/02/15 postscript] Es ist möglich, durch Auflisten konkreter Klassen in TypeHandler neue zu erstellen.Es funktioniert nicht mit selectKey
<insert id="insert" parameterType="your.package.Hoge">
INSERT INTO hoges (value1, value2)
VALUES (#{value1}, #{value2})
<selectKey resultType="your.package.HogeId" keyProperty="id" order="AFTER">
select @@IDENTITY
</selectKey>
</insert>
UseGeneratedKeys funktioniert
<insert id="insert" parameterType="your.package.Hoge" useGeneratedKeys="true" keyProperty="id">
INSERT INTO hoges (value1, value2)
VALUES (#{value1}, #{value2})
</insert>
Controller
Parameter @ PathVariable ("piyoId") PiyoId piyoId
@ RestController
RückgabewertPiyoId
gemischt ist, möchte ich es als numerischen Wert in JSON konvertieren.Verifizierungs-Schlüssel
//Schreiben Sie später
Recommended Posts