由于文章太长,所以分成多篇列出。技术完全是一己之作,观点也是一己之见,欢迎提建议(610693716@qq.com)。
文中涉及的一些关键术语解释如下表:
关键词 | 含义 |
引擎 | 特指本数据引擎,udbc |
单表操作 | 操作中只涉及到一个库表 |
xml sql | 指存放在xml文件中的sql语句 |
实体对象 | 普通的javabean,含get,set方法 |
数据操作 | 指与数据访问相关的增删改查统计等动作 |
目录结构
一、引擎渊源
二、快速入门
1.配置
a.使用已有数据源
b.使用引擎数据源
c.web.xml设置
d.添加jar包
2.使用
三、详细用法
1.单表操作
A.插入记录
B.查询
C.修改
D.删除
E.聚集运算
2.xml SQL操作
A.配置
B.简单操作
C.复杂操作
D.配置方式的关联查询
E.构建动态语句的标签
3.调用存储过程
A.oracle过程
B.db2过程
C.mysql过程
4.直接使用原生SQL
5.操作视图
四、高级主题
1.缓存
2.延迟加载
A.一般属性的延迟加载
B.复合属性的延迟加载
3.事务控制
A.不同粒度控制
B.乐观锁控制
4.高并发操作
A.插入
B.修改
C.精确插入
D.精确修改
E.精确删除
F.单次并举
5.大批量数据操作
A.插入
B.修改
C.删除
五、引擎特点总结
A.配置简单
B.调用简便
C.性能卓越
D.功能齐全
六、应用对比探讨
七、开发辅助
1.代码生成
2.不重启应用的操作
3.应用没启动时的操作
4.后台输出
5.表同步功能
6.其它
八、引擎方法总结
1.两类方法
2.两类返回结果
3.IDE工具下
4.注意点
九、实际应用
1. 应用之一(2012)
2. 应用之一(2013)
3. 应用之一(2014)
4. 应用之一(2015)
一、 引擎引擎渊源
数据的存取操作是软件系统的一个很频繁的基本动作。使用最基本的JDBC方式可以达到目的,虽然性能优异,但由于过于底层,开发效率低,并不是最佳选择,因此,业界出现许多的orm组件,如hibernate、ibatis、JPA、guzz等等,大大地方便了数据相关的操作。现在的状况是,每个组件有优 点,也有缺点,面对各种场景,并不能做到游刃有余,并且各组件在使用上都是有一定条件的,比如,要针对每个表进行映射配置,有的引擎API类也很多,不易用。
根据笔者所经过的多个项目(接手时一般都是已经上线运行或半成品了)来看,有用hibernate、ibatis、mybatis、jdbc的,也有在一个应用中合用两者的,最大的感受是重复、繁琐、低效、占资源、不灵活。
为了能更方便的进行数据层面的操作,笔者花了相当的精力,开发了一个通用的java数据引擎(取名UDBC,以下简称引擎),它是在jdbc的基础上进行的封装。它的最大特点就是简洁,高效。
UDBC引擎可以像hibernate那样以对象的方式操作数据,但没有后者各种形式的api,也没有hql之类的语句;引擎还吸取了ibatis的思想, 主要是为了应对较复杂的数据逻辑,但不必需要针对每个库表进行增删改的sql文件配置,当然也可以配置,完全在开发者控制。
通过合理的使用,代码中可以避开任何sql语句(hibernate则夹杂有hql,JPA也有自己的语句,spring jdbc会在代码中夹杂sql)。当然,根据业务场景的需要,也可以在代码中直接写sql,有时能起到事半功倍的效果。
可以根据实际情况,选择以下任一方式配置数据源。
b. 使用引擎数据源 (略)
c.web.xml设置 (略)
d.添加jar包
引擎的jar包约有170k,将其复制到应用的lib下即可。
经过以上几个步骤后,就可以开始使用数据引擎了。
假设库中创建了以下的学生表(以mysql为例,其它库类似):
CREATE TABLE student (
sid int(11) NOT NULL auto_increment,--主键
namevarchar(20) ,--姓名
birthdaydate,--生日
class_idint(11),--所在班级的id
ageint(11),--年龄
photoblob,--照片
PRIMARYKEY (sid)
) ;
数据引擎是设计用于web应用程序的,一般情况下,需要写相应的action或servlet,然后在里面调用引擎的类,如果直接在含main方法的java代码中调用是不行的。为了方便测试,在使用引擎数据源的情况下,不启动应用,也可以在含main方法的java类中调用,但需要在调用前执行以下方法:new UDBCIniter().init(),同时,如果是增删改操作,调用的最后要执行:DataCenter.ensureCommit()。在正常的应用情况下,第一句是不需要的,第二句也不是一定需要的,这点要注意。
//插入记录(有的字段没赋值) Map record=new HashMap(); record.put(“name”,“张三”); record.put(“class_id”, 1); record.put(“age”, 20); record.put(“birthday”,new java.util.Date()); int i=DataCenter.exeInsert(“student”, record); //执行插入
//查询name为张三的记录 Map param=new HashMap(); param.put(“name”,“张三”); Map student = DataCenter.getMap(“student”,param); String name=(String)student.get(“name”); int age=(Integer)student.get(“age”); |
上面是在没有实体对象的情况进行的操作,加入实体类:
publicclass Student {
private Integersid;
private Stringname;
private Integerage;
private Datebirthday;
private IntegerclassId;
privatebyte[]photo;
//get set方法省略
}
//插入记录 Student st=new Student(); st.setName(“李四”); st.setClassId(1); st.setAge(20); st.setBirthday(new java.util.Date()); int c=DataCenter.exeInsert(“student”, st); //执行插入 //返回值c表示插入的记录数
//查询name为李四的记录 Map param=new HashMap(); param.put(“name”,“李四”); Student student = DataCenter.getObject(“student”, param, Student.class); String name=student.getName(); int age=student.getAge();
|