OpenJWeb快速开发平台
数据库API二次开发手册
一前言
OpenJWeb平台的数据库API非常简洁、快速、高效。当用户安装好OpenJWeb环境以后,即使未获取OpenJWeb产品的注册码,也可以使用OpenJWeb的数据库API开发增删改查代码。
OpenJWeb的数据库API同时支持基于Hibernate模式和纯Sql模式,采用Spring的声明式事务管理,开发者不需要编写连接数据库、断开数据库、commit、rollback等代码,支持异常回滚。
二、基于Hibernate模式的数据库API
2.1 在JSP页面中需导入的类
<%@ pageimport="org.openjweb.core.service.*"%>
<%@ pageimport="org.openjweb.core.entity.*"%>
<%@ page import="org.openjweb.core.util.*"%>
<%@ page import="java.util.*"%>
注:在Java类中改为
import org.openjweb.core.service.*;
import org.openjweb.core.entity.*;
import org.openjweb.core.util.*;
import java.util.*;
2.2 增加及修改记录的实现
//首先声明一个Spring Bean,此Bean是数据库增删改查操作的关键组件
IDBSupportService service =(IDBSupportService)ServiceLocator.getBean("IDBSupportService3");// IDBSupportService3是openjweb中已配置好的数据库Bean
//下面新增一个用户表记录(comm._user表,对应org.openjweb.core.entity.CommUser实体类)
CommUser userEntity = new CommUser();
userEntity.setPkId(service.getSerial().toString());//生成一个数字格式的唯一值
userEntity.setUserId(service.getSerial());//一个长整型的唯一主键
userEntity.setRowId(StringUtil.getUUID());//生成一个32位的UUID字符串
userEntity.setLoginId("testopenjweb");//设置一个登陆帐号
userEntity.setUsername("张三");//设置用户名称
userEntity.setPassword("123456");//设置用户口令
userEntity.setUserEmail("testopenjweb@126.com");//设置用户的邮箱
service.saveOrUpdate(userEntity);//将新的用户信息保存到数据库中
执行以上操作后,数据库表comm_user中会新增一条记录,下面还可以取出这条记录修改保存(saveOrUpdate方法是同时适用于新增、保存的,如果数据库中存在主键相同的记录,用saveOrUpdate会执行修改操作,否则会执行新增操作)。
下面可通过查询语句查出刚才的记录,并修改姓名后保存:
CommUserqueryEnt = null;
try
{
queryEnt =(CommUser)service.findSingleValueByHql("from CommUser whereloginId='testopenjweb'"); //需确保只有一个查询结果
queryEnt.setUsername("张三111");
service.saveOrUpdate(queryEnt); //修改名字后,保存到数据库
}
catch(Exceptionex)
{
System.out.println("未找到用户!");
}
2.3 删除记录
下面删除上面增加的记录:
service.deleteById("org.openjweb.core.entity.CommUser","loginId","testopenjweb");
参数说明:
(1) 第一个参数为OpenJWeb中的实体类名,在Hibernate的映射文件中,此实体类对应comm_user表。
(2) 第二个参数指实体类中的一个字段,在Hibernate 映射文件中,loginId字段对应数据库表字段login_id
(3) 第三个参数指login_id字段匹配的值,即删除login_id=’testopenjweb’的记录。
2.4 查询所有记录
一次查询所有记录的情况比较少见,OpenJWeb通过findAll查询所有记录(不含查询条件);
代码如下:
List userList =service.findAll("org.openjweb.core.entity.CommUser");
System.out.println(userList.size());
2.5 条件查询
List queryUserList =service.findByHqlQuery("from CommUser where username is not null");
System.out.println(queryUserList.size());
说明:条件查询以from开头,类名可不带全路径名。
findListByFieldValue方法可用此方法替代。
2.6 带select的hql语句
//查询第一页,每页10行
List colList =service.findColPage("select loginId from CommUser where password is notnull",1,10);
if(colList!=null&&colList.size()>0)
{
for(inti=0;i<colList.size();i++)
{
Objectobj = colList.get(i);
System.out.println(obj.toString());
}
}
说明:目前仅支持select中带一个字段,此方法用于查询单列结果集。
2.7 分页查询
findPage方法用于分页查询。代码如下:List list =service.findPage("org.openjweb.core.entity.CommUser", " whereloginId is not null order by loginId desc", 1,10);
参数说明:
(1) 第一个参数为实体类名
(2) 第二个参数为查询条件,可带order by, where 前注意加一个空格
(3) 第三个参数指需要查询第几页
(4) 第四个参数设置每页的行数
2.8查询单一记录
查询单一记录可使用下面的语句:
String sDate =service.findSingleValueByHql("select max(createDt) fromCommUser").toString();
System.out.println(sDate);
查询结果可以是单一字符串结果、数字或者单一实体类。见下面的代码:
CommUser singleEnt =(CommUser)service.findSingleValueByHql("from CommUser whereloginId='admin'");
System.out.println(singleEnt.getUsername());
2.9 获取一个唯一数字
获取一个针对当前Web应用的唯一数字,代码如下:
Long serialNo = service.getSerial();
System.out.println(serialNo);
三、基于纯Sql的API
基于纯Sql的API接口封装了Spring的getJdbcTemplate()方法。
示例:
IDBSupportService service =(IDBSupportService)ServiceLocator.getBean("IDBSupportService3");
3.1 删除记录
service.getJdbcTemplate().execute("deletefrom comm_user where login_id='abao888'");
3.2 增加记录
service.getJdbcTemplate().execute("insertinto comm_user values(....)"); //不写具体sql字段了
3.3 修改记录
service.getJdbcTemplate().execute("updatecomm_user set …."); //不写具体sql字段了
3.4 查询记录
l 3.4.1 查询字符串
String s1 = service.getJdbcTemplate().queryForObject("selectusername from comm_user where login_id='admin'",String.class).toString();
System.out.println(s1);
注意如果查询结果为空会报异常,所以上面的代码注意加try catch语句
l 3.4.2 查询数字
Object obj =service.getJdbcTemplate().queryForObject("select sum(order_amt) fromb2c_order_head where login_id is not null",Double.class);
System.out.println(obj.toString());
l 3.4.3 查询列表-Map
List sqlList =service.getJdbcTemplate().queryForList("select login_id,username fromcomm_user");
if(sqlList!=null&&sqlList.size()>0)
{
for(inti=0;i<sqlList.size();i++)
{
Mapmap = (Map)sqlList.get(i);
StringloginId = (String)map.get("LOGIN_ID");
System.out.println(loginId);
Stringusername = (String)map.get("USERNAME");
System.out.println(username);
}
}
说明:map.get(“参数名”)中的参数对应select语句的字段名或别名,对于oracle一般为大写,非oracle数据库为小写,例如对于mysql,应写成map.get(“login_id”);
l 3.4.4 查询列表-Hashtable
如果需要用Hashtable处理结果集,可使用HashtableRowMapper()将结果集转换为Hashtable,见下面代码:
System.out.println("使用Hashtable:");
List sqlList1 =service.getJdbcTemplate().query("select login_id,username,password fromcomm_user",new HashtableRowMapper());
if(sqlList1!=null&&sqlList1.size()>0)
{
for(int i=0;i<sqlList1.size();i++)
{
Hashtable hst =(Hashtable)sqlList1.get(i);
String loginId = (String)hst.get("LOGIN_ID");
System.out.println(loginId);
String username =(String)hst.get("USERNAME");
System.out.println(username);
String password =(String)hst.get("PASSWORD");
System.out.println(password);
}
}
注意:
(1) 返回结果的空值处理
(2) 对于oracle,Hashtable中的列名是大写,其他数据库一般是小写。
l 3.4.5 使用OpenJWeb的CodeNameBean
如果返回的结果集是名值对,可使用OpenJWeb的CodeNameBeanRowMapper,见下面代码:
System.out.println("使用CodeNameBean:");
List dictList = (ArrayList)service.getJdbcTemplate().query("selectlogin_id,username fromcomm_user",new CodeNameBeanRowMapper());
if(dictList!=null&&dictList.size()>0)
{
for(inti=0;i<dictList.size();i++)
{
Stringcode="";
Stringname="";
code =((CodeNameBean)dictList.get(i)).getCode().toString();
name = ((CodeNameBean)dictList.get(i)).getName().toString();
System.out.println(code+"---"+name);
}
}
四、基于声明式事务编程
OpenJWeb使用Spring的声明式事务,所以OpenJWeb的数据库API中没有连接数据库、断开数据库、commit、rollback等代码。OpenJWeb中的业务逻辑组件都配置了事务拦截器,所以在业务逻辑接口的实现类中编写的代码自动支持数据库事务,如果执行出现异常,会自动回滚事务。
OpenJWeb配置业务逻辑组件的xml为D:\project\openjweb\src\java\core-service-demo.xml,编译代码后,此文件会复制到WEB-INF\classes目录。
以订单业务对象为例,下面是关于订单处理的业务逻辑组件配置:
<beanid="IB2cOrderHeadService" parent="txProxyTemplate1">
<propertyname="target">
<bean class="com.openjweb.b2c.service.impl.B2cOrderHeadServiceImpl">
<propertyname="dbService" value="IDBSupportService3"/>
</bean>
</property>
</bean>
组件IB2cOrderHeadService配置了事务拦截器,即txProxyTemplate1,对应的业务逻辑接口为com.openjweb.b2c.service.IB2cOrderHeadService,实现类com.openjweb.b2c.service.impl.B2cOrderHeadServiceImpl。
调用订单业务逻辑的过程:
//首先声明业务逻辑组件
IB2cOrderHeadService bizService =(IB2cOrderHeadService)ServiceLocator.getBean("IB2cOrderHeadService");
//构造订单主表记录MasterEnt,子表记录DetailEnts等,然后调用业务逻辑接口的saveOrder方法,因为IB2cOrderHeadService配置了事务拦截器,所以其实现类B2cOrderHeadServiceImpl.java类中的saveOrder支持事务处理,此方法实现订单主表、明细表插入和扣减会员的累计消费额变更,这些操作都在一个数据库事务中处理,如果saveOrder中出现异常,整个事务回滚。
bizService.saveOrder(masterEnt,detailEnts, currencyType, useType, isCheckBalance, request);
下面是B2cOrderHeadServiceImpl的代码,供开发参考:
package com.openjweb.b2c.service.impl;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.openjweb.core.entity.CommUser;
import org.openjweb.core.entity.CommUserBalance;
import org.openjweb.core.service.IDBSupportService;
import org.openjweb.core.service.ServiceLocator;
importorg.springframework.security.context.SecurityContextHolder;
import org.openjweb.core.service.BaseMasterDetailService;
import org.openjweb.core.util.StringUtil;
import com.openjweb.b2c.entity.B2cOrderDetail;
import com.openjweb.b2c.entity.B2cOrderHead;
import com.openjweb.b2c.service.IB2cOrderHeadService;
publicclass B2cOrderHeadServiceImpl extends BaseMasterDetailService implementsIB2cOrderHeadService
{
privatestaticfinal Logger logger = Logger.getLogger(B2cOrderHeadServiceImpl.class);
publicvoid saveOrder(B2cOrderHeadmasterEnt, List<B2cOrderDetail> detailEnts, String currencyType,StringuseType,String isCheckBalance,HttpServletRequest request) throws Exception
{
logger.info("开始存储订单..........");
IDBSupportService service = (IDBSupportService)ServiceLocator.getBean("IDBSupportService3");
if(detailEnts!=null&&detailEnts.size()>0)
{
for(int i=0;i<detailEnts.size();i++)
{
B2cOrderDetail detailEnt = (B2cOrderDetail)detailEnts.get(i);
service.saveOrUpdate(detailEnt);
}
masterEnt.setCreateDt(StringUtil.getCurrentDateTime());
masterEnt.setUpdateDt(masterEnt.getUpdateDt());
masterEnt.setCreateUid(masterEnt.getLoginId());
masterEnt.setUpdateUid(masterEnt.getUpdateUid());
masterEnt.setOrderDt(StringUtil.getCurrentDateTime());
if(masterEnt.getReceiverName()==null||masterEnt.getReceiverName().trim().length()==0)
{
//materEnt.
}
service.saveOrUpdate(masterEnt);
if("Y".equals(isCheckBalance))
{
//如果考虑网站资金余额
CommUserBalance ent =(CommUserBalance)service.findSingleValueByHql("from CommUserBalance where loginId='"
+masterEnt.getLoginId()+"' and useType='"+useType+"' and currencyType='"+currencyType+"'");
DoublebalanceAmt = ent.getBalanceAmt()==null?new Double(0):ent.getBalanceAmt();
DoubleconsumeAmt = ent.getSumUseAmt()==null?new Double(0):ent.getSumUseAmt();
//
ent.setBalanceAmt(balanceAmt - masterEnt.getOrderAmt());//减少余额
ent.setSumUseAmt(consumeAmt+masterEnt.getOrderAmt());//增加累计消费额
service.saveOrUpdate(ent);
}
}
logger.info("订单存储完毕................");
}
}
OpenJWeb开发组
联系人:王先生 18600510596
QQ:29803446
Email:29803446@163.com