JAva+mybatisテーブルルーティング

6576 ワード


サブテーブルは、大きなテーブルを一定のルールに従って独立したストレージスペースを持つ複数のエンティティテーブルに分解するもので、サブテーブルと呼ぶことができます.各テーブルは3つのファイル、MYDデータファイル、.MYIインデックスファイル、.frmテーブル構造ファイルに対応しています.これらのサブテーブルは、同じディスクに分散したり、異なるマシンに分散したりすることができます.アプリの読み書きは,あらかじめ定義したルールに従って対応するサブテーブル名を得て操作する.
1.ルーティングインタフェースの定義
public interface RouteTableAble {
	/**
	 *     ,  10
	 * @return
	 */
	public int tableSize();
	/**
	 *      % tableSize 
	 * @return
	 */
	public int routeValue();
	/** 
	 *   table   
	 * @return
	 */
	public String tableExt();
	/**
	 *   table    
	 * @return
	 */
	public String concat();
}

2、実装インタフェース(デフォルト10枚のサブテーブル、‘_’をコネクタとし、routeValueとサブテーブルの総数を表番号としてモデル化する)
public abstract class AbstractRouteTable implements RouteTableAble {

	@Override
	public int tableSize() {
		// TODO Auto-generated method stub
		return 10;
	}
	@Transient
	@Override
	public String concat() {
		// TODO Auto-generated method stub
		return "_";
	}
	
	@Transient
	@Override
	public String tableExt() {
		// TODO Auto-generated method stub
		return concat().concat(String.valueOf(routeValue() % tableSize()));
	}

}

3、親を継承し、サブテーブルの総数を書き換える方法
VINフィールドの後ろの8ビットのhashcodeをrouteValueとして採用
public class CarHealthBasic extends AbstractRouteTable implements Serializable {
	
	private static final long serialVersionUID = 2291302184719452210L;

	/**
     * id
     */
	@Id
    private Long id;
	/**
	 *      id
	 */
	private Long companyid;
    /**
     *     
     */
    private String vehicleplatenumber;

    /**
     *       
     */
    private String companyname;

    /**
     *       
     */
    private String companycode;

    /**
     *       
     */
    private String vin;

    /**
     *     
     */
    private Date repairdate;

    /**
     *     
     */
    private String repairmileage;

    /**
     * id
     * @return id id
     */
    public Long getId() {
        return id;
    }

    /**
     * id
     * @param id id
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     *     
     * @return vehicleplatenumber 
     */
    public String getVehicleplatenumber() {
        return vehicleplatenumber;
    }

    /**
     *     
     * @param vehicleplatenumber 
     */
    public void setVehicleplatenumber(String vehicleplatenumber) {
        this.vehicleplatenumber = vehicleplatenumber == null ? null : vehicleplatenumber.trim();
    }

    /**
     *       
     * @return companyname 
     */
    public String getCompanyname() {
        return companyname;
    }

    /**
     *       
     * @param companyname 
     */
    public void setCompanyname(String companyname) {
        this.companyname = companyname == null ? null : companyname.trim();
    }

    /**
     *       
     * @return companycode 
     */
    public String getCompanycode() {
        return companycode;
    }

    /**
     *       
     * @param companycode 
     */
    public void setCompanycode(String companycode) {
        this.companycode = companycode == null ? null : companycode.trim();
    }

    /**
     *       
     * @return vin 
     */
    public String getVin() {
        return vin;
    }

    /**
     *       
     * @param vin 
     */
    public void setVin(String vin) {
        this.vin = vin == null ? null : vin.trim();
    }

    /**
     *     
     * @return repairdate 
     */
    public Date getRepairdate() {
        return repairdate;
    }

    /**
     *     
     * @param repairdate 
     */
    public void setRepairdate(Date repairdate) {
        this.repairdate = repairdate;
    }

    /**
     *     
     * @return repairmileage 
     */
    public String getRepairmileage() {
        return repairmileage;
    }

    /**
     *     
     * @param repairmileage 
     */
    public void setRepairmileage(String repairmileage) {
      	 this.repairmileage = repairmileage == null ? null : repairmileage.trim();
   }
    public Long getCompanyid() {
	return companyid;
   }

    public void setCompanyid(Long companyid) {
	this.companyid = companyid;
   }
    @Override
    public int routeValue() {
	// TODO Auto-generated method stub
	return vin.substring(vin.length()-8, vin.length()).hashCode();
   }
    
    @Override
    public int tableSize() {
	// TODO Auto-generated method stub
	return 20;
    }    
	
}

4、mybatis(添削・改ざんはつなぎ合わせる必要がある)
public String insertSQL(Object t) {
		StringBuilder buffer = new StringBuilder();
		buffer.append("INSERT INTO ").append(getTableFromClass(t.getClass())).append(getRouteTableFromObject(t)).append(" ");
		try {
			List	list = getKeyValueEntry(t);
			buffer.append("(");
			for (com.ctjy.support.mybaits.provider.Entry entry : list) {
				buffer.append(entry.getColumn()).append(",");
			}
			String str = buffer.substring(0, buffer.length() - 1);
			buffer.setLength(0);
			buffer.append(str).append(") ");
			buffer.append("VALUES (");
			
			for (com.ctjy.support.mybaits.provider.Entry entry : list) {
				buffer.append("?").append(",");
			}
			
			str = buffer.substring(0, buffer.length() - 1);
			buffer.setLength(0);
			buffer.append(str).append(") ");
		} catch (IntrospectionException e) {
			e.printStackTrace();
		}
	
		return buffer.toString();
	}

5、getRouteTableFromObjectメソッドコードは、pojoがRouteTableのサブクラスであるか否かを判断し、もしそうであればテーブル名接尾辞を返す
public String getRouteTableFromObject(Object obj) {
		if (obj == null) {
			return "";
		}
		
		String ext = null;
		if (RouteTableAble.class.isAssignableFrom(obj.getClass())) {
			RouteTableAble route = (RouteTableAble) obj;
			ext = route.tableExt();
		}
		
		return ext == null ? "" : ext;
	}

6.mapperファイルの処理については、tablesizeでsql文のテーブル名をつづる(クエリーパラメータにtablesizeを1つ追加し、この値は表分けルールで算出する)