MyBatis注解開發-@Insert和@InsertProvider(@Select、@SelectProvider雷同)


 

        @Insert和@InsertProvider都是用來在實體類的Mapper類里注解保存方法的SQL語句。不同的是,@Insert是直接配置SQL語句,而@InsertProvider則是通過SQL工廠類及對應的方法生產SQL語句,這種方法的好處在於,我們可以根據不同的需求生產出不同的SQL,適用性更好。

1、項目主要結構:
(1)項目中的實體類
(2)每個實體類對應的Mapper方法
(3)SQL工廠


2、下面以BlogMapper中的保存Blog實體方法為例:
Blog實體類屬性:
為了方便說明,屬性不設置過多,假設Blog類的屬性有blogId,title,author

(1)@Insert的注解方式
@Insert("insert into blog(blogId,title,author) values(#blogId,#title,#author)")
public boolean saveBlog(Blog blog);

說明:由於我們不能確定哪些屬性沒有值,那只能把所有屬性都寫上了。

(2)@InsertProvider的注解方式
@InsertProvider(type = SqlFactory.class,method = "insertBlog")
public boolean saveBlog(@Param("bean")Blog blog);

說明:type指明SQL工廠類,method是工廠類里對應的方法

SqlFactory類代碼:

public class SqlFactory {

    public String insertBlog(Map<String,Object> para){

        Blog blog = (Blog)para.get("bean"); //

        SQL sql = new SQL(); //SQL語句對象,所在包:org.apache.ibatis.jdbc.SQL

        sql.INSERT_INTO("blog");

        if(blog.getBlogId() != null){ //判斷blogId屬性是否有值
            sql.VALUES("blogId", blog.getBlogId());
        }

        if(blog.getTitle() != null){//判斷title屬性是否有值
            sql.VALUES("title", blog.getTitle());
        }

        if(blog.getAuthor() != null){//判斷author屬性是否有值
            sql.VALUES("author", blog.getAuthor());
        }

        return sql.toString();
}

}

使用@InsertProvider的方式,可以根據實體中有值的屬性,進行動態的生成插入SQL語句如:
blogId和title有值:insert into blog(blogId,title) values(v1,v2);
author和title有值:insert into blog(author,title) values(v1,v2);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM