日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

开源作品ThinkJDBC—一行代码搞定数据库操作

發布時間:2025/4/5 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源作品ThinkJDBC—一行代码搞定数据库操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 簡介

ThinkJD,又名ThinkJDBC,一個簡潔而強大的開源JDBC操作庫。你可以使用Java像ThinkPHP框架的M方法一樣,一行代碼搞定數據庫操作。ThinkJD會自動管理數據庫連接,使用完畢或程序異常都會關閉連接以免造成內存溢出。

先睹為快:

//數據庫配置(只需調用一次) D.setDbConfig("jdbc:mysql://127.0.0.1:3306/DbName?characterEncoding=UTF-8","root","root"); //JavaBean模式,自動獲取表名、主鍵、自增屬性、字段名和數據 User user = new User(); user.setAge(10); user.setName("Hello"); user.setSex(true); //插入數據 long id=D.M(user).add(); //查詢數據 user=D.M(User.class).find(id); //更新數據 user.setSex(false); D.M(user).field("sex").save();//不指定字段名默認更新JavaBean的所有非空屬性 //刪除數據 D.M(user).delete(); //D.M(User.class).delete(id); //Table模式,手動指定表名、主鍵、自增屬性、字段名和數據 //插入數據 long id=D.M("user").field("name,weight").data("Tom",60).add(); //更新數據 D.M("user").field("name,weight").data("Tom",100).where("id=?",id).save(); //查詢數據 user=D.M(User.class).find(id); //刪除數據 D.M("user").delete(id);

項目主頁?https://gitee.com/Leytton/ThinkJD?(碼云)?https://github.com/Leytton/ThinkJD?(Github)

測試項目?https://github.com/Leytton/ThinkJD_Demo

2 使用方法

0x01 添加依賴

ThinkJDBC-x.x.x-full.jar?包含了ThinkJDBC-x.x.x-core.jar核心庫和兩個依賴庫,只需要添加這一個jar包就行了

  • mysql-connector-java-5.1.39.jar
  • commons-dbutils-1.6.jar

0x02 定義數據庫

ThinkJD支持直接定義用戶名密碼訪問數據庫,也支持使用Hikari、C3P0等數據庫連接池。

數據庫連接方式有三種:

(1)配置文件方式

在項目根目錄下添加文件(跟Hikari配置文件格式一樣)

程序第一次啟動時會自動加載讀取配置文件,如果文件不存在則忽略?!綱1.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
  • 1
  • 2
  • 3

(2)帳號密碼方式

D.setDbConfig("jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=UTF-8","root","root");
  • 1

(3)使用數據庫連接池

例如使用Hikari連接池:

HikariConfig config = new HikariConfig("/hikari.properties"); HikariDataSource dataSource = new HikariDataSource(config); D.setDataSource(dataSource);
  • 1
  • 2
  • 3

注:如果定義了數據庫連接池,ThinkJD會優先使用。

(3)配置表前綴

只需調用一次,配置表前綴不是必需的

D.setTablePrefix("jd_"); //D.M('user') D.M(User.class)將會操作 `jd_user` 表
  • 1
  • 2

注:D.M('user').prefix('jd_')方法可單獨指定表前綴【V1.2.3新增】

0x03 連貫操作

操作參數示例說明
tabletable(String table)table(“user”)?
pkpk(String key)pk(“id”)?
autoIncautoInc(boolean isPkAutoInc)autoInc(false)?
joinjoin(String join)join(“left join machine on user.id=user_id and machine_status=1”)?
fieldfield(String filed)field(“id,username”)?
datadata(Object… dataParam)data(11,”Leytton”)?
setIncsetInc(String key,long num)setInc(“gold”,5) //gold=gold+5?
setDecsetDec(String key,long num)setDec(“gold”,5) //gold=gold-5?
where①where(String where)
②where(String where, Object… whereParam)
①where(“id=1111 and username=’Leytton’”)
②where(“id=? and username=?”,1111,”Leytton”)
?
groupgroup(String group)group(“type”)?
havinghaving(String having)having(“id>1234”)?
orderorder(String order)order(“id desc”)?
ascasc(String key)asc(“id”)?
descdesc(String key)desc(“id”)?
pagepage(long page, long rows)page(1,10)?
limit①limit(long rows)
②limit(long offset, long rows)
①limit(10)
②limit(1,10)
?
unionunion(String union,Boolean isAll)①union(“select * from user_two where id>1234”,false)
②union(“select * from user_two where id>1234”,true)
?

0x04 查詢數據

操作參數說明
select①<T> List<T> select()
②<T> List<T> select(String key, Object value)
?
find①<T> T find()
②<T> T find(Object value)
③<T> T find(String key, Object value)
?
count①long count()
②long count(String field)
?
maxdouble max(String field)?
mindouble min(String field)?
avgdouble avg(String field)?
sumdouble 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.class).field("id,name").where("id>?",4).order("id asc").find(); //find 根據id查詢 //select * from jd_user where id=3 limit 0,1 User user = D.M(User.class).find(3); //find根據字段查詢 //select * from jd_user where name='Tom' limit 0,1 User user=D.M(User.class).fetchSql(true).find("name","Bob"); //where,field過濾 //select id,name,weight from jd_user where id>3 List<User> res = D.M(User.class).field("id,name,weight").where("id>3").select(); //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 = D.M(User.class).field("sex,sum(weight) as weight,avg(age) as age,count(id)www.yongshiyule.cn? as num").where("id>?",5).group("sex").order("sex desc").page(1, 10).select(); //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 = D.M(User.class).field("jd_user.id,name,weight,sum(gold)www.feifanyule.cn as num").join("left join jd_gold on user_id=jd_user.id").where("jd_user.id>3").group("jd_user.id").select(); //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 = D.M(User.class).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(www.120xh.cn?); //統計查詢 long num= new M(User.class).where("id>3").count(); num= D.M(User.class).fetchSql(true).where("id>3").count("id"); num= (long) D.M(User.class).fetchSql(false).where("id<0").max("id"); num= (long) D.M(User.class).where("id<3").max("id"); num= (long) D.M(User.class).min("id"); num= (long) D.M(User.class).where("id>3").min("id"); num= (long) D.M(User.class).fetchSql(false).where("id>3").avg("id"); double avg= D.M(User.class).fetchSql(false).where("id>3").avg("id"); num= (long) D.M(User.class).where("id>13441")www.thd178.com/ ? sum("age");

