tkMyBatis取得時に指定したカラムを返す

2659 ワード

tkMyBatisを使用する場合、Daoレイヤが直接継承するMapperは、既存の関数を使用してCRUDを行うことができますが、検索するときにすべてのカラムを返す必要はありません.Mybatisのようにxmlにどのカラムを返すかを指定できれば、より効率的ではないでしょうか.
そこで、簡単にMapperの内容を見て、selectの部分だけに注目して、Mapper->BaseMapper->BaseSelectMapper->SelectOneMapperに従って、selectOneメソッドのインタフェースを見ることができます.
public interface SelectOneMapper {
    @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
    T selectOne(T record);
}

ラベル@SelectProvider
mybatis 3の後に提供される、柔軟なsqlソースの設定に使用されます.ここではサービス提供クラスとメソッドが設定されていますが、このライブラリはmethodで指定したメソッドで直接sqlを返すのではなく、実行時に解析されます.
BaseSelectProviderを表示すると、selectOneの具体的な実装が見つかり、簡単に言えばStringタイプのsql文が返されます.
    public String selectOne(MappedStatement ms) {
        Class> entityClass = getEntityClass(ms);
        //            
        setResultType(ms, entityClass);
        StringBuilder sql = new StringBuilder();
        sql.append(SqlHelper.selectAllColumns(entityClass));
        sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));
        sql.append(SqlHelper.whereAllIfColumns(entityClass, isNotEmpty()));
        return sql.toString();
    }
は、selectOneがSqlHelperを通過することを示す.selectAllColumsにはすべてのカラムが含まれています.他のselect関連の関数も、すべてのカラムを返すので、tkMyBatisの
Mapperでは、検索関連は必ずすべてのカラムを返します.
以上
@SelectProviderは、tkMyBatis定義のこれらのインタフェースの実際のsql文を指定します.指定したカラムを返すために、SelectProviderクラスをカスタマイズして効率的な検索を実現することができます.
次のようになります.
BookDao.interface
public interface BookDao extends Mapper {
    @SelectProvider(type = BookSelectProvider.class, method = "selectIdAndName")
    @ResultMap("BookResultMap")
    public Book selectIdAndName(@Param("id") Integer id);
}

注意:ResultMapはxmlで定義する必要があります.そうしないと、戻りタイプが見つかりません.また、結果が複数である可能性がある場合は、Listタイプの戻り結果定義インタフェースを使用します.BookSelectProvider.java
public class BookSelectProvider {

    public String selectIdAndName(int id) {
        return "select id,name from book where id = " + id;
    }
}
Book.xml



 
	
		
		
	
Book.java
public class Book {

    @Id
    @GeneratedValue(generator = "JDBC")
    private Integer id;
	
    private String name;
	
    @Column(name="price")
    private double price;
    // get set toString  
}