吉林大学数据库应用程序开发知识点总结

锦通  金牌会员 | 2024-11-15 14:47:52 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 877|帖子 877|积分 2631

吉林大学数据库应用程序开发知识点总结

这是我在复习数据库应用程序开发的时候纪录的条记。我们这一年的考试题(2021级2023年12月31考试)共计两道题。第一题是根据实验报告出的,每道题基本上涉及一个知识点;第二题是对于祥瑞码的分析题,也是以数据库为焦点,操作为辅助的题目。团体难度不大,知识点都在下文提及。
知识点1 学习如何毗连数据库

1.1 加载数据库驱动程序
  1. Class.forName("COM.ibm.db2.jdbc.app.DB2DRIVER");
复制代码
1.2 创建数据库的毗连
  1. String url = "jdbc:db2:samle";
  2. String userid = "db2admin";
  3. String passwd = "db2admin";
  4. // 对数据库进行连接
  5. Connection sample =
  6.     DriverManager.getConnection(url,userid,passwd);
复制代码
1.3 结果集ResultSet和Statement语句
对于完整的SQL语句(必要符合SQL语法)可以直接实行。
  1. String sql = "SELECT * FROM JLU.EMPLOYEE WHERE EMPNO = 000010";
  2. Statement stmt = sample.createStatement();
  3. ResultSet res = stmt.executeQuery(sql);
复制代码
1.4 标签标记PreparedStatement语句
这个语句有缺省处置惩罚的结果。可以利用?在sql语句中制造缺省值,但是在实行前利用preparedstatement进行增补。
  1. String sql = "SELECT * FROM JLU.EMPLOYEE WHERE EMPNO = ?";
  2. PreparedStatement pstmt = sample.prepareStament(sql);
  3. pstmt.setString(1,deptno);//带标签标记的deptno要在前面获取到
  4. // 如果需要补充的是int类型
  5. // pstmt.setInt(1,deptno);
  6. // 有几个?就需要补充几个标记
  7. // 标记的顺序和?相同
  8. int row = pstmt.excuteUpdate();
复制代码
1.5 将结果存储到结果集
  1. while(rs.next())
  2. {
  3.         String data1 = rs.getStirng(1);
  4.         String data2 = rs.getStirng(2);
  5.         String data3 = rs.getStirng(3);
  6.         /*
  7.                 从1开始获取数据
  8.                 函数里面的逻辑可以自己rewrite
  9.         */
  10. }
复制代码


  • rs.getString(n)读取String类型
  • rs.getInt(n)读取Int类型
1.6 关闭jdbc对象

  • 关闭ResultSet
  • 关闭PreparedStatement
  • 关闭Connection
  1. if(rs != null)
  2. {
  3.         try{
  4.                 rs.close();
  5.         }catch(SQLException ee){
  6.                 ee.printStackTrace();
  7.         }
  8. }
  9. if (pstmt != null)
  10. {
  11.         try{
  12.                 pstmt.close();
  13.         }catch(SQLException ee){
  14.                 ee.printStackTrace();
  15.         }
  16. }
  17. if (sample != null)
  18. {
  19.         try{
  20.                 sample.close();
  21.         }catch(SQLException ee){
  22.                 ee.printStackTrace();
  23.         }
  24. }
复制代码
注意:关闭jdbc链接并不代表已经提交了事务。
知识点2 GUI窗口交互

2.1 利用JOptionPane进行提示输入交互


  • 利用showMessageDialog进行消息提示
  1. JOptionPane.showMessageDialog(null,"已经更新的数据"+emptno);
复制代码


  • 利用showInputDailog进行输入对话,会将消息存储在input中
  1. String input = JOptionPane.showInputDialog("请输入一个emptno\n");
复制代码
2.2 利用JTable创建数据库表格
这个JTable我们给出的方法比较老了。
我看ChatGPT给出的方案是:先创建一个DefaultTableModel dataModel;将数据存储到这个model中,然后再将model添加到JTable中。每次革新dataModle,否则每次添加数据再重新创建一个JTable效率太低,而且太占内存了。
  1. String[][] lineNames = {"编号","名","中间名","姓"};
  2. Object[][] line = new Object[4][4];
  3. // 使用Obeject对象只是引用,并不占据内存
  4. dataModel = new DefaultTableModel(data,lineNames);
  5. Jtable jt = new JTable();
  6. jt.setModel(dataModel);
复制代码
革新的话,可以先更新line 数组内里的数据,然后
  1. importData();
  2. dataModel.setDataVector(line,lineNames);
  3. // 更新DataModel就好了
复制代码
Excle应该就是用这种方法开发的。
2.3 获取JTable中的数据
  1. String cellValue = (String) tableModel.getValueAt(row, column);
复制代码
知识点3:插入,删除,修改操作



  • 单行插入
  1. String sql_insert = "insert into templ (empno,firstname,midname,lastname)";
复制代码


  • 多行插入
  1. String sql_insert = "insert into templ(empno,firstname,midname,lastname)";
  2. int count = num;// 用户想插入的行数
  3. for (int i=0; i<count; i++)
  4. {
  5.     sql = sql +",(?,?,?,?)";
  6. }
复制代码


  • 通过子查询插入
  1. String find_insert = "insert into templ(empno,firstname,midname,lasername)";
  2. String select_query = "select * from JLU.emplyee where ? = ?";
  3. String find_insert = find_insert + select_query;
复制代码


  • 实现对结果集的任意行、任意列的修改
必要知道这个实现的思路就是先导入到物理存储上,然后对物理存储修改,再写入数据库。
这过程中有对锁思想的实现。(U锁的获取,老师的视频课内里讲解了)
实现方法 1:
  1. String str = "";
  2. String selectForUpdate = "select * from employee for update";
  3. // 注意 for update语句。这条语句作为sql是不符合规则的,但是jdbc会知道,你会update
  4. int finalRow = 0;
  5. int finalColumn = 0;
  6. int rNum = table.getSelectRow(); // 得到表格中被选中的行数
  7. int cNum = table.getSelectColumn(); // 得到表格中被选中的列数
  8. stmt = smple.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); //创建可滚动,可更新的结果集
  9. ResultSet select_rs = stmt.excutQuery(selectforupdate);
  10. for (int i=0; i<finalRow; i++)
  11.     selct_rs.next();
  12. if(select_rs.next())
  13.     select_rs.updateObject(finaleColumn,str);
  14. select_rs.updateRow(); // 将结果落实到数据库(事务提交)
复制代码
实现方法 2:
  1. String str = "";
  2. String selectForUpdate = "select empno,firstname,lastname,edlevel,job from jlu.employee for update";
  3. int finalRow = 0;
  4. int finalColumn = 0;
  5. int rNum = table.getSelectRow(); // 得到表格中被选中的行数
  6. int cNum = table.getSelectColumn(); // 得到表格中被选中的列数
  7. stmt = smple.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
  8. ResultSet select_rs=stmt.executeQuery(selectForUpdate);
  9. select_rs.absolute(finalrow+1); //直接定位到第finalrow+1行
  10. //select_rs.absolute(lastFianlrow); // 我记得有这个函数,就是定位到最后一行+1
  11. select_rs.updateObject(finalcolmn+1,finalstr);
  12. select_rs.updateRow();
复制代码
知识点4:wasNull()方法

结果集返回的结果,假如利用String name = rs.getString(1);
再去判定name != null 的时候,判定的现实上是String类型的null,再String中“\0”就是空。
这样判定已经不是原来的rs是否为空了。
所以接纳原有的rs.wasNull()可以判定是否读到的数据是空。
总结:就是wasNull()可以查抄数据到底有没有读到。由于有时候那边的数据本来就是空,读到之后无法进行判定。比方我们单行插入的时候,许多数据并没有写进数据库。
  1. try{
  2.     PreparedStatement stmt = "";
  3.     String sql = "UPDATE TEMPL SET PHONENO = ? WHERE EMPNO = '000110'";
  4.     stmt = con.prepareStatement(sql);
  5.     if (some condition)
  6.     {
  7.         stmt.setString(1,null);
  8.         // stmt.setNUll(1,java.sql.Type.STRING);
  9.     }else{
  10.         stmt.setString(1,newPhone);
  11.     }
  12.     int updateCount = stmt.excuteUpdate();
  13.     if (updateCOunt != 1)
  14.     {
  15.         JOptionPane.showMessageDialog(null,"报错");
  16.     }
  17. }catch(SQLException ex){
  18.     ex.printStackTrace();
  19. }