?

通過調用fetchSql(true)方法,可以獲取到?ThinkJD產生的SQL語句(Exception形式)并且不會執行數據庫操作。?

user表結構:

字段名數據類型備注
idint用戶id,自增長主鍵
namevarchar用戶名
agetinyint年齡
weightfloat體重
sextinyint性別 0女/1男
timeint時間

select()和?find()查詢結果封裝到JavaBean里返回,JavaBean可使用注解映射數據庫字段。

注意:墻裂建議JavaBean字段基礎數據類型使用【Integer、Long、Boolean、Float、Double、Byte、Short、Char】不要使用【integer、long、boolean、float、double、byte、short、char】,因為前者可以賦值為null而后者不行(null時為0),所以獲取到的值是不準確的。ThinkJD的save更新等操作通過判斷屬性值不為null則加入數據庫更新字段隊列。ThinkJD會自動檢測以上不符合的數據類型并發出警告。如需關閉調用D.setCheckField(false);

//@Table(name="user")默認類名為表名,可注解重定義 public class User {//@Column(isKey=true)默認id為主鍵、isAutoInc=true自增,可注解重定義private Long id; private Integer age; //@Column(name="user_name")默認屬性名為表字段,可注解重定義 private String name; private Float weight; private Boolean sex; @Column(isColumn=false) private Integer num; private Long time; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Integer getAge() { return age; } public void setAge(Integer 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 Boolean getSex() { return sex; } public void setSex(Boolean sex) { this.sex = sex; } public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public Long getTime() { return time; } public void setTime(Long time) { this.time = time;

0x05 插入數據

操作參數說明
addlong add()Table模式前提方法:data()
返回自動生成的主鍵值;
/*指定插入字段*/ long id=D.M(User.class).field("name,weight").data("Tom",60).add();/*不指定插入字段,按表字段順序插入*/ id=D.M("user").data(null,"Tom",60,...).add(); /*使用javaBean半自動模式,自動獲取表名、主鍵、字段名,給定data按javaBean屬性順序插入,生成的sql語句如下 *insert into jd_user (age,name,weight,sex,time) values(?,?,?,...) */ id=D.M(User.class).data("Tom",60,...).add(); //使用javaBean全自動模式,自動獲取表名、主鍵、字段名和數據 User user = new User(); user.setId(5); user.setAge(10); user.setName("Hello"); //insert into jd_user (age,name) values(?,?) Params[10,Hello] num=D.M(user).add(); //insert into jd_user (name) values(?) Params[Hello] num=D.M(user).field("name").add(); //insert into jd_user (id,age,name) values(?,?,?) Params[5,10,Hello] num=D.M(user).autoInc(false).add();

0x06 更新數據

操作參數說明
savelong save()Table模式前提方法:data(),where();
返回執行生效行數
long num=D.M("user").field("name,weight").data("Mike",100).where("id=?",1234).save(); User user = new User(); user.setId(5); user.setAge(10); user.setName("Hello"); //update jd_user set age=?,name=? where id=?; Params[10,Hello,5] num=D.M(user).save(); //update jd_user set name=? where id=?; Params[Hello,5] num=D.M(user).field("name").save(); //update jd_user set id=?,age=?,name=? where id=?; Params[5,10,Hello,4] id=D.M(user).autoInc(false).fetchSql(true).where("id=?",user.getId()-1).save();

?

0x07 刪除數據

操作參數說明
deletelong delete()Table模式前提方法:where()
返回執行生效行數

注:為防止誤刪除,where條件不能為空。

long num=D.M("user").delete(5);//默認為id=? num=D.M("user").delete("time",1523681398);//time=? num=D.M(User.class).where("id>=?",13421).delete(); //JavaBean模式 User user=new User(); user.setId(10L); long num=D.M(user).delete();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

0x08 執行SQL

操作參數說明
executevoid execute(String… sqls)直接執行SQL語句
D.M().execute( sql1 [ sql2 , sql3 ... ] );
  • 1

0x09 事務支持

數據庫表引擎應該為InnoDB以支持事務操作。?
代碼示例:

Connection conn=null; try {//獲取已開啟事務的數據庫連接conn = D.M().startTrans();//使用事務連接操作數據庫long id=new M("gold").trans(conn).field("user_id,gold,type,time").data(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").data(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();

3 許可證

Apache License 2.0

4 關于

如果喜歡的話,請點個贊讓我知道哦~在找到比它用得更順手的JDBC庫之前,這個項目會持續更新。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的开源作品ThinkJDBC—一行代码搞定数据库操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。