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
- Afinaldb 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 使用eclipse用c API直接链接mysql
- Apache Mina学习笔记:JavaNIO框架Mina、Netty、Grizzly介绍与对比
- HDOJ题目1267 下沙的沙子有几粒?(递推)
- Centos6.5使用yum安装mysql@http://blog.csdn.net/xxd851116/article/details/22947891
- 五分钟理解javascript 闭包
- Afinaldb 笔记
- ubuntu 无法拨号
- 沙箱安全模型、类加载、class文件校验
- 【MongoDB】mongodump and mongorestore of mogodb
- 算法 关于煤老板运煤
- C++11中的匿名函数(lambda函数,lambda表达式)
- Storyboard多View的切换 [xcode 4.4.1]
- 2014ACM-ICPC牡丹江+鞍山总结
- 现有产品调研分析