public interface MySqlDao {
default int findRows() {
return SelectBuilder.newInstance(Config.get(this))
.sql("SELECT FOUND_ROWS()")
.getScalarSingleResult(int.class);
}
default int lastInsertId() {
return SelectBuilder.newInstance(Config.get(this))
.sql("SELECT LAST_INSERT_ID()")
.getScalarSingleResult(int.class);
}
}
public interface SingleIdDao<T, ID> extends BaseDao {
@SuppressWarnings("unchecked")
default Optional<T> selectById(ID id) {
Class<T> clazz = entityClass();
Config config = Config.get(this);
SelectBuilder builder = SelectBuilder.newInstance(config);
EntityType<T> entityType = EntityTypeFactory.getEntityType(clazz, config.getClassHelper());
builder.sql("SELECT * FROM " + entityType.getTableName() +
" WHERE " + entityType.getIdPropertyTypes().get(0).getColumnName() + " = " + id);
return builder.getOptionalEntitySingleResult(clazz);
}
}
public interface BaseDao<T> extends MySqlDao {
default int count() {
Class<T> clazz = entityClass();
Config config = Config.get(this);
SelectBuilder builder = SelectBuilder.newInstance(config);
EntityType<T> entityType = EntityTypeFactory.getEntityType(clazz, config.getClassHelper());
builder.sql("SELECT count(*) FROM " + entityType.getTableName());
return builder.getScalarSingleResult(int.class);
}
// default List<T> selectAll() {
// Class<T> clazz = entityClass();
// Config config = Config.get(this);
// SelectBuilder builder = SelectBuilder.newInstance(config);
// EntityType<T> entityType = EntityTypeFactory.getEntityType(clazz, config.getClassHelper());
// builder.sql("SELECT * FROM " + entityType.getTableName());
// return builder.getEntityResultList(clazz);
// }
@SuppressWarnings("unchecked")
default Class<T> entityClass() {
try {
Class<?> clazz = this.getClass();
Type type = clazz.getInterfaces()[0].getAnnotatedInterfaces()[0].getType();
ParameterizedType pt = (ParameterizedType)type;
Type[] actualTypeArguments = pt.getActualTypeArguments();
return (Class<T>)actualTypeArguments[0];
} catch (Exception e) {
throw new UnsupportedOperationException("Failed to search entity class", e);
}
}
}