java orm 工具_GitHub - donnie4w/jdao: jdao是一个java的轻量级orm工具包

jdao是轻量级orm工具包,生成与数据表对应的dao类,持久层dao对象操作,同时也支持原生sql语句操作,支持多数据源,对象缓存等.

v1.1.6

jdao 初始化:

DaoFactory.setDefaultDataSource(getDataSource());

jdao初始化 设置数据源,一步完成。

getDataSource()获取数据源方法:

如:ActionTest1_1_2.java 中:

public static DataSource getDataSource() throws Exception {

Properties p = new Properties();

p.load(ActionTest1_1_2.class.getClassLoader().getResourceAsStream("druid.properties"));

return DruidDataSourceFactory.createDataSource(p);}

例如:对 数据库表名为 hstest的操作

CREATE TABLE hstest (

id int(10) DEFAULT NULL,

value varchar(50) DEFAULT '',

rowname varchar(50) DEFAULT ''

)

一.生成dao对象,生成Hstest.java

public void createDao() throws Exception {

Class.forName("com.mysql.jdbc.Driver");

String driverUrl = "jdbc:mysql://127.0.0.1:3306/test";

String path = System.getProperty("user.dir") + "/test/com/jdao/action";

CreateDaoUtil.createFile("com.jdao.action", "hstest",path,DriverManager.getConnection(driverUrl, "root", "123456"), "utf-8");

//com.jdao.action 为 Hstest的包名

//hstest为表名

}

二.对Hstest对象的操作

查询SQL: select value,rowname from hstest where id between 2 and 10;

jdao对象操作如下:

Hstest t = new Hstest();

t.where(Hstest.ID.BETWEEN(2, 10));

t.query(Hstest.VALUE, Hstest.ROWNAME);

插入SQL: insert into hstest (id,rowname,value) values(1,"donnie","wuxiaodong")

jdao对象操作如下:

Hstest t = new Hstest();

t.setId(1);

t.setRowname("donnie");

t.setValue("wuxiaodong");

t.save();

批量插入SQL: insert into hstest (id,rowname,value) values(1,"donnie1","wuxiaodong1"),(2,"donnie2","wuxiaodong2"),(3,"donnie3","wuxiaodong3")

jdao对象操作如下:

Hstest t = new Hstest();

t.setId(1);

t.setRowname("donnie1");

t.setValue("wuxiaodong1");

t.addBatch();

t.setId(2);

t.setRowname("donnie2");

t.setValue("wuxiaodong2");

t.addBatch();

t.setId(3);

t.setRowname("donnie3");

t.setValue("wuxiaodong3");

t.addBatch();

t.batchForSave();

更新SQL: update hstest set rowname="wuxiaodong",value="wuxiaodong" where id=10

jdao对象操作如下:

Hstest t = new Hstest();

t.setRowname("wuxiaodong");

t.setValue("wuxiaodong");

t.where(Hstest.ID.EQ(10));

t.update();

删除SQL: delete from hstest where id=2

jdao对象操作如下:

Hstest t = new Hstest();

t.where(Hstest.ID.EQ(2));

t.delete();

三.支持SQL操作 DBUtils

DBUtils> db=new DBUtils();

db.select("select * from hstest where id=? limit 1",1);

System.out.println(db.getString("value"));

int i = db.execute("insert into hstest(rowname,value)values(?,?)",1,2);

四.自定义类继承 DBUtils

任何子类继承自DBUtils 都可以设置与其对应的数据源,同时支持sql编写,支持翻页

如:class RsTest extends DBUtils {}

//翻页

public static void testSelectListPage() throws Exception {

RsTest rt = new RsTest();

// 分页查询方法

rt.selectListPage(0, 20, "select * from hstest");

System.out.println(rt.rsList().size());

// selectListPage 会返回 totalcount

List list = rt.rsList();

for (RsTest r : list) {

System.out.println(r.getString("value"));

}

}

//单行返回

public static void testSelect() throws Exception {

RsTest rt = new RsTest();

rt.select("select * from hstest where id=?", 1);

System.out.println(rt.getString("value"));

rt.select("select * from hstest where id=?", 2);

System.out.println(rt.getString("value"));

}

//插入

public static void testInsert() throws Exception {

RsTest rt = new RsTest();

System.out.println(rt.execute("insert into hstest(value,rowname)values(?,?),(?,?) ", "wu1", "11", "wu2", "22"));

}

//生成dao 的翻页测试类

public static void testPageTurn() throws Exception {

Hstest ht = new Hstest();

ht.setPageTurn(true); //翻页

ht.where(Hstest.ID.GE(0));

List list = ht.query();

System.out.println("totalcount:" + list.get(0).getTotalcount());

for (Hstest h : list) {

System.out.println(h.getRowname() + " " + h.getValue());

}

}

//PageDao类测试

public static void testPageDao() throws Exception {

Hstest ht = new Hstest();

ht.where(Hstest.ID.GE(1));

PageDao pd = ht.selectListPage();

System.out.println("totalcount:" + pd.getTotalcount());

List list = pd.getList();

for (Hstest h : list) {

System.out.println(h.getRowname() + " " + h.getValue());

}

}

五.事务

Transaction t = new Transaction(getDataSource());

Hstest hstest = new Hstest();

hstest.setTransaction(t);

hstest.setRowname("wu");

hstest.setValue("dong");

hstest.save();

Hstest hstest2 = new Hstest();

hstest2.setTransaction(t);

hstest2.setRowname("wu2");

hstest2.setValue("dong2");

hstest2.save();

DBUtils rt = new DBUtils();

rt.setTransaction(t);

rt.execute("insert into hstest(rowname,value)values(?,?)", 1, 2);

