db-unified更名为dbking,希望大家继续支持

wuyue-tiger 2014-06-07 08:06:41
dbking 0.6<br>
==========<br>

<br>
dbking是一款基于Java的数据库处理工具集,主要包括三项主要内容:<br>
1、为各类数据库提供统一的操作接口,尽最大可能保障各类数据库之间的移植性<br>
2、通过生成器创建BO类及DAO层代码<br>
3、为各类数据库之间的数据导入导出提供高效率的工具<br>
下面对这三项功能进行详细的介绍。<br>
<br>
1、为各类数据库提供统一的操作接口,尽最大可能保障各类数据库之间的移植性<br>
  这类工具已经很多了,比如大家耳熟能详的Hibernate、iBatis,包括Apache的DBUtils、Spring的JdbcTemplate。为什么我们还要推出db-unifier这样一个功能类似的东西呢?<br>
  这些工具的主要目的都是对JDBC进行包装,使开发人员能更容易的进行数据库开发,在代码的可读性、性能问题、移植问题上,这些工具都尽量做了权衡,达到了他们认为的完美。<br>
  dbking是鉴于我们的开发经验和考虑,权衡出来的数据库工具,其主要考虑的方向有以下几点:<br>
  1、简洁。所有的核心接口都在一个类里边,这个类是DbKing,代码不过1000行,却提供了大量的高质量功能方法,使用方法更是一目了然的简单。DbKing核心只依赖于JDBC驱动类,十分的轻量级,易于使用。<br>
  2、避免数据库连接泄漏的问题。数据库建立连接、关闭连接默认情况下都由db-unifier处理。有人会觉得这样影响效率,当然我们也提供自己手动控制连接的方法,只是默认情况下采用自动的方式。<br>
  3、统一的数据库操作类型。在dbking中,所有的数据库数据只有五种数据类型,String、Number(BigDecimal)、Timestamp、Clob(String)、Blob(byte[]),经过反复测试后,我们会例出各种数据库数据类型到这五种类型的映射表,当然我们也有少数的数据类型不能支持,有些是JDBC驱动的问题,有些是我们出于移植的考虑,有些数据库的数据类型在别的数据库里没有对应的数据类型支持,这样的数据类型只能不予支持,幸好这只是极少的一部分。<br>
  4、简化了很多复杂的数据库操作。比如:数据库分页,你不用再关心记录总数怎么取,不用考虑各种数据库之间的差异,最关键的是绝对的高效。再比如LOB字段的处理,可以直接通过增、删、改、查等接口处理,遇到较大的LOB,也可以用流的方式处理,避免内存溢出的问题。再比如获取数据库序列,我们采用了统一的算法,不同的数据库都使用同一个接口来获取序列,而且这个方法可以在多线程环境下使用,甚至是集群环境下都没有问题。<br>
  5、提供多种使用方式。可以单独使用,也可以结合Spring IoC框架使用。可以通过配置方式指定数据源,也可以通过硬代码方式指定数据源,甚至通过第三方获取数据库连接的方式都是可以的。
目前工具在Oracle 11g、Microsoft SQLServer 2012、MySQL 5.x、DB2 10.x、Sybase 15.x、PostgreSQL 9.x、Derby 10.x上通过了测试。<br>
<br>
2、通过生成器创建BO类及DAO层代码<br>
  这是一个配合dbking的代码生成器,生成基于dbking的DAO层类。有了这样类,可以简化开发代码,避免低级的书写错误,使开发者更专注于业务。另外,也可以在此基础上配合一定的代码来防止SQL注入的问题。<br>
<br>
3、为各类数据库之间的数据导入导出提供高效率的工具<br>
  异构数据库的导入导出一直是个大难题,一般的工具配置复杂,尤其是不支持LOB这样的大字段数据,我们的这个工具不仅配置简单,而且具有以下几个特点。<br>
  1、速度非常快,这个因为取决于系统环境,这个只有谁用谁知道了,至少我们是跟别的工具作过比较的。<br>
  2、支持LOB字段的导入导出。<br>
  3、自动侦测数据库表的主、从关系,保障数据库的导入不受外键约束的影响。<br>
  4、根据配置可以选择遇到重复数据时的处理方式————忽略或者中止。<br>

