数据库操作
# 数据库操作
# java代码操作数据库
java代码中操作数据库,有公司封装好的类,当然也可以使用mybatis等orm框架,但是使用公司封装好的类更加契合ecology系统,其中有一些加密解密以及一些多语言的解析信息,所以这里推荐使用公司封装的类,本文档也只对公司封装的类进行讲解
# 基础介绍
操作数据的类
RecordSet
内部封装了jdbc
,其中操作数据库方式与jdbc
十分类似
weaver.conn.RecordSetTrans
1
带有事务的类
RecordSetTrans
与RecordSet
一致,但是内部做了对事务的处理,并不会自动提交操作,而是需要手动提交事务
# 查询
# 基础查询
在进行二开时,使用最多的sql操作应该就是查询了,下面使用代码来看下如何在代码中查询数据库数据
我们需要查询人力资源表中的数据,并且展示用户的id和他的用户名,我们可以将代码写成如下
@Test
public void queryDatabase(){
// 创建recordset对象
RecordSet rs = new RecordSet();
// 执行数据sql查询操作
rs.executeQuery("select * from hrmresource");
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
//System.out.println("id: " + rs.getInt(1));
System.out.println("lastname: " + rs.getString("lastname"));
//System.out.println("lastname: " + rs.getString(2));
}
}
看下执行结果
id: 69227
lastname: 杨文元-zzj
id: 69229
lastname: 李妍-zzj
id: 69230
lastname: 徐平-zzj
id: 69231
lastname: 赵静-zzj
id: 69232
lastname: 刘长庚-zzj
id: 69233
lastname: 付蕾-zzj
使用RecordSet
的executeQuery
方法可以查询到我们所需要的数据,同样我们也可以通过其他方法来查询数据
@Test
public void queryDatabase2(){
// 创建recordset对象
RecordSet rs = new RecordSet();
// 执行数据sql查询操作
rs.execute("select * from hrmresource");
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}
}
@Test
public void queryDatabase3(){
// 创建recordset对象
RecordSet rs = new RecordSet();
// 执行数据sql查询操作
rs.executeSql("select * from hrmresource",null);
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}
}
其他一些方法可以后续自行探索
如何传参呢?
# 传递参数
如果我们要查询某个条件的数据,可以通过sql拼接的形式进行查询,但是这并不值得推荐,因为只要经常开发的都知道,这个存在sql注入的风险,所以Recordset
也提供了jdbc
的preparedstatement
操作方式,可以通过?
来对参数进行站位,在执行sql时传入对应的参数即可以完成参数的传递
@Test
public void queryDatabaseByParam(){
// 创建recordset对象
RecordSet rs = new RecordSet();
// 执行数据sql查询操作
rs.executeQuery("select * from hrmresource where id = ?",69227);
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}
}
executeQuery
方法的第二个参数是不定长的, 所以可以传入一个Object
数组,与上述的传参方式是等效的
rs.executeQuery("select * from hrmresource where id = ?",new Object[]{69227});
// 或
List<Object> args = new ArrayList<>();
args.add(69227);
rs.executeQuery("select * from hrmresource where id =?",args);
# 更新
更新操作与查询操作类似,只是调用方法不一样而已,接下来上代码展示
@Test
public void updateDatabase(){
// 创建recordset对象
RecordSet rs = new RecordSet();
rs.executeQuery("select * from hrmresource where id = ?",69227);
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}
// 执行数据sql更新操作
if(rs.executeUpdate("update hrmresource set lastname = 'test' where id =?",69227)){
System.out.println("更新成功");
}
rs.executeQuery("select * from hrmresource where id = ?",69227);
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}
}
看输出结果
id: 69227
lastname: 杨文元-zzj
更新成功
id: 69227
lastname: test
接下来看下事务操作
@Test
public void updateDatabaseByTrans() throws Exception {
// 创建recordset对象
RecordSetTrans rs = new RecordSetTrans();
// 设置自动提交为false
rs.setAutoCommit(false);
RecordSet rsQuery = new RecordSet();
rsQuery.executeQuery("select * from hrmresource where id = ?",69227);
// 判断是否有下一行结果集
while (rsQuery.next()) {
// 获取结果集信息
System.out.println("id: " + rsQuery.getInt("id"));
System.out.println("lastname: " + rsQuery.getString("lastname"));
}
// 执行数据sql更新操作
if(rs.executeUpdate("update hrmresource set lastname = 'test-tran' where id =?",69227)){
System.out.println("更新成功: 但是我要回滚");
}
// rs.rollbackOnly();
rs.rollback();
// 事务回滚或者提交后当前事务对象就销毁了,需要重新获取事务对象
rs = new RecordSetTrans();
rs.setAutoCommit(false);
rsQuery.executeQuery("select * from hrmresource where id = ?",69227);
// 判断是否有下一行结果集
while (rsQuery.next()) {
// 获取结果集信息
System.out.println("id: " + rsQuery.getInt("id"));
System.out.println("lastname: " + rsQuery.getString("lastname"));
}
// 执行数据sql更新操作
if(rs.executeUpdate("update hrmresource set lastname = 'test-tran' where id =?",69227)){
System.out.println("更新成功: 这次提交");
}
rs.commit();
rsQuery.executeQuery("select * from hrmresource where id = ?",69227);
// 判断是否有下一行结果集
while (rsQuery.next()) {
// 获取结果集信息
System.out.println("id: " + rsQuery.getInt("id"));
System.out.println("lastname: " + rsQuery.getString("lastname"));
}
}
看下输出结果
id: 69227
lastname: test
更新成功: 但是我要回滚
id: 69227
lastname: test
更新成功: 这次提交
id: 69227
lastname: test-tran
# 插入
插入操作与更新操作,接下来上代码展示
@Test
public void insertDatabase(){
// 创建recordset对象
RecordSet rs = new RecordSet();
// 执行数据sql插入操作
if(rs.executeUpdate("insert into hrmresource(id,lastname) values(?,?)",69326,"test-insert")){
System.out.println("插入成功");
}
// 执行数据sql查询操作
rs.executeQuery("select * from hrmresource where id = ?",69326);
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}
}
看下执行结果
插入成功
id: 69326
lastname: test-insert
事务操作与更新的事务操作是一样的
# 删除数据
删除操作与更新操作,接下来上代码展示
@Test
public void deleteDatabase(){
// 创建recordset对象
RecordSet rs = new RecordSet();
// 执行数据sql删除操作
if(rs.executeUpdate("delete from hrmresource where id =?",69326)){
System.out.println("删除成功");
}
// 执行数据sql查询操作
rs.executeQuery("select * from hrmresource where id =?",69326);
// 判断是否有下一行结果集
if(rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}else{
System.out.println("删除成功,数据库中查询不到数据");
}
}
看下执行结果
事务操作与更新的事务操作是一样的
# 批量操作
除了基本的数据操作之外,还有批量操作的功能,接下来使用批量插入与批量删除来演示
批量插入
@Test
public void batchInsertDatabase() {
List<List> args = new ArrayList<>();
List<Integer> ids = new ArrayList<>();
for (int i = 0; i < 10; i++) {
List arg = new ArrayList<>();
arg.add(69327 + i);
ids.add(69327 + i);
arg.add("test-batch-insert_" + i);
args.add(arg);
}
RecordSet rs = new RecordSet();
if(rs.executeBatchSql("insert into hrmresource(id,lastname) values(?,?)", args)){
System.out.println("批量插入成功");
}
// 查询验证
rs.executeQuery("select * from hrmresource where id in (?,?,?,?,?,?,?,?,?,?)", ids);
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}
}
看下执行结果
批量插入成功
id: 69327
lastname: test-batch-insert_0
id: 69328
lastname: test-batch-insert_1
id: 69329
lastname: test-batch-insert_2
id: 69330
lastname: test-batch-insert_3
id: 69331
lastname: test-batch-insert_4
id: 69332
lastname: test-batch-insert_5
id: 69333
lastname: test-batch-insert_6
id: 69334
lastname: test-batch-insert_7
id: 69335
lastname: test-batch-insert_8
id: 69336
lastname: test-batch-insert_9
看下批量删除
@Test
public void batchDeleteDatabase() {
List<List> ids = new ArrayList<>();
for (int i = 0; i < 10; i++) {
List arg = new ArrayList<>();
arg.add(69327 + i);
ids.add(arg);
}
RecordSet rs = new RecordSet();
if(rs.executeBatchSql("delete from hrmresource where id = ?", ids)){
System.out.println("批量删除成功");
}
// 查询验证
rs.executeQuery("select * from hrmresource where id in (?,?,?,?,?,?,?,?,?,?)", ids);
// 判断是否有下一行结果集
while (rs.next()) {
// 获取结果集信息
System.out.println("id: " + rs.getInt("id"));
System.out.println("lastname: " + rs.getString("lastname"));
}
}
看下输出结果
批量更新和插入删除是一样的接受一个List<List>
的批量参数,这里需要注意的是,事务的批量操作方法接收的参数是List<List<Object>>
类型的参数,所以需要注意泛型(个版本之间可能有差异,编译时期即可发现问题,无需过于担心)