?? Pocket's core Object/Relational Mapping functionality
If you have an improvement, I will be happy to get a pull request from you! Github
To get a Git project into your build:
Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Step 2. Add the dependency
dependencies {
implementation 'com.github.leyan95:pocket:Tag'
}
_
多數(shù)據(jù)源配置
這里以MySQL數(shù)據(jù)庫為例
配置信息
pocket:
serverId: 200
datasource:
node:
- url: jdbc:mysql://127.0.0.1:3306/pocket1
nodeName: mysql-01
driverName: com.mysql.cj.jdbc.Driver
showSql: false
user: root
password: root
poolMiniSize: 10
poolMaxSize: 15
timeout: 1000
session: homo,user
- url: jdbc:mysql://127.0.0.1:3306/pocket2
nodeName: mysql-02
driverName: com.mysql.cj.jdbc.Driver
showSql: true
user: root
password: root
poolMiniSize: 10
poolMaxSize: 15
timeout: 1000
##根據(jù)session找到數(shù)據(jù)庫并從數(shù)據(jù)庫對(duì)應(yīng)的連接池中獲取數(shù)據(jù)庫鏈接书闸,故所有session不可重復(fù)
session: session1,session2
實(shí)體類規(guī)范
主類
@Entity(table = "TBL_ORDER", tableId = 200)
public class Order extends BaseEntity {
private static final long serialVersionUID = 2560385391551524826L;
@Column(name = "CODE")
private String code;
@Column(name = "PRICE")
private BigDecimal price;
@Column(name = "DAY")
private Date day;
@Column(name = "TIME")
private Date time;
@Column(name = "STATE")
private Boolean state;
@Join(columnName = "TYPE", businessName = "訂單支付方式",
joinTable = "TBL_ORDER_TYPE", joinMethod = JoinMethod.LEFT,
bridgeColumn = "UUID", destinationColumn = "NAME")
private String type;
@OneToMany(clazz = Commodity.class, bridgeField = "order")
private List<Commodity> commodities;
// 這里省略 getter setter
}
明細(xì)類
@Entity(table = "TBL_COMMODITY", tableId = 201, businessName = "訂單明細(xì)")
public class Commodity extends BaseEntity {
private static final long serialVersionUID = -6711578420837877371L;
@Column(name = "NAME")
private String name;
@Column(name = "PRICE")
private BigDecimal price;
@ManyToOne(columnName = "ORDER_UUID", clazz = Order.class, upBridgeField = "uuid")
private Long order;
// getter setter
}
- 繼承
BaseEntity
抽象類(數(shù)據(jù)標(biāo)識(shí)為String
)- 類注解
@Entity
麻裳,table
對(duì)應(yīng)數(shù)據(jù)庫表名走净;tableId
對(duì)應(yīng)數(shù)據(jù)庫表標(biāo)識(shí)银择,目的是為了在生成數(shù)據(jù)標(biāo)識(shí)的時(shí)候區(qū)分表;uuidGenerator
對(duì)應(yīng)主鍵生成策略懦尝,默認(rèn)increment
知纷,可通過集繼承AbstractUuidGenerator
自定義主鍵生成策。- 屬性注解
@Column
陵霉,name
對(duì)應(yīng)數(shù)據(jù)庫中對(duì)應(yīng)的列名稱- 屬性注解
@OneToMany
琅轧,clazz
對(duì)應(yīng)子類的類類型,name
對(duì)應(yīng)該表數(shù)據(jù)標(biāo)識(shí)在其子表中的字段名稱- 屬性注解
@ManyToOne
撩匕,name
關(guān)聯(lián)主表數(shù)據(jù)標(biāo)識(shí)的列名稱
數(shù)據(jù)操作(具體操作請(qǐng)參考接口文檔)
獲取緩存對(duì)象
通過SessionFactory
的靜態(tài)方法Session getSession(String sessionName)
獲取對(duì)象鹰晨。
使用 Session 進(jìn)行數(shù)據(jù)操作
// 開啟事務(wù)
this.session = SessionFactory.getSession("homo");
this.session.open();
this.transaction = session.getTransaction();
this.transaction.begin();
// 查詢
RelevantBill order = (RelevantBill) this.session.findOne(RelevantBill.class, "10130");
System.out.println(order.getCode());
order.setCode("Hello-001");
// 更新
this.session.update(order);
System.out.println(order.getCode());
// 刪除
this.session.delete(order);
// 關(guān)閉事務(wù)
this.transaction.commit();
this.session.close();
使用 Criteria 根據(jù)條件查詢數(shù)據(jù)
// 此處省略session開關(guān)操作
Criteria criteria = this.session.createCriteria(Order.class);
criteria.add(Restrictions.like("code", "%A%"))
.add(Restrictions.or(
Restrictions.gt("price", 13),
Restrictions.lt("price", 12.58)
))
.add(Sort.desc("price"))
.add(Sort.asc("uuid"))
.limit(0, 5);
List orderList = criteria.list();
使用 Criteria 更新數(shù)據(jù)
// 此處省略session開關(guān)操作
Criteria criteria = this.session.createCriteria(Order.class);
criteria.add(Modern.set("price", 500.5D))
.add(Modern.set("day", new Date())
.add(Restrictions.equ("code", "C-001")));
System.out.println(criteria.update());
// 為保持?jǐn)?shù)據(jù)一致性,已支持表達(dá)式更新止毕,
// # 后面跟對(duì)應(yīng)對(duì)象中的屬性名模蜡,
// : 后對(duì)應(yīng)參數(shù)(后面不要忘了調(diào)用setParameter)
session.createCriteria(Order.class)
// 在原數(shù)據(jù)基礎(chǔ)上進(jìn)行拼接
.add(Modern.setWithPoEl("#code = CONCAT_WS('', #code, :STR_VALUE)"))
// 在原數(shù)據(jù)的基礎(chǔ)上進(jìn)行加操作
.add(Modern.setWithPoEl("#price = #price + :ADD_PRICE"))
//條件過濾
.add(Restrictions.equ("uuid", "10"))
// 給 :STR_VALUE 參數(shù)賦值
.setParameter("STR_VALUE", " - A")
// 給 :ADD_PRICE 參數(shù)賦值
.setParameter("ADD_PRICE", 100)
// 執(zhí)行更新操作
.update();
使用 Criteria 根據(jù)條件刪除數(shù)據(jù)
// 此處省略session開關(guān)操作
Criteria criteria = session.createCriteria(Order.class);
criteria.add(Restrictions.equ("uuid", 1011011L));
criteria.delete();
使用 SQLQuery
SQLQuery query = this.session.createSQLQuery("select uuid,code,price from tbl_order",
Order.class);
Order order = (Order) query.unique();
SQLQuery query = this.session.createSQLQuery("select uuid,code,price from tbl_order",
Order.class);
List<Order> orders = query.limit(0, 5).list();
使用 ProcessQuery 調(diào)用存儲(chǔ)過程查詢數(shù)據(jù)
// 省略session開關(guān)操作
ProcessQuery<Order> processQuery = session.createProcessQuery("{call test(?)}");
processQuery.setParameters(new String[]{"螞蟻"});
Function<ResultSet, Order> mapperFunction = (resultSet) -> {
try {
Order order = new Order();
order.setCode(resultSet.getString(1));
return order;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
};
Order order = processQuery.unique(mapperFunction);
System.out.println(order.getCode());
保存歷史數(shù)據(jù) @Track
參數(shù) | 值 |
---|---|
data | 存儲(chǔ)對(duì)哪個(gè)實(shí)體操作的歷史數(shù)據(jù) |
operator | 操作人 |
operate | 操作類型 OperateEnum
|
@Repository
public class UserRepositoryImpl extends AbstractRepository implements UserRepository {
@Override
@Track(data = "#user", operator = "#avatar", operate = OperateEnum.SAVE)
public int save(User user, String avatar) {
user.setEnable(true);
return this.getSession().save(user);
}
}
筆者不建議在程序中拼寫
SQL
, 故未對(duì)SQLQuery
ProcessQuery
做過多的支持,此處就不做贅述扁凛。
在接下來的版本中將會(huì)支持將SQL
寫在xml
文件中的方式忍疾。