Afinaldb 笔记

来源:互联网 发布:设计装修效果图软件 编辑:程序博客网 时间:2024/05/10 20:03

今天试了一下Afinal的数据库操作,网上搜索到的例子都很简单,也没有一对多和多对一的例子。


@Table(name = "model1")public class Model1 {private int id;private String str1;@ManyToOneprivate 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;}@Overridepublic 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;}@Overridepublic 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
原创粉丝点击