greenDao3.x 深入使用

来源:互联网 发布:三国杀实体卡牌淘宝 编辑:程序博客网 时间:2024/05/19 06:38

参数类型

1.默认参数

byte, Byte
short, Short
int, Integer
long, Long
float, Float
double, Double

boolean, Boolean
byte[]
String
Date

2.自定义参数

使用数据库支持的原生数据类型通过PropertyConverter类转换成你想要的属性。
1.给自定义类型参数添加 @Convert注释并添加对应参数:
converter:参数转换类,columnType:在数据库中对应的原始支持类型
2. 实现PropertyConverter类

下面例子为list转成String。

@Entity public class User { @Id  private Long id;  @Convert(converter = GreenConverter.class, columnType = String.class) } //-----------------转换类public class GreenConverter implements PropertyConverter<List,String> {    @Override    public List convertToEntityProperty(String databaseValue) {        if (databaseValue == null) {            return null;        }        else {            List lista = Arrays.asList(databaseValue.split(","));            return lista;        }    }    @Override    public String convertToDatabaseValue(List entityProperty) {        if(entityProperty==null){            return null;        }        else{            StringBuilder sb= new StringBuilder();            for(Object link:entityProperty){                sb.append(link);                sb.append(",");            }            return sb.toString();        }    }}

清除缓存

greenDao查询原则:同一个Session如果已经记录了entity,下次查询会直接从内存中读取,若内存中没有再从数据库查找。注意当entity发生改变时,仍然从缓存中读取。此时,为保证数据的正确性需要在entity更改后执行清除缓存操作.清除方法:

1.清除所所有的缓存
daoSession.clear();
2.清除指定类缓存
projectDao = daoSession.getNoteDao();
projectDao.detachAll();

多表关联存储

关联:在主表中定义一个外键去关联副表,然后需要用外键去副表中查询所需要的数据。

1.一对一 @ToOne

joinProperty参数来定义一个外键

@Entity public class Order {      @Id //主键 必须为long  private Long id;     private long customerId;    @ToOne(joinProperty = "customerId")  //表示order类的customerId字段与Customer类的id相等  private Customer customer;}@Entity public class Customer { @Id  private Long id;  }

2.一对多 @ToMany

2.1 referencedJoinProperty ,目标实体拥有源实体的主键,然后在源实体里将目标实体中的外键((customerId))作为referencedJoinProperty的属性。也就是下面例子中的customerId表示的是Customer 中的主键id.

//源实体@Entity public class Customer { @Id  private Long id;  @ToMany(referencedJoinProperty = "customerId")   private List<Order> orders;  }//目标实体@Entity  public class Order {      @Id private Long id;      private long customerId;  }

2.2 如果两个实体之间的关联外键不是通过id,而是通过自定义的属性就需要使用@JoinProperty。

@Entity public class Customer { @Id  private Long id;  @Unique  private String tag;  @ToMany(joinProperties = { @JoinProperty(name = "tag", referencedName = "customerTag") })  private List<Site> orders;  } @Entity public class Order { @Id private Long id; private Date date;  private String customerTag;  }

多对多 @JoinEntity

不是两个表或者两个对象直接关联,而是要通过一个“第三者”关联

这里写图片描述

@JoinEntity中的entity 表示中间表(第三者),sourceProperty 表示实体属性,targetProperty 表示外联实体。在两个实体中都需要写@JoinEntity。

@Entity public class Person{ @Id(autoincrement = true) private Long id; private String name; // 一对多,@JoinEntity注解:entity 中间表;sourceProperty 自身实体属性;targetProperty 外链实体属性 @ToMany @JoinEntity( entity = JoinStudentToPerson.class, sourceProperty = "pid", targetProperty = "sid" )//一个person对应多个student private List<Student> students;---------------------------------------------------//中间表 “第三者” @Entity public class JoinStudentToPerson {private Long id; //和person关联的id private Long pid; //和student关联的id private Long sid;  }@Entity public class Student { @Id private Long id; private String name; // 多对多,@JoinEntity注解:entity 中间表;sourceProperty 自身实体属性;targetProperty 外链实体属性 @ToMany @JoinEntity( entity = JoinStudentToPerson.class, sourceProperty = "sid", targetProperty = "pid" ) //一个person对应多个studentprivate List<Person> persons; }

关联表查询与更新

同样因为缓存问题,需要手动添加和移除。如:获取当前顾客的订单列表
List ordersList= customer.getOrders();
添加或者删除的订单为 :Order order = new Order();
1.添加
// 添加到数据库
daoSession.insert(order);
手动添加到订单列表ordersList.add(order )
2.删除
// 从数据库中移除
daoSession.delete(someOrder);
手动从缓存列表移除ordersList.remove(order )

多表查询

join()
1.关联单个表
ueryBuilder.join()方法即可完成,第一个参数是关联的类,第二个是关联类中的关联属性。

//查询地址住在国贸的帅哥 QueryBuilder<ShuaiGe> queryBuilder = userDao.queryBuilder(); queryBuilder.join(Address.class, AddressDao.Properties.userId) .where(AddressDao.Properties.Street.eq("国贸")); List<User> users = queryBuilder.list();

2.关联多个表
通过queryBuilder.join()链式调用来实现多表查询.

//查询在欧洲人口超过100000的城市 QueryBuilder qb = cityDao.queryBuilder().where(Properties.Population.ge(1000000)); Join country = qb.join(Properties.CountryId, Country.class); Join continent = qb.join(country, CountryDao.Properties.ContinentId, Continent.class, ContinentDao.Properties.Id); continent.where(ContinentDao.Properties.Name.eq("Europe")); List<City> bigEuropeanCities = qb.list();
原创粉丝点击