1 Star 8 Fork 3

hubert-樂xx / xjpa

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 6.15 KB
一键复制 编辑 原始数据 按行查看 历史
xxb 提交于 2023-09-17 17:43 . release 1.3.2

介绍

封装hibernate 简易API

安装教程

<dependency>
    <groupId>cn.xnatural</groupId>
    <artifactId>jpa</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
<groupId>cn.xnatural</groupId>
<artifactId>jpa</artifactId>
<version>1.3.2-java8</version>
</dependency>

用法

创建一个Repo

// 1. 根据jdbcUrl 创建
Repo repo = new Repo("jdbc:mysql://localhost:3306/test?user=root&password=root").init();
// 2. 自定义添加属性
Repo repo = new Repo("jdbc:mysql://localhost:3306/test", "root", "root", 0, 5)
        .setAttr("hibernate.hbm2ddl.auto", "update")
        .entities(Db.class).init();
// 3. 根据属性集创建
Map<String, Object> attrs = new HashMap<>();
attrs.put("jdbcUrl", "jdbc:mysql://localhost:3306/test?user=root&password=root");
attrs.put("hibernate.hbm2ddl.auto", "update"); //update: 自动根据实体更新表结构, none: 不更新
Repo repo = new Repo(attrs).entities(Db.class).init();

实体查询

/**
 * 自定义 实体
 */
@Entity
@Table(name = "Db")
public class Db implements IEntity {
    @Id
    public String Db;
    public String Host;
}
import cn.xnatural.jpa.UUIDEntity;
/**
 * 无符号 '-' uuid实体 
 */
@Entity
public class Test1 extends UUIDEntity {
    public String name;
}
import cn.xnatural.jpa.LongIdEntity;

/**
 * 自增长 long id 实体
 */
@Entity
public class Test2 extends LongIdEntity {
    public String name;
}

查询一个实体

Db db = repo.byId(Db.class, "sys");
Db db = repo.row(Db.class, (root, query, cb) -> cb.equal(root.get("Db"), "sys"));
// 根据单个属性查询
Db db = repo.byAttr(Db.class, "Db", "sys");

查询多个实体

List<Db> dbs = repo.rows(Db.class, (root, query, cb) -> cb.equal(root.get("Db"), "sys"));
// 根据单个属性查询
List<Db> dbs = repo.rows(Db.class, "Db", "sys");

分页查询实体

Page<Db> dbs = repo.paging(Db.class, 1, 10, (root, query, cb) -> cb.equal(root.get("Db"), "sys"));

其它实体方法

// 保存或更新实体
repo.saveOrUpdate(实体对象)
// 删除一个实体
repo.delete(实体对象)
// 删除一个实体
repo.delete(实体Class, 实体id)
// 统计实体个数
repo.count(实体Class, 条件(可选))
// 统计实体个数
repo.count(实体Class, "属性名", "属性值")
// 实体是否存在
repo.exist(实体Class, 条件(可选))
// 实体是否存在
repo.exist(实体Class, "属性名", "属性值")
// 查询所有
repo.all(实体Class)

原生sql操作

只支持问号?占位符

查询一条数据

// 1. 单值
repo.row("select count(1) from db" Long.class)
// 2. 传参
Map<String, Object> result = repo.row("select * from db where Db=?", "sys");
// 3. 包装结果
Db result = repo.row("select * from db where Db=?", Db.class, "sys");

分页查询

// 1. 分页查询(List<Map>)
Page<Map> pageData = repo.paging("select * from db where Db=?", 1, 10, "sys");
// 2. 分页查询: 指定类型
Page<Db> pageData = repo.paging("select * from db where Db=?", 1, 10, Db.class, "sys");

查询多条数据

// 1. 默认返回List<Map>
List<Map<String, Object>> results = repo.rows("select * from db limit ?", 10);
// 2. 指定返回结果
List<Db> results = repo.rows("select * from db where Db=?", Db.class, "sys");
// 3. 命名参数(in条件查询)
List<Map<String, Object>> results = repo.rows("select * from db where Db = ? and Db in (?)", "sys", Arrays.asList("sys"));

更新,插入,删除

// 1. 更新
repo.execute("update test set age=? where id=?", 11, "4028b881766f3e5801766f3e87ba0000")
// 2. 插入
repo.execute("insert into test values(?,?,?,?,?)", UUID.randomUUID().toString().replace("-", ""), new Date(), new Date(), 22, "name")
// 3. 删除
repo.execute("delete from test where id=?", "ad3e4ff8f3fd4171aeeb9dd2c0aa6f0c")

HQL

repo.doSession(session -> {
    return session.createQuery("from Test").list();
})

自定义操作

// 1. 其它自定义查询
repo.trans(session -> {
    // TODO
    // session.createQuery(hql);// hql查询
    return null;
})
// 2. 事务成功/失败回调
repo.trans(session -> {
    // TODO
    // session.createQuery(hql);// hql查询
    return null;
}, () -> {
    // TODO 成功执行
}, (ex) -> {
    // TODO 失败执行
})
repo.doSession(session -> {
    // TODO 在session中处理    
})

特性接口

版本实体 EVersioning

  1. 为实体数据加上版本,记录每次变更
  2. 数据变更记录在实体OpHistory中
@Entity
public class VersionEntity extends NanoIDEntity implements EVersioning {
    private String name;
    private Integer version;

    public String getName() {
        return name;
    }

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

    @Override
    public Integer getVersion() {
        return version;
    }

    @Override
    public void setVersion(Integer version) {
        this.version = version;
    }

    /**
     * 需要记录变更的内容
     */
    @Override
    public String content() {
        return JSON.toJSONString(this);
    }
}

删除历史 EDeleting

  1. 实体数据被删除(Repo#delete方法)
  2. 被删除的实体会记录在实体OpHistory中
@Entity
public class DeleteEntity extends NanoIDEntity implements EDeleting {
    private String name;

    public String getName() {
        return name;
    }

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

    /**
     * 需要记录删除的内容
     */
    @Override
    public String content() {
        return JSON.toJSONString(this);
    }
}

更新人 EUpdater

为实体加个更新人属性(updater)

上边 版本数据OpHistory操作人属性(operator)值取自这里

更新人 ECreator

为实体加个创建人属性(creator)

其它实用方法

// 查询实体映射的表名
repo.tbName(实体Class);
// 得到当前的连接jdbcUrl
repo.getJdbcUrl();
// 得到当前连接的数据库名(mysql)
repo.getDbName();
// 得到当前数据库的版本信息
repo.getDBVersion();

参与贡献

xnatural@msn.cn

Java
1
https://gitee.com/xnat/xjpa.git
git@gitee.com:xnat/xjpa.git
xnat
xjpa
xjpa
master

搜索帮助