Skip to content
/ hplex Public

这是一个针对SQL数据库的CRUD操作辅助工具,可以快速实现CRUD操作,不需要写SQL语句

License

Notifications You must be signed in to change notification settings

nianxy/hplex

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

使用说明

##初始化 首先需要实现SimpleDataSoruce接口,提供获取DB连接的方法

public class HPlexDataSource implements SimpleDataSoruce {
    // You can add an init method to write some initial code
    @Override
    public Connection getConnection() {
        // TODO: return a db connection
    }
}

接下来创建HPlexConfigure,并使用HPlexConfigure对象来初始化HPlex:

HPlexConfigure configure = new HPlexConfigure();
try {
    // 注册数据表对象,后面说明
    // registTable()可以进行链式调用
    configure.registTable(TestTable.class);
    // 设置数据源
    configure.setDataSource(new HPlexDataSource());
    // 使用HPlexConfigure对象初始化HPlex
    HPlex.init(configure);
} catch (InvalidAutoincFieldTypeException e) {
    e.printStackTrace();
} catch (UnsupportedFieldTypeException e) {
    e.printStackTrace();
}

##数据表对象 数据库中的每张表对象一个数据表对象

@Table("test")
public class TestTable {
    @Column(autoinc = true)
    private int id;

    @Column
    private String name;

    @Column("bvalue")
    private Boolean boolValue;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Boolean getBoolValue() {
        return boolValue;
    }

    public void setBoolValue(Boolean boolValue) {
        this.boolValue = boolValue;
    }
}

注意,数据表对象一定要通过HPlexConfigure对象注册后才可以使用!

@Table注解用于标识这是一个数据表对象类,注解的值对应数据库中的表名 @Column注解用于标识这是一个数据表中的字段,默认将字段名做为数据库表中的字段名称,如果不同的话可以通过注解的值进行指定。autoinc属性用来标识这是一个自增字段 。 Boolean类型的字段映射到数据库中的数值型字段,比如int/byte等,值为0是为false,1为true Date类型的字段映射到数据库中的Datetime类型的字段

另外,支持JSON格式的字段,数据库中表现为字段串类型,HPlex在读取数据库时将字符串自动解析为对象,或在更新数据库时自动将对象转换为JSON字符串。要实现这个功能,需要做两件事:

  • 实现IJSONConvert接口,定义好JSON转换相关方法
  • 调用HPlexConfigure对象的setJSONConvert方法
  • 数据表对象中相应字段的类型,需要实现IJSONColumn接口

以Jackson为例,代码如下:

public class JSONConvert implements IJSONConvert {
    @Override
    public <T extends IJSONColumn> T toObject(String s, Class<T> clz) throws JSONConvertException {
        try {
            return new ObjectMapper().readValue(s, clz);
        } catch (IOException e) {
            throw new JSONConvertException(e);
        }
    }

    @Override
    public <T extends IJSONColumn> String toJSONString(Object o, Class<T> clz) throws JSONConvertException {
        try {
            return new ObjectMapper().writeValueAsString(o);
        } catch (JsonProcessingException e) {
            throw new JSONConvertException(e);
        }
    }
}

// 调用HPlexConfigure对象的setJSONConvert方法
configure.setJSONConvert(new JSONConvert());
// ...

// 数据表字段类型
public class JsonField implements IJSONColumn {
    private String msg;
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getMsg() {
        return msg;
    }
}

// 数据表定义
@Table("test")
public class TestTable {
    @Column(autoinc = true)
    private int id;
    
    @Column
    private JsonField json_field;
    // ...
}

##查询

// 获取查询对象
Query query = new HPlexTable(CertificateTable.class).query();
// 增加查询条件
query.addCond(Cond.compare(CondCompare.Compare.EQ, "id", 10));
query.addCond(Cond.compare(CondCompare.Compare.GT, "size", 462));
// 设置排序
query.addOrder(Order.ASC("timestamp"));
// 设置Limit
query.addLimit(Limit.limit().setOffset(100).setMaxSize(20));
// 查询
query.execute();

以上也可通过链式调用来完成:

new HPlexTable(CertificateTable.class).query();
    .addCond(Cond.compare(CondCompare.Compare.EQ, "id", 10));
    .addCond(Cond.compare(CondCompare.Compare.GT, "size", 462));
    .addOrder(Order.ASC("timestamp"));
    .addLimit(Limit.limit().setOffset(100).setMaxSize(20));
    .execute();

更多Query对象相关方法可以参考源码。

##其它操作 可以通过HPlexTable对象的insert()/update()/delete()来获取得相应操作的对象,使用方法与Query对象类似

##事务 HPlex在每次操作DB时都通过SimpleDataSoruce对象获取一个链接,如果想使用DB事务,需要为HPlex一系列操作指定一个DB连接,并在外层控制事务。这些操作可以通过HPlexTraansaction对象来完成。

HPlexTransaction transaction = new HPlexTransaction();
try {
    // 开启事务
    transaction.start();
    // 不要自己创建HPlexTable对象
    transaction.hPlexTable(BusinessTable.class);
    // do what you want to do ...
    // ...
    // 提交事务
    transaction.commit();
} final {
    if (transaction.isInTransaction()) {
        try {
            transaction.rollback();
        } catch (TransactionNotStartedException|SQLException ex) {
            ex.printStackTrace();
        }
    }
}

##BaseDao类 此类实现了基础的数据表操作方法,业务Dao类建议直接继承此类

public class CertificateDao extends BaseDao<CertificateTable> {
    public CertificateDao() {
    }

    public CertificateDao(HPlexTransaction transaction) {
        super(transaction);
    }

    @Override
    protected String getKeyAttrName() {
        return "sid";
    }
}

这是一个抽象基类,必须实现getKeyAttrName()方法,该方法返回一个字段名,该字段应该是表中的UNIQ字段,比如是业务中使用的记录ID。

另外,建议重载两个构造函数,以便传入事务对象

About

这是一个针对SQL数据库的CRUD操作辅助工具,可以快速实现CRUD操作,不需要写SQL语句

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages