迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:ThinkJD开源软件地址:https://gitee.com/Leytton/ThinkJD开源软件介绍:1 简介
特性
先睹为快://数据库配置(只需调用一次)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 添加依赖导入Jar包引入ThinkJDBC-x.x.x.jar库和commons-dbutils-1.6.jar依赖库: 或者 Maven<dependency> <groupId>com.llqqww</groupId> <artifactId>thinkjdbc</artifactId> <version>1.4.5_16</version></dependency>
0x02 定义数据库ThinkJD支持直接定义用户名密码访问数据库,也支持使用Hikari、C3P0等数据库连接池。 数据库连接方式有三种: (1)配置文件方式在项目根目录下添加文件(跟Hikari配置文件格式一样) 程序第一次启动时会自动加载读取配置文件,如果文件不存在则忽略。【V1.2.4_5 增加功能】
jdbcUrl = jdbc:mysql://127.0.0.1:3306/thinkjdbc?useUnicode=true&characterEncoding=UTF-8dataSource.user = rootdataSource.password = rootdataSource.driverClassName=com.mysql.jdbc.Driver (2)帐号密码方式D.setDbConfig("jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=UTF-8","root","root"); 默认驱动名是 com.mysql.jdbc.Driver,即默认操作MySQL数据库,若使用的是其他数据库则可以修改驱动路径 D.setDbConfig(new DbConfig(dbUrl, dbUser, dbPassword, driverName)); (3)使用数据库连接池例如使用Hikari连接池: HikariConfig config = new HikariConfig("/hikari.properties");HikariDataSource dataSource = new HikariDataSource(config);D.setDataSource(dataSource);
(3)配置表前缀只需调用一次,配置表前缀不是必需的 D.setTablePrefix("jd_");//D.M('user') D.M(User.class)将会操作 `jd_user` 表
0x03 连贯操作
0x04 查询数据
//find查询//select id,name from jd_user where id>4 order by id asc limit 0,1User 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,1User user = D.M(User.class).find(3);//find根据字段查询//select * from jd_user where name='Tom' limit 0,1User user=D.M(User.class).fetchSql(true).find("name","Bob");//where,field过滤//select id,name,weight from jd_user where id>3List<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,10res = D.M(User.class).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();//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.idres = D.M(User.class).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();//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();//统计查询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").sum("age");
user表结构:
注意:墙裂建议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 插入数据
/*指定插入字段*/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 更新数据
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 删除数据
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(); 0x08 执行SQL
D.M().execute( sql1 [ sql2 , sql3 ... ] ); 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(); }} 0x0A 多线程安全【V1.4.4_12功能】 /*设置数据库操作完毕后不自动关闭*此处是为了提高数据库操作性能,不用频繁地获取和关闭连接,同一线程内ThinkJD会使用同一连接;*默认自动关闭连接的话,每次操作都会获取一个新的Connection,使用完毕立即自动关闭*/D.setAutoClose(false);new Thread(new Runnable() { @Override public void run() { Gold gold = new Gold(); gold.setUser_id(1L); gold.setGold(5); gold.setGold_type(0); try { D.M(gold).add(); D.M(gold).add(); } catch (SQLException e) { D.closeConn(); e.printStackTrace(); } }}, "Thread_1").start();new Thread(new Runnable() { @Override public void run() { Gold gold = new Gold(); gold.setUser_id(2L); gold.setGold(5); gold.setGold_type(0); try { D.M(gold).add(); D.M(gold).add(); } catch (SQLException e) { D.closeConn(); e.printStackTrace(); }
|
请发表评论