复制代码
知识点5:结果集的进一步学习

5.1 利用last, previous,first遍历
  1. String sql = "select * from staff";
  2. PreparedStatement stmt = sample.prepareStatement(sql);
  3. ResultSet rs = stmt.executeQuery();
  4. rs.last(); // 最后一条
  5. rs.previous(); // 向前遍历
  6. rs.first(); // 第一个
  7. rs.next(); // 下一个
  8. rs.absolute(position); // 绝对位置position
复制代码
5.2 批处置惩罚
Statement对于批处置惩罚留下了两个接口


  • void addBatch(String sql)
    相称于把sql添加到batch中一个一个实行。
  • int[] executeBatch()
    实行batch中的sql命令
  1. Statement stmt = sample.createStatement();
  2. stmt.addBatch(sql1);
  3. stmt.addBatch(sql2);
  4. stmt.addBatch(sql3);
  5. int[] updateCounts = stmt.executeBatch(); // 返回的是影响数据库中行数的更新计数
  6. sample.commit(); //提交事务
复制代码
5.3 获取数据库布局
  1. DatabaseMetaData dbmd = sample.getMetaData(); // 获取数据库结构
  2. String[] tableTypes = {"TABLE","VIEW"};
  3. ResultSet rs = dbmd.getTables(null,"UDBA","%",tableTypes);
  4. /*
  5. dbmd.getTables(String catalog,String schema,String tableName,String[] types)
  6. String[] types想要返回何种表的数组
  7. 只会返回10字段的描述信息。
  8. */
复制代码
知识点6:大对象(BLOB类型)的读取

6.1 blob对象作用
blob存放二进制字符串,适用于存放UDT(User-defined Distinct Types),因此我们可以存放图片,声音等等数据。blob对象取决于varchar的大小,varchar最大是2GB,因此blob, clob, dblob 的大小都限制在2GB。
一样平常来说,为了进步性能,数据库必要专门创建一个用于存放大字段的表空间,数据表的大字段列应该将数据存放于对应的表空间中,这是由于不经过内存(缓冲池)直接读取的。
6.2 BLOB类型的赋值
  1. setBinaryStream(int n, java.io.InputStream x, int length)
  2. // n指示参数编号的int
  3. // InputStream对象
  4. // length指示字节数的int
复制代码
6.3 查询图片
代码逻辑:
先将Blob对象读取到rs结果会合,在用getBinaryStream()将Blob对象转换成二进制流对象inputStream;
之后将inputStream流对象通过.read()方法读到int c中,将c通过OutPutStream写到OutPutFile中。
  1. Statement stmt = sample.createStatement();
  2. ResultSet rs = st.excuteQuery("SELECT IMAGE FROM EMPLYEE");
  3. while(rs.next())
  4. {
  5.     Blob blob = (Blob) rs.getBlob(1); // 读取Blob
  6.     // Blob转换为数据流
  7.     java.io.InputStream inputStream = blob.getBInaryStream();
  8.     // 定义要写入的文件
  9.     File fileOutPut = new File(path);
  10.     FileOutPutStream fo = new FileOutPutStream(fileOutPut);
  11.     int c;
  12.     while((c = inputStream.read())!= -1)
  13.         fo.write(c);
  14.         fo.close();
  15. }
复制代码
6.4 插入图片
  1. PreparedStatement pstm = conn.prepareStatement("insert into emp_photo where emptno = ?");
  2. pstm.setString(emptnum);
  3. File file = new File(path);
  4. BufferedInputStream imageInput = new BufferedInputStream(new FileInputStream(file));
  5. pstm.setBianryStream(1,imageInput,(int)file.length);
  6. pstm.excuteUpdate();
复制代码
知识点7:大对象(CLOB类型)的读取