版本库地址:
https://github.com/wuyuetiger/dbking
https://code.csdn.net/tigeryu/dbking
https://git.oschina.net/db-unifier/dbking

中文文档下载地址:
https://code.csdn.net/tigeryu/dbking/tree/master/doc

JAR包下载地址:
https://code.csdn.net/tigeryu/dbking/tree/master/dist

有兴趣的JAVA开发攻城狮希望大家多支持,帮助我多做一些测试
...全文
311 19 打赏 收藏 举报
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyue-tiger 2014-06-12
  • 打赏
  • 举报
回复
引用 18 楼 shine333 的回复:
[quote=引用 16 楼 tigeryu 的回复:]给内存加锁不是好办法,如果是集群环境呢?
你漏看了东西了。我当然考虑了集群环境,我的意思是,
引用 13 楼 shine333 的回复:
还不如先内存加把锁(根据更新的seq名加锁,至少避免一个JVM内多个线程互相捣乱),再去尝试多次UPDATE来的快
先内存锁挡一下数据库然后再数据库做多次更新,至少可以避免一些无谓的开销。 你数据库多次更新,其实也是一种广义上的“锁”,显然,内存锁的代价小很多。 [/quote] 内存锁和数据库锁在一起很容易死锁
朗晴 2014-06-11
  • 打赏
  • 举报
回复
shine333 2014-06-11
  • 打赏
  • 举报
回复
引用 12 楼 tigeryu 的回复:
这只是个关系型数据库访问的工具,没必要搞PetStore这么复杂的应用例子吧。
指一套PetStore数据库的CRUD例子
引用 11 楼 tigeryu 的回复:
你可以试试我的sequence实现,或者直接用SequenceSample类进行一下多线程测试,高并发下的性能不会差。想象一下如果你在Oracle里创建10000个sequence会怎么样,移植怎么搞?
10000个seq,这个不太可能发生。而且,我特别介怀的是不能使用自增长。没有任何理由让用户禁用自增长啊。 举个不恰当的例子,人家MySQL MyISAM引擎,高并发下面,你的SEQ表能保证没问题吗? http://dev.mysql.com/doc/refman/5.5/en/internal-locking.html 再举个例子,你现在的写法: 尝试更新当前线程之前读到的x + 1,且更新条件中包括seq字段没有改变。如果更新不到,说明seq已经被其他人更新了。这确实能确保不会发生重复。但问题也来了,你下次尝试,使用既然x已经不存在了,我们试试看更新seq = x + 2 where ... and seq = x + 1; 话说,如果你更新不到那是因为高并发,几乎一瞬间,有N个人已经把你读到的东西更新了,你需要尝试N次更新(如前面MyISAM这种不适合的数据库/引擎)可能涉及N次锁。同一时间,你动作最慢的,可能慢了N拍,其他N个人里面,也有慢N/2拍的,也有慢1拍的...大家都在尝试无用的更新,可能有时候,还不如先内存加把锁(根据更新的seq名加锁,至少避免一个JVM内多个线程互相捣乱),再去尝试多次UPDATE来的快。 当然,这个只是理论上的,重点还是实践。
wuyue-tiger 2014-06-11
  • 打赏
  • 举报
回复
引用 10 楼 shine333 的回复:
[quote=引用 9 楼 tigeryu 的回复:] [quote=引用 7 楼 xiaopeipei2004 的回复:] 楼主写几个story吧,不知道这是干嘛用的。
提议很好[/quote] 做一个PetStore类的用例吧[/quote] 这只是个关系型数据库访问的工具,没必要搞PetStore这么复杂的应用例子吧。
wuyue-tiger 2014-06-11
  • 打赏
  • 举报
