?? 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'
}
_
多數據源配置
這里以MySQL數據庫為例
配置信息
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
##根據session找到數據庫并從數據庫對應的連接池中獲取數據庫鏈接,故所有session不可重復
session: session1,session2
實體類規(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
}
明細類
@Entity(table = "TBL_COMMODITY", tableId = 201, businessName = "訂單明細")
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抽象類(數據標識為String)- 類注解
@Entity,table對應數據庫表名;tableId對應數據庫表標識,目的是為了在生成數據標識的時候區(qū)分表;uuidGenerator對應主鍵生成策略,默認increment,可通過集繼承AbstractUuidGenerator自定義主鍵生成策。- 屬性注解
@Column,name對應數據庫中對應的列名稱- 屬性注解
@OneToMany,clazz對應子類的類類型,name對應該表數據標識在其子表中的字段名稱- 屬性注解
@ManyToOne,name關聯(lián)主表數據標識的列名稱
數據操作(具體操作請參考接口文檔)
獲取緩存對象
通過SessionFactory的靜態(tài)方法Session getSession(String sessionName)獲取對象。
使用 Session 進行數據操作
// 開啟事務
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);
// 關閉事務
this.transaction.commit();
this.session.close();
使用 Criteria 根據條件查詢數據
// 此處省略session開關操作
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 更新數據
// 此處省略session開關操作
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());
// 為保持數據一致性,已支持表達式更新,
// # 后面跟對應對象中的屬性名,
// : 后對應參數(后面不要忘了調用setParameter)
session.createCriteria(Order.class)
// 在原數據基礎上進行拼接
.add(Modern.setWithPoEl("#code = CONCAT_WS('', #code, :STR_VALUE)"))
// 在原數據的基礎上進行加操作
.add(Modern.setWithPoEl("#price = #price + :ADD_PRICE"))
//條件過濾
.add(Restrictions.equ("uuid", "10"))
// 給 :STR_VALUE 參數賦值
.setParameter("STR_VALUE", " - A")
// 給 :ADD_PRICE 參數賦值
.setParameter("ADD_PRICE", 100)
// 執(zhí)行更新操作
.update();
使用 Criteria 根據條件刪除數據
// 此處省略session開關操作
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 調用存儲過程查詢數據
// 省略session開關操作
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());
保存歷史數據 @Track
| 參數 | 值 |
|---|---|
| data | 存儲對哪個實體操作的歷史數據 |
| 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, 故未對SQLQueryProcessQuery做過多的支持,此處就不做贅述。
在接下來的版本中將會支持將SQL寫在xml文件中的方式。