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つ追加し、この値は表分けルールで算出する)