官方快速上手文檔:
https://javalite.io/activejdbc
https://javalite.io/getting_started
完整介紹:
https://javalite.io/documentation
環境搭建:
1、在數據庫中創建該表,注意主鍵設置為空移除
CREATE TABLE people ( id int(11) NOT NULL auto_increment PRIMARY KEY, first_name VARCHAR(56) NOT NULL, last_name VARCHAR(56), created_at DATETIME, updated_at DATETIME );
2、創建一個空的Maven工程,添加必要的包:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.dzz</groupId> <artifactId>ActiveJDBC</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.javalite</groupId> <artifactId>activejdbc</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.javalite</groupId> <artifactId>activejdbc-instrumentation</artifactId> <version>2.2</version> <executions> <execution> <phase>process-classes</phase> <goals> <goal>instrument</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
3、編寫Model繼承類,如果名稱不一致,可使用ActiveJDBC提供的table注解標注
package cn.dzz.model; import org.javalite.activejdbc.Model; import org.javalite.activejdbc.annotations.Table; @Table("employees") public class Employee extends Model { }
4、創建連接並執行SQL操作
【注意連接高版本MySQL,com.mysql.cj.jdbc.Driver,連接地址需要加上參數】
package cn.dzz.instance; import cn.dzz.model.Employee; import org.javalite.activejdbc.Base; public class ConnectTest { public static void main(String[] args) { Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3307/devbase", "root", "123456"); Employee e = new Employee(); e.set("first_name", "John"); e.set("last_name", "Doe"); e.saveIt(); // new Employee().set("first_name", "John", "last_name", "Doe").saveIt(); } }
首次操作一定出現這個問題:
Caused by: activejdbc.InitException: you are trying to work with models, but no models are found. Maybe you have no models in project, or you did not instrument the models. It is expected that you have a file activejdbc_models.properties on classpath
解決參考:
https://www.dazhuanlan.com/2019/12/17/5df8089723b56/#配置參考

通過IDEA找到這個Maven安裝的植入插件:
執行一次插件,再次允許即可:

可以看到是插入成功的
API閱讀:
單記錄查詢:
// 子查詢? 和對應的條件 ,條件是可變參數,支持多條件 Employee e = Employee.findFirst("first_name = ?", "John"); System.out.println(e); Object first_name = e.get("first_name"); System.out.println(first_name); Object id = e.get("id"); System.out.println(id); Object last_name = e.get("last_name"); System.out.println(last_name);
問題在於返回的屬性值是一個Object,需要自己轉換?
多記錄直接調用where方法:
List<Employee> employees = Employee.where("first_name = ?", "John");
更新記錄類同JPA,先查再改:
Employee e = Employee.findFirst("first_name = ?", "John");
e.set("last_name", "Steinbeck").saveIt();
刪除記錄同理:
Employee e = Employee.findFirst("first_name = ?", "John");
e.delete();
也支持類靜態方法:
Person.delete("age > ?", "10");
復雜的批處理操作:
PreparedStatement ps = Base.startBatch("insert into people (NAME, LAST_NAME, DOB) values(?, ?, ?)");
Base.addBatch(ps, "Mic", "Jagger", "1962-01-01");
Base.addBatch(ps, "Marilyn", "Monroe", "1932-01-01");
Base.executeBatch(ps);
ps.close();
全刪和全找:
Employee.deleteAll();
List<Employee> employees = Employee.findAll();
支持建造者模式方式賦值多個字段:
new Person().set("first_name", "Marilyn").set("last_name", "Monroe").set("dob", "1935-12-06").saveIt();
也可以通過類靜態方法:
Person.createIt("first_name", "Marilyn", "last_name", "Monroe", "dob", "1935-12-06");
讀取數量不多的數據集:
List<Map> usersList = Base.findAll("select * from users where company_id = ? ", companyId);
for(Map record: userList){
System.out.println("first_name: " + record.get("first_name"));
System.out.println("last_name: " + record.get("last_name"));
}
百萬級數據讀取:
Base.find("select first_name, last_name from really_large_table", ....).with(new RowListenerAdapter() {
public void onNext(Map row) {
///write your code here
Object o1 = row.get("first_name");
Object o2 = row.get("last_name");
}
});
時間轉換成毫秒值:
Long lastLoginTime = Convert.toLong(Base.firstCell?("select time from logins where user_id ? order by created_at limit 1", 123));
取表的單個列記錄:
List ssns = Base.firstColumn("select ssn from people where first_name = ?", "John");
for(Object ssn: ssns)
System.out.println(ssn);
SETTER & GETTER 包裝處理:
public class Person extends Model{ public void setFirstName(String firstName){ set("first_name", firstName); } public String getFirstName(){ return getString("first_name"); } }
所以ActiveJDBC也提供了對應的包裝處理,方便開發者直接獲取正確的數據類型:
【原始get方法得到的是Object】
String name = p.getString("name");
Timestamp dob = p.getTimestamp("dob");
文檔中提及ActiveJDBC會盡可能的幫你轉換類型,根據表設計的字段類型來返回,然而上面的讀取並不會這樣
如果不行,還可以調用Convert工具類的方法實現轉換
http://javalite.github.io/activejdbc/snapshot/org/javalite/common/Convert.html
單復數命名映射約定:
ActiveJDBC的創造者約定:表名稱統一使用復數形式,而映射的Java模型類則用單數形式命名
對於工地英語的我來說簡直費解,所以創造者又提供了@Table注解,指定表名稱即可
@Table("Operator")
public class Operator extends Model{}
