今天试了一下Afinal的数据库操作,网上搜索到的例子都很简单,也没有一对多和多对一的例子。
@Table(name = "model1")
public class Model1 {
private int id;
private String str1;
@ManyToOne
private Model2 model2;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStr1() {
return str1;
}
public void setStr1(String str1) {
this.str1 = str1;
}
public Model2 getModel2() {
return model2;
}
public void setModel2(Model2 model2) {
this.model2 = model2;
}
@Override
public String toString() {
return "Model1 [id=" + id + ", str1=" + str1 + ", model2=" + model2
+ "]";
}
}
Model2.java
@Table(name="model2")
public class Model2 {
private int id;
private String str2;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStr2() {
return str2;
}
public void setStr2(String str2) {
this.str2 = str2;
}
@Override
public String toString() {
return "Model2 [id=" + id + ", str2=" + str2 + "]";
}
}
写了两个Model,Model1中引用Model2.
FinalDb db = FinalDb.create(this, true);
Gson gson = new Gson();
String str2="{\"id\":1,\"str1\":\"string1\",\"model2\":{\"id\":2,\"str2\":\"string2\"}}";
Model1 model1=gson.fromJson(str2, Model1.class);
db.save(model1);
如果Model1不在Model2属性上加上,@ManyToOne,在save()方法是,数据库不会有model2的字段,加上@ManyToOne后会出现model2的ID引用的字段,但是model2不会自动save()。需要另外的save()。
源码中,save方法如下
public void save(Object entity){
checkTableExist(entity.getClass());
exeSqlInfo(SqlBuilder.buildInsertSql(entity));
}
主要在SqlBuilder.buildInserSql(entity),根据实体生成插入的SQL语句。
public static SqlInfo buildInsertSql(Object entity){
List<KeyValue> keyValueList = getSaveKeyValueListByEntity(entity);
StringBuffer strSQL=new StringBuffer();
SqlInfo sqlInfo = null;
if(keyValueList!=null && keyValueList.size()>0){
sqlInfo = new SqlInfo();
strSQL.append("INSERT INTO ");
strSQL.append(TableInfo.get(entity.getClass()).getTableName());
strSQL.append(" (");
for(KeyValue kv : keyValueList){
strSQL.append(kv.getKey()).append(",");
sqlInfo.addValue(kv.getValue());
}
strSQL.deleteCharAt(strSQL.length() - 1);
strSQL.append(") VALUES ( ");
int length = keyValueList.size();
for(int i =0 ; i < length;i++){
strSQL.append("?,");
}
strSQL.deleteCharAt(strSQL.length() - 1);
strSQL.append(")");
sqlInfo.setSql(strSQL.toString());
}
return sqlInfo;
}
再看getSaveKeyValueListByEntity(entity);
public static List<KeyValue> getSaveKeyValueListByEntity(Object entity){
List<KeyValue> keyValueList = new ArrayList<KeyValue>();
TableInfo table=TableInfo.get(entity.getClass());
Object idvalue = table.getId().getValue(entity);
if(!(idvalue instanceof Integer)){ //用了非自增长,添加id , 采用自增长就不需要添加id了
if(idvalue instanceof String && idvalue != null){
KeyValue kv = new KeyValue(table.getId().getColumn(),idvalue);
keyValueList.add(kv);
}
}
//添加属性
Collection<Property> propertys = table.propertyMap.values();
for(Property property : propertys){
KeyValue kv = property2KeyValue(property,entity) ;
if(kv!=null)
keyValueList.add(kv);
}
//添加外键(多对一)
Collection<ManyToOne> manyToOnes = table.manyToOneMap.values();
for(ManyToOne many:manyToOnes){
KeyValue kv = manyToOne2KeyValue(many,entity);
if(kv!=null) keyValueList.add(kv);
}
return keyValueList;
}
然后Property.也只支持String,int,float,doublie,long,Date,boolean。
从Property.java中的setvalue看出,
public void setValue(Object receiver , Object value){
if(set!=null && value!=null){
try {
if (dataType == String.class) {
set.invoke(receiver, value.toString());
} else if (dataType == int.class || dataType == Integer.class) {
set.invoke(receiver, value == null ? (Integer) null : Integer.parseInt(value.toString()));
} else if (dataType == float.class || dataType == Float.class) {
set.invoke(receiver, value == null ? (Float) null: Float.parseFloat(value.toString()));
} else if (dataType == double.class || dataType == Double.class) {
set.invoke(receiver, value == null ? (Double) null: Double.parseDouble(value.toString()));
} else if (dataType == long.class || dataType == Long.class) {
set.invoke(receiver, value == null ? (Long) null: Long.parseLong(value.toString()));
} else if (dataType == java.util.Date.class || dataType == java.sql.Date.class) {
set.invoke(receiver, value == null ? (Date) null: stringToDateTime(value.toString()));
} else if (dataType == boolean.class || dataType == Boolean.class) {
set.invoke(receiver, value == null ? (Boolean) null: "1".equals(value.toString()));
} else {
set.invoke(receiver, value);
}
} catch (Exception e) {
e.printStackTrace();
}
}else{
try {
field.setAccessible(true);
field.set(receiver, value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后其他的引用类,通过@ManyToOne来添加外键。但是不会自动保存。
刚开始写东西,写得好乱,问题估计很多。。。。先记到这里了。。