2012-08-28 6 views
9

Son zamanlarda Mybatis3 kullanıyordum ve SQL deyimi veritabanından bir boş sonuç kümesi aldığında, Mybatis yeni List oluşturur ve programa döndürür bulundu. MyBatis boş bir sonuç kümesiyle nasıl başa çıkıyor?

gibi bazı kod Verilen:
List<User> resultList = (List<User>)sqlSession.select("statementId"); 

<select id="statementId" resultType="User"> 
    select * from user where id > 100 
</select> 

yukarıdaki SQL hiçbir satır iade varsayılmaktadır (yani 100'den herhangi bir kimlik daha yoktur).

resultList değişkeni boş bir List olacaktır, ancak bunun yerine null olmasını istiyorum. Bunu nasıl yapabilirim?

cevap

15

Bu sizin sorgunun sonucunda Boş koleksiyon yerine boş değer daha iyidir. Her öğe ile bir koleksiyon genellikle döngü ile çalışmaya ve bunun gibi onunla bir şeyler, bir şeyler yapmak zaman: Liste boşsa

List<User> resultList = (List<User>) sqlSession.select("statementId"); 
for (User u : resultList) { 
    //... 
} 

şey yapmaz hangi. Eğer boş dönerseniz

Ama, NullPointerExceptions karşı kodunuzu korumak ve bunun yerine böyle bir kod yazmak zorunda:

List<User> resultList = (List<User>) sqlSession.select("statementId"); 
if (resultList != null) { 
    for (User u : resultList) { 
    //... 
    } 
} 

Birinci yaklaşım genellikle daha iyidir ve MyBatis bunu böyle yapar, ama bunu zorlamak olabilir null, eğer gerçekten istediğin buysa.

Bunun için herhangi bir sorgu için MyBatis plugin ve yolunu kesmek aramaları yazıp sorgu sonucu boşsa boş geri dönebilirler. Yapılandırma eklenti olarak

: Burada

bazı kodudur

<plugins> 
    <plugin interceptor="pack.test.MyInterceptor" /> 
</plugins> 

önleme kodu: çağrıları yakalamak eğer o zaman daha da interceptor kapsamını sınırlayabilir

package pack.test; 

import java.util.List; 
import java.util.Properties; 

import org.apache.ibatis.executor.Executor; 
import org.apache.ibatis.mapping.MappedStatement; 
import org.apache.ibatis.plugin.Interceptor; 
import org.apache.ibatis.plugin.Intercepts; 
import org.apache.ibatis.plugin.Invocation; 
import org.apache.ibatis.plugin.Plugin; 
import org.apache.ibatis.plugin.Signature; 
import org.apache.ibatis.session.ResultHandler; 
import org.apache.ibatis.session.RowBounds; 

@Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}) }) 
public class MyInterceptor implements Interceptor { 
    public Object intercept(Invocation invocation) throws Throwable { 
     Object result = invocation.proceed(); 
     List<?> list = (List<?>) result; 
     return (list.size() == 0 ? null : result); 
    } 

    public Object plugin(Object target) { 
     return Plugin.wrap(target, this); 
    } 

    public void setProperties(Properties properties) { 
    } 
} 

Executor yerine ResultSetHandler.

1

Aşağıdaki nedenlerden dolayı boş liste yerine null adlı kullanmak her zaman daha iyidir. null

Dikkatsiz kullanım hataların şaşırtıcı bir çeşitlilik neden olabilir.

Ayrıca, boş nahoş belirsiz. Nadiren, boş bir dönüş değerinin ne anlama gelmesi gerektiği açıkça bellidir - örneğin Map.get (anahtar), null değeri, null olarak döndürülebilir, çünkü haritadaki değer boştur veya değer haritada değil. Boş başarısızlık anlamına gelebilir, başarı anlamına gelebilir, neredeyse her şey anlamına gelebilir. Boş olmayan bir şey kullanmak, anlamınızı netleştirir.

good discussion about null usage