回复
引用 6 楼 shine333 的回复:
我又来找茬了。还是老问题,你还是没API。 没API,谁会真正深入使用?没人真正用,你现有的doc有何价值。 具体到doc,有几个问题。 1 “测试”一节: 1.1所有的数据库,请指明版本。因为相同厂商的不同数据库版本之间,是有差异的。 1.2麻烦再次确认下,smallint还有Time是对应Timestamp吗?为什么? 1.3bit, bool, boolean(如果数据库支持的话)为什么不是boolean/Boolean? 2 “数据库方面的移植能力”一节: too many don'ts 2.1 “请使用dbking推荐的数据类型,没有特殊理由,不要使用别的数据类型”为何只推荐用这几个,能说明下理由吗? 2.1.1比如,mysql datetime丢失了timestamp所具有时区信息这样细枝末节的理由,算不算“使用别的数据类型”的理由吗? 2.1.2 同1.1。因为有些版本较低的数据库,你的推荐字段可能完全不能接受,或者你的代码会出bug 2.2 这点完全不能接受:“不要使用数据库自带的自增值和序列。” 如以前的帖子所述,你的那个Sequence方法设计是有性能问题的,高并发下完全不能接受。
不愧为找茬达人,非常欢迎提意见。 数据库不同版本之间肯定有差异,一方面我在整理,另一方面也希望大家一起参与,把测试结果汇总起来,不断完善。 在下一个版本的文档中会明确测试的数据库版本,以避免不必要的麻烦。 smallint是Number类型,这是我写文档时疏忽了,不过Time还是归在Timestamp里,这个是为了简化操作,把很多类型都归并了,另一方面也出于移植的考虑,有些数据库并没有Time类型,bit、bool也是这个原因,Oracle数据库并没有对应的类型。 数据库移植是个复杂的问题,难免有些要求,胡乱一弄必定在移植时问题多多,有些也未必是技术上能控制的。 我们认为推荐的类型已经能够完成我们的所有业务了,没必要去尝试风险更大的类型,越少的数据类型移植风险越小。 对timestamp的时区问题我确实没有关注过,但象sqlserver这样的数据库timestamp是有特殊用法的,不方便移植。 数据库不同版本之间的兼容性我们会继续跟踪,有一个解决一个,相信这样的情况会越来越少,最新发现的DB2 10和DB2 9在nvarchar类型的区别已经针对此作了更新。 你可以试试我的sequence实现,或者直接用SequenceSample类进行一下多线程测试,高并发下的性能不会差。想象一下如果你在Oracle里创建10000个sequence会怎么样,移植怎么搞?
shine333 2014-06-11
  • 打赏
  • 举报
回复
引用 9 楼 tigeryu 的回复:
[quote=引用 7 楼 xiaopeipei2004 的回复:] 楼主写几个story吧,不知道这是干嘛用的。
提议很好[/quote] 做一个PetStore类的用例吧
wuyue-tiger 2014-06-11
  • 打赏
  • 举报
回复
引用 7 楼 xiaopeipei2004 的回复:
楼主写几个story吧,不知道这是干嘛用的。
提议很好
shine333 2014-06-11
  • 打赏
  • 举报
回复
引用 16 楼 tigeryu 的回复:
给内存加锁不是好办法,如果是集群环境呢?
你漏看了东西了。我当然考虑了集群环境,我的意思是,
引用 13 楼 shine333 的回复:
还不如先内存加把锁(根据更新的seq名加锁,至少避免一个JVM内多个线程互相捣乱),再去尝试多次UPDATE来的快
先内存锁挡一下数据库然后再数据库做多次更新,至少可以避免一些无谓的开销。 你数据库多次更新,其实也是一种广义上的“锁”,显然,内存锁的代价小很多。
wuyue-tiger 2014-06-11
  • 打赏
  • 举报
回复
看一下dbking生成的BO和DAO类

package org.sosostudio.dbking.sample.dao;
		
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.sosostudio.dbking.autocode.TimestampXmlAdapter;
import org.sosostudio.dbking.util.StringUtil;

/**
 * SYS_TEST
 *
 * @author generated by dbking autocode
 */
@SuppressWarnings("serial")
@Entity
@Table(name = "SYS_TEST")
public class SysTest implements Serializable {

	public static final String SYS_TEST = "SYS_TEST";

	public static final String ST_VALUE = "ST_VALUE";

	public static final String NM_VALUE = "NM_VALUE";

	public static final String DT_VALUE = "DT_VALUE";

	@Id
	@Column(name = "ST_VALUE")
	private String stValue;

	@Column(name = "NM_VALUE")
	private BigDecimal nmValue;

	@Column(name = "DT_VALUE")
	private Timestamp dtValue;
	

	public String getStValue() {
		return stValue;
	}

	public void setStValue(String stValue) {
		this.stValue = stValue;
	}

	public BigDecimal getNmValue() {
		return nmValue;
	}

	public void setNmValue(BigDecimal nmValue) {
		this.nmValue = nmValue;
	}

	@XmlJavaTypeAdapter(TimestampXmlAdapter.class)
	public Timestamp getDtValue() {
		return dtValue;
	}

	public void setDtValue(Timestamp dtValue) {
		this.dtValue = dtValue;
	}
	
	public void truncateString() {
		stValue = StringUtil.truncate(stValue, 50);
	}

}

package org.sosostudio.dbking.sample.dao;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.sosostudio.dbking.DbKing;
import org.sosostudio.dbking.Row;
import org.sosostudio.dbking.RowList;
import org.sosostudio.dbking.autocode.PageList;
import org.sosostudio.dbking.oom.DeleteSql;
import org.sosostudio.dbking.oom.ExtraClause;
import org.sosostudio.dbking.oom.InsertKeyValueClause;
import org.sosostudio.dbking.oom.InsertSql;
import org.sosostudio.dbking.oom.LogicalOp;
import org.sosostudio.dbking.oom.OrderByClause;
import org.sosostudio.dbking.oom.RelationOp;
import org.sosostudio.dbking.oom.SelectSql;
import org.sosostudio.dbking.oom.SetOp;
import org.sosostudio.dbking.oom.UpdateKeyValueClause;
import org.sosostudio.dbking.oom.UpdateSql;
import org.sosostudio.dbking.oom.WhereClause;

/**
 * SYS_TEST
 * 
 * @author generated by dbking autocode
 */
public class SysTestDao {

	private DbKing dbKing;

	public SysTestDao() {
		dbKing = new DbKing();
	}

	public SysTestDao(DbKing dbKing) {
		this.dbKing = dbKing;
	}

	public int add(SysTest sysTest) {
		sysTest.truncateString();
		InsertSql insertSql = new InsertSql().setTableName(SysTest.SYS_TEST)
				.setInsertKeyValueClause(
						new InsertKeyValueClause()
								.addStringClause(SysTest.ST_VALUE,
										sysTest.getStValue())
								.addNumberClause(SysTest.NM_VALUE,
										sysTest.getNmValue())
								.addTimestampClause(SysTest.DT_VALUE,
										sysTest.getDtValue()));
		return dbKing.execute(insertSql);
	}

	public int update(SysTest sysTest) {
		sysTest.truncateString();
		UpdateSql updateSql = new UpdateSql()
				.setTableName(SysTest.SYS_TEST)
				.setUpdateKeyValueClause(
						new UpdateKeyValueClause()
								.addStringClause(SysTest.ST_VALUE,
										sysTest.getStValue())
								.addNumberClause(SysTest.NM_VALUE,
										sysTest.getNmValue())
								.addTimestampClause(SysTest.DT_VALUE,
										sysTest.getDtValue()))
				.setWhereClause(
						new WhereClause(LogicalOp.AND).addStringClause(
								SysTest.ST_VALUE, RelationOp.EQUAL,
								sysTest.getStValue()));
		return dbKing.execute(updateSql);
	}

	public int update(UpdateKeyValueClause updateKeyValueClause,
			WhereClause whereClause) {
		UpdateSql updateSql = new UpdateSql().setTableName(SysTest.SYS_TEST)
				.setUpdateKeyValueClause(updateKeyValueClause)
				.setWhereClause(whereClause);
		return dbKing.execute(updateSql);
	}

	public int delete(WhereClause whereClause) {
		DeleteSql deleteSql = new DeleteSql().setTableName(SysTest.SYS_TEST)
				.setWhereClause(whereClause);
		return dbKing.execute(deleteSql);
	}

	public int delete(String stValue) {
		DeleteSql deleteSql = new DeleteSql().setTableName(SysTest.SYS_TEST)
				.setWhereClause(
						new WhereClause(LogicalOp.AND).addStringClause(
								SysTest.ST_VALUE, RelationOp.EQUAL, stValue));
		return dbKing.execute(deleteSql);
	}

	public int delete(Collection<String> stValueCollection) {
		DeleteSql deleteSql = new DeleteSql().setTableName(SysTest.SYS_TEST)
				.setWhereClause(
						new WhereClause(LogicalOp.AND).addStringClause(
								SysTest.ST_VALUE, SetOp.IN, stValueCollection));
		return dbKing.execute(deleteSql);
	}

	public SysTest get(String stValue) {
		WhereClause whereClause = new WhereClause(LogicalOp.AND)
				.addStringClause(SysTest.ST_VALUE, RelationOp.EQUAL, stValue);
		List<SysTest> list = query(whereClause, null, null);
		if (list.size() > 0) {
			return list.get(0);
		} else {
			return null;
		}
	}

	public PageList<SysTest> query(WhereClause whereClause,
			ExtraClause extraClause, OrderByClause orderByClause, int pageSize,
			int pageNumber) {
		SelectSql selectSql = new SelectSql().setTableName(SysTest.SYS_TEST)
				.setColumns("*").setWhereClause(whereClause)
				.setExtraClause(extraClause).setOrderByClause(orderByClause);
		RowList rowList = dbKing.query(selectSql, pageSize, pageNumber);
		PageList<SysTest> pageList = new PageList<SysTest>(
				rowList.getPageSize(), rowList.getPageNumber(),
				rowList.getTotalRowCount());
		for (Row row : rowList) {
			SysTest sysTest = new SysTest();
			sysTest.setStValue(row.getString(SysTest.ST_VALUE));
			sysTest.setNmValue(row.getNumber(SysTest.NM_VALUE));
			sysTest.setDtValue(row.getTimestamp(SysTest.DT_VALUE));
			pageList.add(sysTest);
		}
		return pageList;
	}

	public List<SysTest> query(WhereClause whereClause,
			ExtraClause extraClause, OrderByClause orderByClause) {
		SelectSql selectSql = new SelectSql().setTableName(SysTest.SYS_TEST)
				.setColumns("*").setWhereClause(whereClause)
				.setExtraClause(extraClause).setOrderByClause(orderByClause);
		RowList rowList = dbKing.query(selectSql);
		List<SysTest> list = new ArrayList<SysTest>();
		for (Row row : rowList) {
			SysTest sysTest = new SysTest();
			sysTest.setStValue(row.getString(SysTest.ST_VALUE));
			sysTest.setNmValue(row.getNumber(SysTest.NM_VALUE));
			sysTest.setDtValue(row.getTimestamp(SysTest.DT_VALUE));
			list.add(sysTest);
		}
		return list;
	}

}
wuyue-tiger 2014-06-11
  • 打赏
  • 举报
回复
引用 13 楼 shine333 的回复:
[quote=引用 12 楼 tigeryu 的回复:] 这只是个关系型数据库访问的工具,没必要搞PetStore这么复杂的应用例子吧。
指一套PetStore数据库的CRUD例子
引用 11 楼 tigeryu 的回复:
你可以试试我的sequence实现,或者直接用SequenceSample类进行一下多线程测试,高并发下的性能不会差。想象一下如果你在Oracle里创建10000个sequence会怎么样,移植怎么搞?
10000个seq,这个不太可能发生。而且,我特别介怀的是不能使用自增长。没有任何理由让用户禁用自增长啊。 举个不恰当的例子,人家MySQL MyISAM引擎,高并发下面,你的SEQ表能保证没问题吗? http://dev.mysql.com/doc/refman/5.5/en/internal-locking.html 再举个例子,你现在的写法: 尝试更新当前线程之前读到的x + 1,且更新条件中包括seq字段没有改变。如果更新不到,说明seq已经被其他人更新了。这确实能确保不会发生重复。但问题也来了,你下次尝试,使用既然x已经不存在了,我们试试看更新seq = x + 2 where ... and seq = x + 1; 话说,如果你更新不到那是因为高并发,几乎一瞬间,有N个人已经把你读到的东西更新了,你需要尝试N次更新(如前面MyISAM这种不适合的数据库/引擎)可能涉及N次锁。同一时间,你动作最慢的,可能慢了N拍,其他N个人里面,也有慢N/2拍的,也有慢1拍的...大家都在尝试无用的更新,可能有时候,还不如先内存加把锁(根据更新的seq名加锁,至少避免一个JVM内多个线程互相捣乱),再去尝试多次UPDATE来的快。 当然,这个只是理论上的,重点还是实践。[/quote] 看来你对MySQL认识比较深,我不否认这个sequece实现在超高并发下一定存在性能问题,但那是每秒上百次的操作级的,这样的系统肯定在架构上也有更多的考虑,但锁的问题并不存在,我也会进一步想想是否有更好的办法来提高并发时的效率。给内存加锁不是好办法,如果是集群环境呢?
引用 15 楼 shine333 的回复:
如果用户真的需要在Java这里做这样的转换,显然,这个是开心你一人,辛苦千万家——如果有那么多用户的话
这个可以考虑加上,内部只有五种类型,但对外的接口可以加一堆,方便使用者
引用 15 楼 shine333 的回复:
还有前面说的数据库默认类型的问题。我只是在抛个例子,当然你也没法解决,只是提醒注意。关于MySQL版本的。我知道MySQL 5.0.3以下,DECIMAL/NUMERIC是基于文本的,有严重性能问题。还是MySQL,字符串后面的长度,到底是字节还是字符,也是变更过的。其他数据库也有这样比较恶心的变更。所以如果涉及到自动生成一些东西的时候,要当心。
我确实也没用过这么低版本的MySQL,所以这种问题确实要集大家的力量,逐步改进。
兔子托尼啊 2014-06-11
  • 打赏
  • 举报
回复
开源不容易啊。
grapepaul 2014-06-11
  • 打赏
  • 举报
回复
楼主写几个story吧,不知道这是干嘛用的。
shine333 2014-06-11
  • 打赏
  • 举报
回复
我又来找茬了。还是老问题,你还是没API。 没API,谁会真正深入使用?没人真正用,你现有的doc有何价值。 具体到doc,有几个问题。 1 “测试”一节: 1.1所有的数据库,请指明版本。因为相同厂商的不同数据库版本之间,是有差异的。 1.2麻烦再次确认下,smallint还有Time是对应Timestamp吗?为什么? 1.3bit, bool, boolean(如果数据库支持的话)为什么不是boolean/Boolean? 2 “数据库方面的移植能力”一节: too many don'ts 2.1 “请使用dbking推荐的数据类型,没有特殊理由,不要使用别的数据类型”为何只推荐用这几个,能说明下理由吗? 2.1.1比如,mysql datetime丢失了timestamp所具有时区信息这样细枝末节的理由,算不算“使用别的数据类型”的理由吗? 2.1.2 同1.1。因为有些版本较低的数据库,你的推荐字段可能完全不能接受,或者你的代码会出bug 2.2 这点完全不能接受:“不要使用数据库自带的自增值和序列。” 如以前的帖子所述,你的那个Sequence方法设计是有性能问题的,高并发下完全不能接受。
shine333 2014-06-11
  • 打赏
  • 举报
