2015-03-25 49 views
1

我使用JDBI與MySQL和我有一個接口GenericDao在那裏我已經這個方法你如何用JDBI做一個通用插入?

public void insert(T entity); 

如何使用流利的查詢,而不是SQLObjects實現此方法與JDBI?

是否可以使用這兩種方法之一?

handle.insert 

handle.createQuery 

回答

0

您可以通過實現GetHandle接口得到處理。

public abstract class GenericDao<T> implements GetHandle { 

    public void insert(T entity) { 
     getHandle().insert("some sql"); 
    }; 

} 
+0

如何映射屬性?因爲該實體的通用。 – dkulkarni 2015-03-26 14:57:19

+0

你可以讓所有的實體擴展/實現一些通用的抽象類或者可以給出屬性的接口。但是如果你想做所有這些事情,你可以去找一些ORM。 – Manikandan 2015-03-27 03:55:35

+0

是的,我選擇使用ORM – dkulkarni 2015-03-27 13:18:45

3

我發現SQLObjects當我用SQLObjects風格的工作很好,我:

public interface GenericDao<T> { 
    List<T> findAll(); 
    long insert(T t); 
    long update(T t); 
    long delete(long id); 
    T findNameById(long id); 
} 

然後我用一個抽象類將所有SQL

@RegisterMapper(VesselJDBIMapper.class) 
public abstract class VesselJDBI implements Transactional<VesselJDBI>, GenericDao<Vessel> { 

    @SqlUpdate("UPDATE vessel SET vessel_name = :vesselName, version = version +1 WHERE vessel_id = :id" + 
      " AND version = :version") 
    public abstract long update(@BindBean Vessel vessel); 

    @SqlUpdate("DELETE FROM vessel WHERE vessel_id = :id") 
    public abstract long delete(@Bind("id") long id); 

    @SqlQuery("SELECT vessel_id, vessel_name, version FROM vessel WHERE vessel_id = :id") 
    public abstract Vessel findNameById(@Bind("id") long id); 

    @SqlUpdate("INSERT INTO vessel (vessel_name, version) VALUES (:vesselName, :version)") 
    @GetGeneratedKeys 
    public abstract long insert(@BindBean Vessel vessel); 

    @SqlQuery("SELECT vessel_id, vessel_name, version FROM vessel ORDER BY vessel_id") 
    public abstract List<Vessel> findAll(); 
} 

也許這會爲某人提供解決方案。

+0

+ 1作爲'@ BindBean',這是最通用的綁定程序。爲了完整起見,您可以將您的Vessel類的片段放在一起,以顯示SQL佔位符如何綁定到字段。 – 2015-06-23 16:06:15

+0

這隻會是上面例子中一個普通的java對象。在我的本地代碼庫中,我使用了一個更詳盡的示例,它使用Lombok http://projectlombok.org/來保存編寫代碼。如果您想了解更多信息,請發佈新問題,並給我發一條信息或與我聯繫(請查看我的個人資料)。我不想在此帖子中添加與該問題無關的內容。 – ahus1 2015-06-23 16:32:20