2017-10-27 2 views
0

Ich verwende MyBatis, um Daten in SQLite-Datenbank in einfacher Java-Anwendung zu speichern. Ist es möglich, MyBatis zu konfigurieren, um eine Datenumwandlung in der Kommunikation zwischen Java-Klasse und DB-Tabelle durchzuführen?MyBatis - So transformieren Sie Daten vor dem Speichern in DB-Tabelle

Zum Beispiel habe ich java.util.Date Objekt in meiner Java-Klasse und ich möchte es als Nummer speichern (Unix-Zeit). Ein anderes Beispiel: In der Java-Klasse habe ich eine BigDecimal-Nummer, die ich als Text speichern möchte (ich will keine Genauigkeit verlieren).

In Java-Objekten verwende ich geeignete Getter und Setter, um solche Daten zu konvertieren, aber ich sehe keine Möglichkeiten, sie in MyBatis .xml-Dateien anzugeben.

Zusammenfassend meine Fragen:
1. Kann ich Java Getter und Setter in MyBatis Result Map verwenden? Wenn ja, als wie?
2. Wie speichern Sie komplexe Daten (z. B. Dates und BigDecimals) in der DB über MyBatis?

+0

besser, einige Beispiel geben, damit wir helfen u besser –

Antwort

1

Ich habe mithilfe von TypeHandler Klasse in der Arbeit bekommen verwaltet. Es folgt ein Beispielcode für die Zuordnung von BigDecimal zu TEXT db Säule:

public class BigDecimalTypeHandler implements TypeHandler<BigDecimal> { 
    public BigDecimal getResult(ResultSet rs, int columnIndex) throws SQLException{ 
     String str_val = rs.getString(columnIndex); 
     BigDecimal res; 

     if(str_val == null || str_val.equals("")) 
      res = new BigDecimal(0); 
     else 
      res = new BigDecimal(str_val); 

     return res; 
    } 
    public BigDecimal getResult(ResultSet rs, String columnName) throws SQLException{ 
     String str_val = rs.getString(columnName); 
     BigDecimal res; 

     if(str_val == null || str_val.equals("")) 
      res = new BigDecimal(0); 
     else 
      res = new BigDecimal(str_val); 

     return res; 
    } 
    public BigDecimal getResult(CallableStatement cs, int columnIndex) throws SQLException{ 
     String str_val = cs.getString(columnIndex); 
     BigDecimal res; 

     if(str_val == null || str_val.equals("")) 
      res = new BigDecimal(0); 
     else 
      res = new BigDecimal(str_val); 

     return res; 
    } 
    public void setParameter(PreparedStatement ps, int i, BigDecimal parameter, JdbcType jdbcType) throws SQLException{ 
     if(parameter != null) 
      ps.setString(i, parameter.toString()); 
     else 
      ps.setString(i, "0"); 
    } 
} 

Und in Mybatis config file:

<configuration> 
    (...) 
    <typeHandlers> 
     <typeHandler javaType="BigDecimal" jdbcType="VARCHAR" handler="example.com.BigDecimalTypeHandler"/> 
    </typeHandlers> 
    (...) 
</configuration> 
0

Ich bin mir ziemlich sicher, dass das ‚binden‘ Element von Mybatis Sie sich die Mühe sparen könnte

<select id="selectBlogsLike" resultType="Blog"> 
    <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" /> 
    SELECT * FROM BLOG 
    WHERE title LIKE #{pattern} 
</select> 

In diesem Fall ist es die Getter ist mit und% verketten. In Ihrem Fall können Sie dort einfache Transformationen vornehmen.

http://www.mybatis.org/mybatis-3/dynamic-sql.html

+0

Zunächst einmal vielen Dank für die Antworten. Es scheint eine gute Möglichkeit zu sein, Abfragen mit WHERE zu behandeln, aber ich bin mir nicht sicher, ob es funktioniert, um Tabellenzeilen der Java-Klasse zuzuordnen. Ich habe die TypeHandler-Klasse in MyBatis gefunden und denke, es ist der richtige Weg, um meine Ziele zu erreichen. Ich werde damit experimentieren und wenn es mir gelingt, werde ich es hier als Antwort veröffentlichen. – caspinos

Verwandte Themen