7.1 clob的作用
存储字符串类型的数据。举例:resume中都是一部分一部分的。因此可以作为大对象存储。
  1. Clob resumeLob = null; // 定义Clob
  2. resumeLob = rs3.getClob(3); // 将结果集中第三个位置的Clob取出
  3. String detailInfo = resumeLob.getSubString((long)),(int)resumeLob.length()); // 将Clob类型黄钻换成字符串类型
  4. POSSTR(RESUME,'Personal'); // 查看Personal在Resume中的位置
  5. SUBSTR(RESUME,1,length); // 查看resume中1-length长度的字串
  6. // 上面的两种语句详细用法
  7. sql3 =
  8.         "SELECT EMPNO, RESUME_FORMAT," +
  9.         "SUBSTR(RESUME,1,?)|| SUBSTR(RESUME,?) AS RESUME " +
  10.         "FROM JLU.EMP_RESUME " +
  11.         "WHERE EMPNO = ? AND RESUME_FORMAT = 'ascii'";
  12. /*
  13.         因为我们只知道一部分的位置,可以用substr推断另一部分的位置
  14. */
复制代码
这里的POSSTR和SUBSTR是在sql语句中增长的,具体的用法可以看老师给出的CLOB的示范代码。
知识点8:SQLException和SQLCODE

老师讲:数据库中许多代码都是进行错误处置惩罚的。由于没有一个代码是没有错误的,因此我们尽大概设计非常处置惩罚,来捕获错误,进步系统的鲁棒性。
8.1 SQLCODE和SQLSTATE
SQLCODE:是由数据库公司进行设计的,涵盖全部的SQLSTATE之外还可以附加其他的state;
SQLSTATE:是由国际标准构造指定的。
8.2 SQLException
是由jdbc创造的数据库非常捕获模块。
常见的用法及代码如下:
  1. catch(SQLExecption sex){
  2.     sex.printStackTrace();
  3.     int SQLCODE = sex.getErrorCode();
  4.     if(sex.getSQLState().equlas("23505"))
  5.         JOPtionPane.showMeaasgeDialog(null,"主键重复");
  6. }
复制代码
常见的SQLCODE(DB2)
  1. switch(SQLCODE){
  2.             case 802:
  3.                 //数据溢出
  4.                 JOptionPane.showMessageDialog( null , "数据溢出" ,"SQL错误" , JOptionPane.ERROR_MESSAGE) ;
  5.                 break;
  6.             case -007:
  7.                 //SQL语句中有非法字符
  8.                 JOptionPane.showMessageDialog( null , "SQL语句中有非法字符" ,"SQL信息" , JOptionPane.ERROR_MESSAGE) ;
  9.                 break;
  10.             case -010:
  11.                 //丢失引号
  12.                 JOptionPane.showMessageDialog( null , "SQL语句丢失引号" ,"SQL信息" , JOptionPane.ERROR_MESSAGE) ;
  13.                 break;
  14.             case -060:
  15.                 //某特定数据类型的长度或者标量规范无效
  16.                 JOptionPane.showMessageDialog( null , "某特定数据类型的长度或者标量规范无效" ,"SQL信息" , JOptionPane.ERROR_MESSAGE) ;
  17.                 break;
  18.             case -102:
  19.                 //字符串常量太长
  20.                 JOptionPane.showMessageDialog( null , "字符串常量太长" ,"SQL信息" , JOptionPane.ERROR_MESSAGE) ;
  21.                 break;
  22.             case -104:
  23.                 //SQL语句中遇到非法符号
  24.                 JOptionPane.showMessageDialog( null , "SQL语句中遇到非法符号" ,"SQL信息" , JOptionPane.ERROR_MESSAGE) ;
  25.                 break;
  26.             case -433:
  27.                 //指定的值太长
  28.                 JOptionPane.showMessageDialog( null , "指定的值太长" ,"SQL信息" , JOptionPane.ERROR_MESSAGE) ;
  29.                 break;
  30.             case -405:
  31.                 //数值文字超出了范围
  32.                 JOptionPane.showMessageDialog( null , "数值文字超出了范围" ,"SQL信息" , JOptionPane.ERROR_MESSAGE) ;
  33.                 break;
  34.         }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表