回复
引用 11 楼 tigeryu 的回复:
有些数据库并没有Time类型,bit、bool也是这个原因
这个没理解。 如果我手头就是Time类型的Java对象,难道需要转成new Timestamp(time.getTime())? Java这里一个boolean还要转成int/Integer? 看接口,貌似没这个限制。
引用 11 楼 tigeryu 的回复:
这个是为了简化操作,把很多类型都归并了
如果用户真的需要在Java这里做这样的转换,显然,这个是开心你一人,辛苦千万家——如果有那么多用户的话 还有前面说的数据库默认类型的问题。我只是在抛个例子,当然你也没法解决,只是提醒注意。关于MySQL版本的。我知道MySQL 5.0.3以下,DECIMAL/NUMERIC是基于文本的,有严重性能问题。还是MySQL,字符串后面的长度,到底是字节还是字符,也是变更过的。其他数据库也有这样比较恶心的变更。所以如果涉及到自动生成一些东西的时候,要当心。
wuyue-tiger 2014-06-10
  • 打赏
  • 举报
回复
最新的Hello World 代码

package org.sosostudio.dbking.sample;

import java.math.BigDecimal;
import java.util.List;

import org.sosostudio.dbking.Column;
import org.sosostudio.dbking.ColumnType;
import org.sosostudio.dbking.DbKing;
import org.sosostudio.dbking.Row;
import org.sosostudio.dbking.RowList;
import org.sosostudio.dbking.Table;
import org.sosostudio.dbking.oom.Direction;
import org.sosostudio.dbking.oom.InsertKeyValueClause;
import org.sosostudio.dbking.oom.InsertSql;
import org.sosostudio.dbking.oom.OrderByClause;
import org.sosostudio.dbking.oom.SelectSql;

public class HelloWorldSample {

	private static final String TABLE_NAME = "DBKING_SAMPLE";

	public static void main(String[] args) {
		DbKing dbKing = new DbKing();
		dbKing.getSequenceNextValue("test");
		List<Table> tableList = dbKing.getTableList();
		for (Table table : tableList) {
			System.out.println(table);
		}
		dbKing.createTable(new Table(TABLE_NAME).addColumn(
				new Column("NM_VALUE", ColumnType.NUMBER).setPrimaryKey(true))
				.addColumn(new Column("ST_VALUE", ColumnType.STRING)));
		for (int i = 0; i < 20; i++) {
			dbKing.executeInsertSql(new InsertSql().setTableName(TABLE_NAME)
					.setInsertKeyValueClause(
							new InsertKeyValueClause().addNumberClause(
									"NM_VALUE", new BigDecimal(i + 1))
									.addStringClause("ST_VALUE",
											String.valueOf(i + 1))));
		}
		RowList rowList = dbKing.executeSelectSql(
				new SelectSql()
						.setTableName(TABLE_NAME)
						.setColumns("*")
						.setOrderByClause(
								new OrderByClause().addOrder("NM_VALUE",
										Direction.ASC)), 3, 2);
		for (Row row : rowList) {
			String value = row.getString("ST_VALUE");
			System.out.println(value);
		}
		dbKing.dropTable(TABLE_NAME);
	}

}

wuyue-tiger 2014-06-07
  • 打赏
  • 举报
回复
引用 1 楼 rumlee 的回复:
听着好像挺不错,下一个看看。没有说到orm,难道是不支持orm,只是jdbc封装? 先看看再说。
dbking只提供简单的单表和单视图生成BO和DAO类的方法,谈不上orm,有点象apache的DBUtils,但是更注重各数据库的兼容问题的解决方法。
S117 2014-06-07
  • 打赏
  • 举报
回复
不错,抽空去多了解了解
rumlee 2014-06-07
  • 打赏
  • 举报
回复
听着好像挺不错,下一个看看。没有说到orm,难道是不支持orm,只是jdbc封装? 先看看再说。
发帖
非技术区

2.3w+

社区成员

Java 非技术区
社区管理员
  • 非技术区社区
加入社区
帖子事件
创建了帖子
2014-06-07 08:06
社区公告
暂无公告