泛微OAe9-后端二开常见数据库操作
文章目录
一、RecordSet
RecordSet 适用于操作 OA 自己的库。OA 数据库可查看配置文件:/WEB-INF/prop/weaver.properties
RecordSet 特点:
- 1、不带事务,参数可以进行预编译,安全性高。
- 2、通过连接池操作数据库,性能高,断网重连。
- 3、不会抛出异常,需要去日志文件中查看 log文件。
1 RecordSet 操作OA本身的表
代码演示:
RecordSet rs = new RecordSet();
rs.execute("insert into test_xizhilang(name,age)values('1','12')"); //新增数据
rs.executeSql("insert into test_xizhilang(name,age)values('1','2')");
rs.execute("update test_xizhilang set name='张三' where id=1"); //修改数据
//删除数据
rs.execute("delete test_xizhilang where id=1");
//查询数据
rs.execute("select * from hrmresource ");
while(rs.next()){
String id=rs.getString("id");//===rs.getString("id");
String loginid=rs.getString("loginid");
String lastname=rs.getString("lastname");
}
// 数据库操作完成
对于预编译,参数可以直接写在后面,安全性高,代码演示;
RecordSet rs = new RecordSet();
rs.executeQuery("select * from hrmresource where id=?", "49");
if(rs.next()){
System.out.println(rs.getString("lastname"));
}
rs.executeUpdate("insert into test_xizhilang(name,age)values(?,?)", "11","22");
2 RecordSet 操作OA 本身的存储过程
RecordSet 操作存储过程特点:
- 1、 Util.getSeparator();分隔传个存储过程的多个参数。
- 2、泛微API要求OA存储过程必须带有固定的参数。
- 3、不会抛出异常,需要去日志文件中查看。
RecordSet rs = new RecordSet();
char flag = Util.getSeparator();
String ProcPara = "王五" + flag + "18"; //拼接2个参数
rs.executeProc("存储过程的名称", ProcPara);
if(rs.next()){
//接收存储过程的返回值
System.out.println("接收的参数="+rs.getString(1));
}
二、RecordSetTrans
RecordSetTrans 也是用于操作 OA 本身的数据库。OA 数据库可查看配置文件:/WEB-INF/prop/weaver.properties
RecordSetTrans 特点:
- 1、支持事物处理,支持原子性操作。也是 RecordSetTrans 最大的特点
- 2、不会抛出异常,需要去日志文件中查看。
代码演示:
RecordSetTrans rst = new RecordSetTrans();
try {
rst.setAutoCommit(false); //开启事务
rst.executeSql("delete from test_xizhilang where id=5");
rst.executeSql("delete from test_xizhilang where id=4");
String s = null;
s.toCharArray();
rst.commit(); // 提交事务
} catch (Exception e) {
e.printStackTrace();
rst.rollback(); // 执行失败,回滚数据
}
三、RecordSetDataSource
RecordSetDataSource 用于操作OA集成的第三方系统的数据库:后端 - > 集成中心 -> 数据源设置。RecordSetDataSource也可以用于操作OA本身的数据库,RecordSetDataSource rds = new RecordSetDataSource(),括号内不传参默认就是OA本身的数据库。
RecordSetDataSource特点:
- 1、直接操作第三方数据,不支持事务;
- 2、不会抛出异常,需要去日志文件中查看;
代码演示:
String sql = "select id, lastname, loginid, sex from hrmresource";
RecordSetDataSource rs2 = new RecordSetDataSource("数据源名称(建议英文)");
rs2.execute(sql);
while(rs2.next()){
//下标从1开始
String hehe = rs2.getString(4);
System.out.println("hehe=" + hehe);
}
rs2.getString():获取查询的数据,有两种方式:
- 1、rs2.getString(“列名”):获取指定的列。
- 2、rs2.getString(数字):数字下标从1开始,获取指定下标的列。如上面代码中,rs2.getString(4) 获取 sex 的值。
数据源名称,建议英文,不要用中文。
四、原生 jdbc
操作OA本身的数据库,事务操作有 RecordSetTrans,如果要操作第三方系统的库,也需要事务操作,可采用原生 jdbc 的方法。
建立连接:
public static Connection getConnection() {
String datasourceName = "x"; // x对应后端->集成中心->数据源设置->数据源名称
Connection conn = null;
try {
DataSource datasource = (DataSource) StaticObj.getServiceByFullname("datasource."+datasourceName, DataSource.class); //获取数据源的信息
conn = datasource.getConnection(); // 和数据源取得连接
} catch (Exception e) {
e.printStackTrace();
logger.error(e);
}
return conn;
}
开启事务
Connection conn = null;
PreparedStatement ps = null;
try {
String sql2 = "";
conn = DBUtil.getConnection();
conn.setAutoCommit(false); // 手动开启事务
for (Map<String, Object> tab : tableData) {
sql2 = "INSERT INTO SAP_KUNNR_DATA(KUNNR, TELF1, KTOKD, SMTP_ADDR, REGIO, STRAS, LOEVM, LAND1, ORT01, KUKLA, NAME1) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement statement = conn.prepareStatement(sql2);
statement.setString(1, tab.get("KUNNR").toString());
statement.setString(2, tab.get("TELF1").toString());
statement.setString(3, tab.get("KTOKD").toString());
statement.setString(4, tab.get("SMTP_ADDR").toString());
statement.setString(5, tab.get("REGIO").toString());
statement.setString(6, tab.get("STRAS").toString());
statement.setString(7, tab.get("LOEVM").toString());
statement.setString(8, tab.get("LAND1").toString());
statement.setString(9, tab.get("ORT01").toString());
statement.setString(10, tab.get("KUKLA").toString());
statement.setString(11, tab.get("NAME1").toString());
statement.executeUpdate();
}
conn.commit();
} catch (SQLException e) {
try {
conn.rollback(); // 如果失败就回滚事务,默认自动回滚
} catch (SQLException ex) {
ex.printStackTrace();
logger.error("出错了:"+ex.getMessage());
}
e.printStackTrace();
}