中文文檔css
English Documentjava
最新版本 V1.3.1_6mysql
ThinkJD
,又名ThinkJDBC
,一個簡潔而強大的開源JDBC操做庫。你能夠使用Java像ThinkPHP
框架的M方法同樣,一行代碼搞定數據庫操做
。ThinkJD會自動管理數據庫鏈接,使用完畢或程序異常都會關閉鏈接以避免形成內存溢出。git
先睹爲快:github
//數據庫配置(只需調用一次)
D.setDbConfig("jdbc:mysql://127.0.0.1:3306/DbName?characterEncoding=UTF-8","root","root");
//插入數據
long id=D.M("user").field("name,weight","Tom",60).add();
//更新數據
D.M("user").field("weight",100).where("id=?",id).save();
//查詢數據
User user=D.M("user").find(User.class,id);
//刪除數據
D.M("user").delete(id);
項目主頁 https://github.com/Leytton/ThinkJD (Github) https://gitee.com/Leytton/ThinkJD (碼雲)sql
測試項目 https://github.com/Leytton/ThinkJD_Demo數據庫
博客主頁 https://blog.csdn.net/Leyttonruby
將ThinkJDBC-x.x.x.jar和下面的兩個依賴庫添加到項目編譯路徑裏。markdown
commons-dbutils-1.6.jar框架
這兩個Jar包在下面目錄裏:
ThinkJD支持直接定義用戶名密碼訪問數據庫,也支持使用Hikari、C3P0等數據庫鏈接池。
數據庫鏈接方式有三種:
在項目根目錄下添加文件(跟Hikari配置文件格式同樣)
程序第一次啓動時會自動加載讀取配置文件,若是文件不存在則忽略。【V1.2.4_5 增長功能】
thinkjdbc.properties
jdbcUrl = jdbc:mysql://127.0.0.1:3306/thinkjdbc?useUnicode=true&characterEncoding=UTF-8
dataSource.user = root
dataSource.password = root
D.setDbConfig("jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=UTF-8","root","root");
例如使用Hikari鏈接池:
HikariConfig config = new HikariConfig("/hikari.properties");
HikariDataSource dataSource = new HikariDataSource(config);
D.setDataSource(dataSource);
注:若是定義了數據庫鏈接池,ThinkJD會優先使用。
只需調用一次,配置表前綴不是必需的
D.setTablePrefix("jd_");
//D.M('user') 將會操做 `jd_user` 表
注:
D.M('user').prefix('jd_')
方法可單獨指定表前綴【V1.2.3新增】
操做 | 參數 | 示例 | 說明 |
---|---|---|---|
table |
table(String table) | table(「user」) | |
join |
join(String join) | join(「left join machine on user.id=user_id and machine_status=1」) | |
field |
①field(String filed) ②field(String filed, Object… dataParam) |
①field(「id,username」) ②field(「id,username」,1111,」Leytton」) |
①用於查詢操做 ②用於更新操做 |
where |
①where(String where) ②where(String where, Object… whereParam) |
①where(「id=1111 and username=’Leytton’」) ②where(「id=? and username=?」,1111,」Leytton」) |
|
group |
group(String group) | group(「type」) | |
having |
having(String having) | having(「id>1234」) | |
order |
order(String order) | order(「id desc」) | |
page |
page(long page, long rows) | page(1,10) | |
limit |
①limit(long rows) ②limit(long offset, long rows) |
①limit(10) ②limit(1,10) |
|
union |
union(String union,Boolean isAll) | ①union(「select * from user_two where id>1234」,false) ②union(「select * from user_two where id>1234」,true) |
操做 | 參數 | 說明 |
---|---|---|
select | <T > List<T > select(Class<T > type) |
|
find | ①<T > T find(Class<T > type)②< T > T find(Class<T > type, long id)③< T > T find(Class<T > type, String key, Object value) |
|
count | ①long count() ②long count(String field) |
|
max | double max(String field) | |
min | double min(String field) | |
avg | double avg(String field) | |
sum | double sum(String field) |
//find查詢
//select id,name from jd_user where id>4 order by id asc limit 0,1
User res = D.M("user").field("id,name").where("id>?",4).order("id asc").find(User.class);
//find 根據id查詢
//select * from user where id=3 limit 0,1
User user = D.M("user").find(User.class,3);
//find根據字段查詢
//select * from jd_user where name='Tom' limit 0,1
User user=D.M("user").fetchSql(true).find(User.class,"name","Bob");
//where,field過濾
//select id,name,weight from jd_user where id>3
List<User> res = new M("user").field("id,name,weight").where("id>3").select(User.class);
//group分組查詢
//select sex,sum(weight) as weight,avg(age) as age,count(id) as num from jd_user where id>5 group by sex order by sex desc limit 0,10
res = new M("user").field("sex,sum(weight) as weight,avg(age) as age,count(id) as num").where("id>?",5).group("sex").order("sex desc").page(1, 10).select(User.class);
//join聯表查詢
//select jd_user.id,name,weight,sum(gold) as num from jd_user left join jd_gold on user_id=jd_user.id where jd_user.id>3 group by jd_user.id
res = new M("user").field("jd_user.id,name,weight,sum(gold) as num").join("left join jd_gold on user_id=jd_user.id").where("jd_user.id>3").group("jd_user.id").select(User.class);
//union聯表查詢
//(select id,name from jd_user where id=4 ) union all (select id,name from jd_user where id<3) union (select id,name from jd_user where id=3)
res = new M("user").field("id,name").where("id=4").union("select id,name from jd_user where id<3",true)
.union("select id,name from jd_user where id=3",false).select(User.class);
//統計查詢
long num= new M("user").where("id>3").count();
num= D.M("user").fetchSql(true).where("id>3").count("id");
num= (long) D.M("user").fetchSql(false).where("id<0").max("id");
num= (long) D.M("user").where("id<3").max("id");
num= (long) D.M("user").min("id");
num= (long) D.M("user").where("id>3").min("id");
num= (long) D.M("user").fetchSql(false).where("id>3").avg("id");
double avg= D.M("user").fetchSql(false).where("id>3").avg("id");
num= (long) D.M("user").where("id>13441").sum("age");
經過調用
fetchSql(true)
方法,能夠獲取到ThinkJD
產生的SQL語句(Exception形式)而且不會執行數據庫操做。
user表結構:
字段名 | 數據類型 | 備註 |
---|---|---|
id | int | 用戶id,自增加主鍵 |
name | varchar | 用戶名 |
age | tinyint | 年齡 |
weight | float | 體重 |
sex | tinyint | 性別 0女/1男 |
time | int | 時間 |
select()
和 find()
查詢結果封裝到JavaBean裏返回:
public class User {
private long id;
private int age;
private String name;
private float weight;
private int sex;
private int num;
private long time;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
}
操做 | 參數 | 說明 |
---|---|---|
add | long add() | 前提方法:field() 返回自動生成的主鍵值; |
//指定插入字段
long id=D.M("user").field("name,weight","Tom",60).add();
/*不指定插入字段,第一個參數固定爲""或null,第二個參數對應id爲null */
id=D.M("user").field("",null,"Tom",60).add();
操做 | 參數 | 說明 |
---|---|---|
save | long save() | 前提方法:field(),where(); 返回執行生效行數 |
long num=D.M("user").field("name,weight","Mike",100).where("id=?",1234).save();
num=D.M("user").field("weight",100).where("id>?",1234).save();
操做 | 參數 | 說明 |
---|---|---|
delete | long delete() | 前提方法:field() 返回執行生效行數 |
注:爲防止誤刪除,where條件不能爲空。
long num=D.M("user").delete(13424);
num=D.M("user").delete("time",1523681398);
num=D.M("user").where("id>=?",13421).delete();
操做 | 參數 | 說明 |
---|---|---|
execute | void execute(String… sqls) | 直接執行SQL語句 |
D.M().execute( sql1 [ sql2 , sql3 ... ] );
數據庫表引擎應該爲InnoDB以支持事務操做。
代碼示例:
Connection conn=null;
try {
//獲取已開啓事務的數據庫鏈接
conn = D.M().startTrans();
//使用事務鏈接操做數據庫
long id=new M("gold").trans(conn).field("user_id,gold,type,time",3,5,0,System.currentTimeMillis()/1000).add();
System.out.println(id);
if(id>0) {
throw new SQLException("Transaction Rollback Test");
}
id=new M("gold").trans(conn).field("user_id,gold,type,time",3,5,0,System.currentTimeMillis()/1000).add();
System.out.println(id);
//提交事務
D.M().commit(conn);
} catch (SQLException e) {
e.printStackTrace();
try {
//事務回滾
D.M().rollback(conn);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
若是喜歡的話,請點個贊讓我知道哦~在找到比它用得更順手的JDBC庫以前,這個項目會持續更新。