MyBatis3 通用CRUD的研究[一] – JAVA編程語言程序開發技術文章

嘗試瞭下MyBatis3,感覺不錯,比自己寫的那個ORM框架完善~~(好吧..我臭屁瞭)
問題:
MyBatis3提供瞭一種半自動化的ORM解決方案,比Hibernate這種全自動解決方案多瞭不少的靈活性和可操控性,試用瞭下感覺還不錯,就是有個問題在於,MyBatis的所有處理都需要提供一個xml配置或者註解形式的語句,雖然動態SQL很強大,但是一般項目使用時,最多的CRUD操作,大多模式都是固定的
select:select * from [tablename]
insert:insert into [tablename]([field list]) values([values list])
update:update [tablename] set [field]=[value]… where [id]=[key]
delete:delete from [tablename] where [id]=[key]
這幾種CRUD操作占瞭大部分,但是以MyBatis來說,每個表都要重新寫一遍這幾條相同的SQL又是一件非常煩人的事情,而且,那臃腫的xml配置文件看著就很煩啊
 
目的:
提供一個Mapper基接口,可以自動進行4種基本的CRUD操作,而不需要相應的xml文件
 
目前研究成果:
insert/update/delete操作可以非常完美的完成,select操作目前還需要多一條語句
 
首先,MyBatis使用名叫Mapper的接口來抽象化SQL操作,2種基本的方式:xml配置和註解配置
xml配置方式肯定沒法達到自動繼承的目的,放棄
來看看註解方式,MyBatis提供瞭2個註解標記 @Select 和 @SelectProvider,select標記隻能處理字符串常量,放棄..
@SelectProvider可以使用一個SQL提供程序來生成相應的SQL語句,恩,這個很好很強大,我們可以設計一個基接口來生成我們需要的SQL
 
首先拿比較簡單的Delete語句來看,我們的基接口可以這樣寫
[java]
/**
 * MyBatis CRUD基接口
 * @author ALLEN.HU
 *
 * @param <T> 處理的POJO對象
 */ 
public interface BaseMapper<T extends MyBatisPojo> { 
    @DeleteProvider(type = CUDTemplate.class,method = "delete") 
    public void delete(T obj); 

 
想要從一個POJO上自動生成SQL語句需要2個必須的部分,一個是表名,一個是主鍵名
先做一個POJO的基類,方便以後調用,也方便泛型的處理 MyBatisPojo
[java]
/**
 * MyBatis用POJO基類
 * 借用瞭JPA的註解標簽 @Table和@Id 需要引入javax.persistence包(persistence.jar)
 * @author Allen.Hu
 *
 */ 
public class MyBatisPojo implements Serializable{ 
 
    private static final long serialVersionUID = 1L; 
 
    /**
     * 獲取POJO對應的表名
     * 需要POJO中的屬性定義@Table(name)
     * @return
     */ 
    public String tablename() { 
        Table table = this.getClass().getAnnotation(Table.class); 
        if(table != null) 
            return table.name(); 
        else 
            throw new RuntimeException("undefine POJO @Table, need Tablename(@Table)"); 
    } 
 
    /**
     * 獲取POJO對應的主鍵名稱
     * 需要POJO中的屬性定義@Id
     * @return
     */ 
    public String id() { 
        for(Field field : this.getClass().getFields()) { 
            if(field.isAnnotationPresent(Id.class)) 
                return field.getName(); 
        } 
         
        throw new RuntimeException("undefine POJO @Id"); 
 
    } 

然後是動態sql的生成類 CUDTemplate
[java]
import static org.apache.ibatis.jdbc.SqlBuilder.*; 
 
public class CUDTemplate<T extends MyBatisPojo> { 
    public String delete(T obj) { 
        String idname = obj.id(); 
         
        BEGIN(); 
         
        DELETE_FROM(obj.tablename()); 
        WHERE(idname + "=#{" + idname + "}"); 
         
        return SQL(); 
    } 

有瞭這三個簡單的類/接口,在實際使用中,就不再需要煩人的xml配置瞭,繼承MyBatisPojo的實體配合繼承BaseMapper的映射器,就能直接使用對應的delete方法瞭www.aiwalls.com
假設表 test
[sql]
create table "RSMNG"."dbo"."test"( 
        "id" int identity not null, 
       "text" varchar(100) not null, 
        constraint "PK_test" primary key ("id") 
    ) 
就2個字段,一個id作為主鍵,一個text
對應的Pojo類
[java]
@Table(name = "test") 
public class Test extends MyBatisPojo { 
 @Id 
 private Integer id; 
  
 @Column 
 private String text; 
 
 public void setId(Integer id) { 
  this.id = id; 
 } 
  
 public Integer getId() { 
  return id; 
 } 
 
 public void setText(String text) { 
  this.text = text; 
 } 
 
 public String getText() { 
  return text; 
 } 

對應的Mapper TestMapper
[java]
/**
* 從BaseMapper繼承的話,不需要再去實現基本方法
*/ 
public interface TestMapper extends BaseMapper<Test> { 
  

實際使用時,隻需要調用testMapper.delete(Test)函數就能執行相應的刪除動作瞭
 
完整代碼下次一起放上

摘自 SoL 學習無止境

發佈留言