sproket/Persism:Java低程式碼的ORM框架

banq發表於2022-03-28

Persism 是一個用於 Java 17 或更高版本的簡單、自動發現、自動配置和約定優於配置的 ORM(物件關係對映)庫。

Persism的API很小。大多數情況下,你只需要一個Connection和一個Persism Session物件,你就可以開始了。你的POJO可以有可選的表和列名註釋,並且可以選擇實現一個Persistable介面,用於你需要跟蹤UPDATE語句的屬性變化。

Persism為你自動推算和發現:建立一個表,編寫一個JavaBean,執行一個查詢,Persism使用簡單的對映規則來尋找你的表和列名,只要求在它找不到匹配的地方進行註釋。

Persism不需要特殊的配置。把JAR放到你的專案中就可以了。
Persism有註釋,但它們只在某些東西超出常規時才需要。在大多數情況下,你可能甚至不需要它們。
Persism通常可以為你檢測表和列的對映,包括主鍵/生成鍵和帶預設值的列。
Persism預設會做正確的事情。Persism理解你的類被稱為Customer,你的表被稱為CUSTOMERS。它理解你的表列是CUSTOMER_ID,你的屬性是customerId。
Persism理解你的類被稱為Category,你的表被稱為CATEGORIES。沒問題。不需要為此做註解。Persism使用註釋作為後備手段--只有當某些東西超出常規時才進行註釋。

大小100k以下。是的,如果你想的話,可以把它裝在軟盤上。Persism沒有依賴性,但是它將利用基於執行時可用的任何日誌 - SLF4J、LOG4J或JUL。
支援資料庫:Derby, Firebird, H2, HSQLDB, Informix, MSAccess, MSSQL, MySQL/MariaDB, Oracle (12+), PostgreSQL, SQLite.


以下是CRUD案例程式碼:

import static net.sf.persism.Parameters.*;
import static net.sf.persism.SQL.*;

Connection con = DriverManager.getConnection(url, username, password);

// Instantiate a Persism session object with the connection
Session session = new Session(con);

List<Customer> list = session.query(Customer.class, sql("select * from Customers where CUST_NAME = ?"), params("Fred"));
// or
List<Customer> list = session.query(Customer.class, proc("sp_FindCustomers(?)"), params("Fred"));

Customer customer;
customer = session.fetch(Customer.class, sql("select * from Customers where CUST_NAME = ?"), params("Fred"));
// or   
customer = session.fetch(Customer.class, proc("sp_FindCustomer(?)"), params("Fred"));
if (customer != null) {
    // etc...
}

// You don't need the SELECT parts for Views or Tables
List<Customer> list = session.query(Customer.class, where("CUST_NAME = ?"), params("Fred"));

// You can reference the property names instead of the column names - just use :propertyName 
List<Customer> list = session.query(Customer.class, where(":name = ?"), params("Fred"));

// Order by is also supported with where() method
List<Customer> list = session.query(Customer.class, where(":name = ? ORDER BY :lastUpdated"), params("Fred"));

// Named parameters are also supported - just use @name
SQL sql = where("(:firstname = @name OR :company = @name) and :lastname = @last");
customer = session.fetch(Customer.class, sql, params(Map.of("name", "Fred", "last", "Flintstone")));

// fetch an existing instance
Customer customer = new Customer();
customer.setCustomerId(123);
if (session.fetch(customer)) {
    // customer found and initialized// Supports basic types
String result = session.fetch(String.class, sql("select Name from Customers where ID = ?"), params(10));

// Fetch a count as an int - Enums are supported 
int count = session.fetch(int.class, sql("select count(*) from Customers where Region = ?"), params(Region.West));

// Insert - get autoinc
Customer customer = new Customer();
customer.setCustomerName("Fred");
customer.setAddress("123 Sesame Street");

session.insert(customer); 

// Inserted and new autoinc value assigned 
assert customer.getCustomerId() > 0

// Update
customer.setCustomerName("Barney");
sesion.update(customer); // Update Customer   

// Delete
session.delete(customer);

// Handles transactions
session.withTransaction(() -> {
    Contact contact = getContactFromSomewhere();
    contact.setIdentity(randomUUID);
    session.insert(contact);
    
    contact.setContactName("Wilma Flintstone");
    
    session.update(contact);
    session.fetch(contact);
});


 

相關文章