t.rollBackAndClose();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、SBORM 介绍 1、目前只考虑支持 mysql; 2、基于spring jdbc的上层封装,底层jdbc操作基于JdbcTemplate,对于使用spring jdbc的人会有一点价值,比较简洁的封装可以节省很多重复劳动,具体节省多少可以看看example; 3、实现一套简单的ORM(直接使用spring rowmapper,insert自己实现),可以基于对象进行crud和相对复杂(感觉比hibernate强大一点)的sql操作; 4、基于对象指定查询的字段,大部分时候可以忘掉表结构进行业务开发; 5、支持简单的数据库路由,读写分离(半自动,需要指定取writer还是reader,默认规则reader采用随机的方式,当然也可以手动指定); 6、支持简单的分表,主要是针对一定规则的分表,比如百分表、千分表,也可以自己指定分表后缀; 7、简单的单表查询(比如所有条件是and或者or结构),基本实现0sql代码编写(类似HibernateTemplate selectByExample、findByCriteria、find等方法); 8、简单的单表排序支持,支持多个排序条件组合; 9、对于复杂的sql查询,提供获取jdbctemplate实例进行操作,类似spring jdbc的常规用法; 10、提供Entity代码生成接口,Entity并非简单的pojo(尽可能不要去修改此类),引入字段常量类,方便查询的时候指定选择字段,从而更好实现查询条件的封装; 二、为什么写SBORM? 1、hibernate:过于臃肿,使用不够灵活,优化难(其实主要是因为很少用),HQL感觉就是个渣,在 mysql几乎一统天下的背景下,跨数据库级别的兼容吃力不讨好。Hibernate的对象化关联处理确实挺强大,但是使用起来坑太多,有多少人敢在项目 中大范围使用真不知道,屠龙刀不是人人都提的起啊。 2、mybatis:轻量级,基于xml的模式感觉不利于封装,代码量不小,基于xml维护也麻烦(个人观点, 现在注解模式貌似也挺不错),感觉mybatis更适合存在dba角色的年代,可以远离代码进行sql调优,复杂的查询拼装起来也更加优雅(java基本 就是if else ...),但是对于查询业务简单但是数据库集群环境的场景有点憋屈(其实对mybatis使用也不多,瞎评论^_^)。 3、spring jdbc:小巧,灵活,足够优秀,个人比较喜欢使用,但是代码量偏大,原生的接口重复劳动量大,比如insert、mapper之类的; SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太喜欢使用hibernate和mybatis,主要是使用spring jdbc,写这个东西的出发点主要是平时使用spring jdbc觉 得比较麻烦,重复性的代码偏多,一方面通过自动mapper降低返回结果处理工作量,另一方面参考hibernate对象化查询条件的模式,写了一个 QueryBudiler,使得更多简单的单表查询可以通过对象组织查询、更改逻辑,避免过多去写相似性的SQL语句,减少DAO接口量。 三、一些亮点 1、Entity的设计:很多人看了也许会说,这个不是POJO,不是纯粹的Java Bean,显得很另类。但是有多人在开发过程中(特别是在写sql的时候),经常要去看看表结构设计?还有多少次因为改了表某个字段,还得遍历去查找哪些 sql使用了这个字段?多少次看到在代码中直接传入字段名作为查询参数感到别扭?如果将表结构字段都用java对象去描述,能够解决这些问题,就不必要在 乎是不是POJO了,后面看example的时候应该能体会这么做的一些好处,至少我觉得是挺方便的,将大部分查询脱离表结构设计。 2、简单的数据库路由:如果分库结构不是太复杂(比如简单的读写分离、或者多个库集成),BaseDao可以自 动进行路由(比如读写分离,根据业务模式指定读、写库),如果非默认的路由规则,也可以通过手动设置的模式,进行数据库路由。数据库路由直接由 Entity指定,所有的路由都是根据Entity识别,也就是说查询也是围绕Entity展开的,避免类似使用spring jdbc的时候,各种 template实例跳来跳去,硬编码引入,写一个业务还得看看到底该用哪个template,尤其是多个数据库共用一个template实例的时候。 3、QueryBuilder:单表查询基本上都可以实现零Sql(除非查询条件特别复杂的),更新、删除等操作也可以通过QueryBuilder进行批量处理,不局限于根据主键来处理。 4、分表操作的支持:对于分表操作和常规的使用没有区别,只是指定分表规则,mybatis好像也可以通过制定参数实现分表处理,没搞清楚hibernate对这个是怎么处理的(hibernate好像是bean和表一对一绑定的)? 标签:sborm
sqoop import --connect jdbc:mysql://zhaosai:3306/mydb --username root --password jqe6b6 --table news --target-dir /user/news --fields-terminated-by “;” --hive-import --hive-table news -m 1出现错误Warning: /opt/programs/sqoop-1.4.7.bin__hadoop-2.6.0/../hbase does not exist! HBase imports will fail. Please set $HBASE_HOME to the root of your HBase installation. Warning: /opt/programs/sqoop-1.4.7.bin__hadoop-2.6.0/../hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Warning: /opt/programs/sqoop-1.4.7.bin__hadoop-2.6.0/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. Warning: /opt/programs/sqoop-1.4.7.bin__hadoop-2.6.0/../zookeeper does not exist! Accumulo imports will fail. Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation. 23/06/10 16:18:23 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 23/06/10 16:18:23 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 23/06/10 16:18:23 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. 23/06/10 16:18:23 INFO tool.CodeGenTool: Beginning code generation Sat Jun 10 16:18:23 CST 2023 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. 23/06/10 16:18:24 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM news AS t LIMIT 1 23/06/10 16:18:24 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM news AS t LIMIT 1 23/06/10 16:18:24 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /opt/programs/hadoop-2.7.6 注: /tmp/sqoop-root/compile/84ba419f00fa83cb5d16dba722729d01/news.java使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 23/06/10 16:18:25 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-root/compile/84ba419f00fa83cb5d16dba722729d01/news.jar 23/06/10 16:18:25 WARN manager.MySQLManager: It looks like you are importing from mysql. 23/06/10 16:18:25 WARN manager.MySQLManager: This transfer can be faster! Use the --direct 23/06/10 16:18:25 WARN manager.MySQLManager: option to exercise a MySQL-specific fast path. 23/06/10 16:18:25 INFO manager.MySQLManager: Setting zero DATETIME behavior to convertToNull (mysql) 23/06/10 16:18:25 ERROR tool.ImportTool: Import failed: No primary key could be found for table news. Please specify one with --split-by or perform a sequential import with '-m 1'.
06-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值