English | 中文
A simple orm, deserialize data from JDBC ResultSet
as java bean.
For Android SQLite also see SQLiteDataSet
implementation 'io.github.yeamy:sqldataset:2.0'
public class Fruit {
@DsColumn("Name")
public String name; // the column in database is "Name"
public String fullName; // the column in database can be "fullName" or "full_name"
@DsIgnore
public String count; // ignore this field
public FruitType type; // the name of the column is the same as the field
// regist as custom type (see DsAdapter)
public Skin skin; // this field no DsColumn treat as extra type
}
Generally, using DsReader
is an easy and fast way.
Statement stmt = ...; // the source
String sql = "SELECT ..."; // the sql
Fruit apple = DsReader.read(stmt, sql, Fruit.class); // read one
ArrayList<Fruit> list = DsReader.eadArray(stmt, sql, Fruit.class);
In order to deserialize custom field type, you may define a DsFieldFactory
.
DsReader.register(MyField.class, new DsFieldReader<MyField>() {
@Override
public MyField read(ResultSet rs, int columnIndex) throws SQLException, ReflectiveOperationException {
return new MyType(rs.getString(columnIndex));
}
);
DsReader.read(stmt, String sql, MyType.class);
// or
DsReader.with(MyField.class, new DsFieldReader<MyField>() {
@Override
public MyField read(ResultSet rs, int columnIndex) throws SQLException, ReflectiveOperationException {
return new MyType(rs.getString(columnIndex));
}
).read(stmt, String sql, MyType.class);
If you want to do anything after the Bean read, you can implement DsObserver.class
, and do it in onDsFinish()
.
public class Vegetables implements DsObserver {
@DsColumn("Name")
public String name;
...
@Override
public void onDsFinish(){}
}
Data come from same row of ResultSet can deserialize into an extra field.
source table:
UserName | Province | CityName | ... |
---|---|---|---|
Nike | Guangdong | Shantou | ... |
... |
Usually, deserialize like this:
public class User {
@DsColumn("UserName")
public String name;
@DsColumn("Province")
public String province;
@DsColumn("CityName")
public String city;
...
}
to package province
and city
into same field location
, see below:
public class User {
@DsColumn("UserName")
public String name;
...
// NOTICE:must not declare annotation with DsColumn nor DsIgnore.
public City location;
}
public class City {
@DsColumn("Province")
public String province;
@DsColumn("CityName")
public String city;
...
}