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配置文件格式一样)

程序第一次启动时会自动加载读取配置文件,如果文件不存在则忽略。【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
  • 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 连贯操作

操作 参数 示例 说明
table table(String table) table(“user”)  
pk pk(String key) pk(“id”)  
autoInc autoInc(boolean isPkAutoInc) autoInc(false)  
join join(String join) join(“left join machine on user.id=user_id and machine_status=1”)  
field field(String filed) field(“id,username”)  
data data(Object… dataParam) data(11,”Leytton”)  
setInc setInc(String key,long num) setInc(“gold”,5) //gold=gold+5  
setDec setDec(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”)
 
group group(String group) group(“type”)  
having having(String having) having(“id>1234”)  
order order(String order) order(“id desc”)  
asc asc(String key) asc(“id”)  
desc desc(String key) desc(“id”)  
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)
 

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)
 
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.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表结构:

字段名 数据类型 备注
id int 用户id,自增长主键
name varchar 用户名
age tinyint 年龄
weight float 体重
sex tinyint 性别 0女/1男
time int 时间

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 插入数据

操作 参数 说明
add long 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 更新数据

操作 参数 说明
save long 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 删除数据

操作 参数 说明
delete long 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

操作 参数 说明
execute void 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库之前,这个项目会持续更新。

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

  1. thinkjdbc 关闭_ThinkJD: ThinkJD,又名ThinkJDBC,一个强大的开源JDBC/ORM操作库,让你尽可能简洁地用一行代码搞定数据库操作。...

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

  2. 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?

    来源:https://blog.csdn.net/yjt520557/article/details/85099115 | 简介 我在使用spring完成项目的时候需要完成记录日志,我开始以为Spri ...

  3. 自定义注解妙用,一行代码搞定用户操作日志记录

    1.简介 在使用spring完成项目的时候需要完成记录日志,开始以为Spring 的AOP功能,就可以轻松解决,半个小时都不用,可是经过一番了解过后,发现一般的日志记录,只能记录一些简单的操作,例如表 ...

  4. 一行代码搞定android全屏适配

    一行代码搞定安卓全屏幕适配--简单粗暴-低入侵,无继承,简单高效 话不多说,先上解决方案 方案一(推荐) ##### 1.引用工具类 DensityHelper.java ##### 2.在自定义的 ...

  5. WPF使用Linq 一行代码搞定数据绑定

    首先设置好DataGrid控件的相关属性,注意XAML代码文件中的列绑定要和源数据的列名一致,如: Binding="{Binding No}" 详细设置如下: this.data ...

  6. 成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!)

    成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!) 目录 解决问题 解决思路 解决方法 解决问题 numpy.ndarray格式类型转数据为list格式数据 ...

  7. 一行代码搞定 Scrapy 随机 User-Agent 设置

    摘要:爬虫过程中的反爬措施非常重要,其中设置随机 User-Agent 是一项重要的反爬措施,Scrapy 中设置随机 UA 的方式有很多种,有的复杂有的简单,本文就对这些方法进行汇总,提供一种只需要 ...

  8. 【Python】Autoviz: 一行代码搞定数据集探索并可视化

    数据集各个特征有什么变化趋势.各个特征之间有何关系,我们可以借助Matplotlib.Seaborn等诸多工具来可视化展示,那么有没有一种工具能一次展示所有的关系了? 本文要介绍的Python工具Au ...

  9. 一行代码搞定 FTP 服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

最新文章

  1. 一个虚函数和虚继承的问题。
  2. windows和linux系统之间的txt文档兼容问题
  3. windows mobile 软件_三星两款新软件曝光,使智能手机和电视更好交互
  4. 三、linux内核驱动裁剪
  5. linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)
  6. 给刚入行的存储工程师10+1点建议
  7. 企业如何选择数据分析架构?——谈谈3种架构的利弊
  8. prbs()matlab,prbs7伪随机码生成
  9. suse linux 忘记root密码,SUSE linux 忘记root密码
  10. GHOST怎么用(转)
  11. 【分治算法-02】算法经典问题
  12. 【HTML】3.Form表单
  13. mysql 取差值_mysql计算两条数据差值,求大神解答
  14. 【软件测试】—— 基础知识总结
  15. vb ADO控件连接ACCESS数据库做登录密码的例子
  16. 电子元器件贸易企业如何借助ERP系统,解决仓库管理难题?
  17. 计算机工作原理 课件,计算机的基本结构和工作原理ppt课件.ppt
  18. 记ThinkPad T470P 屏幕更换
  19. 第76天:Python开发-内外网收集Socket子域名DNS
  20. 虚拟路由冗余协议VRRP——双机热备份基础

热门文章

  1. ACTIONSCRIPT 3.0著名开源库 大集合
  2. UA MATH563 概率论的数学基础1 概率空间2 可列状态空间
  3. UA MATH571B 试验设计III 单因素试验设计3
  4. 多核 CPU 和多个 CPU 有何区别
  5. MFC对话框控件成员变量编程熟悉 - 开发一个简单天线长度计算器
  6. VC++ 保存数据为音频文件(WAV)学习
  7. vs编译项目报错:The OutputPath property is not set for this project
  8. 有向图的拓扑排序的理解和简单实现(Java)
  9. GitLab服务器迁移
  10. BOM字符(#8203;)转textNode对象