Afinaldb 笔记

今天试了一下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来添加外键。但是不会自动保存。



刚开始写东西,写得好乱,问题估计很多。。。。先记到这里了。。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值