Заключительный обзор «Разработка прикладной программы системы баз данных»

предисловие

Ниже приведены в основном обзорные материалы курса db2 по разработке программного обеспечения для баз данных Университета Цзилинь, в надежде помочь студентам, которые найдут здесь.

Однако следует отметить, что:

  • ①Все перечисленные коды не требуют специальной среды компиляции, поэтому они могут отличаться от реальной работы.Это всего лишь основная справка и идея для всех.Пожалуйста, не воспринимайте это как стандартный ответ.
  • ②Пожалуйста, обратите внимание на объем вашего экзамена.Объем, составленный нашими учителями в этом году, выглядит следующим образом:
    • Все из содержания отчета
    • Всего пять вопросов (каждый вопрос является кодовым)
    • даст таблицу базы данных
    • Необходимо знать, какие пакеты нужно импортировать и какие общедоступные методы доступны.
    • Пакетная обработка, запрос и обновление, засорение, блог, сделанный в прошлом году
    • В этом году не будет экзамена по графическому интерфейсу
  • ③Наконец, я хотел бы поблагодарить своих старших и сестер, потому что я также полагался на переданные ими материалы и экзаменационные вопросы школы.

Затем на протяжении всего блога я действовал в соответствии с контекстом «просмотр точек знаний, связанных с итоговым отчетом — реальной тестовой практикой». Отчет об оценочном эксперименте этого курса составляет половину, а письменный тест - половину, и письменный тест фактически предназначен для проверки памяти и понимания соответствующих предложений (в основном запоминание, и вы будете использовать его только после запоминания).


После экзамена воспользуюсь своей памятью, чтобы восстановить содержание нашего экзамена (я выпускница 2019 года, сегодня 31.12.2021): список
- список сотрудников (имя, возраст, пол, зарплата, резюме, фото )

  1. Вставить одну строку, вставить несколько строк, вставить подзапрос
  2. Используйте для обновления и где ток для изменения, кажется, изменить имя xxx на yyy
  3. Увеличьте первоначальную зарплату сотрудника на 5% и пропишите обработку исключений переполнения.
  4. Используйте setNULL и wasNULL, чтобы считать определенный столбец атрибутов сотрудника пустым.
  5. Чтение CLOB (возобновление) и вывод указанного содержимого по мере необходимости

эмммммм в безмолвном состоянии, я никогда не помню содержание объятий стоп Будды, и то, что я помню, никогда не было временным объятием стоп Будды Не ожидайте, что два дня будут быстрыми, лучше провести больше времени в обычное время.


1. Обзор точек знаний отчета

1 Задача 1-3 (основные шаги Java для подключения к базе данных)

1.1 Загрузить драйвер jdbc

Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");

1.2 Создание подключения к базе данных

String url = "jdbc:db2:sample";//欲连接的数据库路径
String userid=”db2admin”;//用户名
String passwd=”db2admin”;//密码
Connection sample=DriverManager.getConnection(url,userid,passwd);

1.3 ① Напишите оператор sql и создайте оператор PreparedStatement/Statement, ② выполните его и сохраните в наборе результатов ResultSet.

1.3.1 ① Напишите оператор SQL и создайте оператор PreparedStatement/Statement;

Используемые операторы SQL делятся на две категории:

  • Запрос
  • удалить, вставить, обновить

Потому что, если оператор Sql является типом запроса select, количество строк и столбцов после запроса будет сохранено в ResultSet.
И если Sql вставляется, удаляется и изменяется, возвращаемое значение представляет собой количество вставленных/измененных/удаленных строк типа int.

//执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。    
ResultSet executeQuery(String sqlString)

//用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等    
int executeUpdate(String sqlString)

//一般用于sql语句中没有?的、可以直接执行的语句
//(1)Statement:
String sql ="select NAME, JOB, SALARY from staff Where ID = 10"//sql语句
Statement stmt = sample.createStatement();//创建statement语句
ResultSet rs = stmt.executeQuery( sql);//执行,并存入结果集

//一般用于sql语句中有?需要赋值的、不可以直接执行的语句。
//(2)PreparedStatement:
String sql="insert into templ(empno,firstnme,lastname,edlevel) values (?,?,?,?)";//sql语句
PreparedStatement pstmt = sample.prepareStatement(sql);//创建 PreparedStatement语句
pstmt.setString(1,deptno);//记住,从1开始,不是从0开始set,规定。deptno是一个字符串,自己定义即可,意思是将定义好的deptno赋值给第一个问号出现的地方。
pstmt.setString(2,deptno);//同理,给第二个问号赋值
pstmt.setString(3,deptno);
pstmt.setString(4,deptno);
int rows=pstmt.executeUpdate();//返回更新过的行数。
//而这一步,我们上面提到过如果是插删改的话,rows的值可以直接传回,但是如果是查询语句的话,那么就要遍历结果集得到一个ResultSet对象才行。

1.3.2 ② и выполнить набор результатов, хранящийся в ResultSet.

while(rs.next()){
    
        
    String data1 = rs.getString(1) ; //从1开始
    String data2 = rs.getString(2) ; 
    String data3 = rs.getString(3) ; 
    String data4= rs.getString(4) ; 
     }    

В результирующем наборе есть много библиотечных функций, наиболее часто используется getString, который относится к атрибуту извлекаемого столбца строкового типа,
если атрибут этого столбца имеет целочисленный тип, используйте getInt

1.4 Обработка исключений и закрытие ресурсов объекта jdbc

После завершения операции все используемые объекты JDBC должны быть закрыты для высвобождения ресурсов JDBC. Последовательность закрытия противоположна последовательности объявления. Обычная последовательность объявления такова: "установить соединение - получить текущее состояние - вернуть набор результатов в соответствии с операция», поэтому в обратном порядке наша последовательность закрытия такова:
1. Сначала закройте ResultSet
2, затем закройте подготовленныйStatement
3 и, наконец, закройте соединение объекта connection.

if(rs != null){
    
       // 关闭结果记录集    
        try{
    
        
            rs.close() ;    
        }catch(SQLException e){
    
        
            e.printStackTrace() ;    
        }    
   }    
if(stmt != null){
    
       // 关闭状态声明对象    
        try{
    
        
            stmt.close() ;    
        }catch(SQLException e){
    
        
            e.printStackTrace() ;    
        }    
   }    
if(conn != null){
    
      // 关闭连接对象    
         try{
    
        
            conn.close() ;    
         }catch(SQLException e){
    
        
            e.printStackTrace() ;    
         }    
}  

2 Задача 4: Взаимодействие с окном

Требуется небольшое взаимодействие, то есть значение в операторе суждения SQL сначала не указывается, а всплывающее окно для получения пользовательского ввода, а затем присваивает значение для запроса.

String inputValue = JOptionPane.showInputDialog("Please input a value");//输入的东西保存在inputValue
JOptionPane.showMessageDialog(null, "\nNumber of rows updated: " + updateCount);//弹出一个输出框显示更新行数

3 Задача 5: Связанные операции таблиц, создание таблиц

String[] Names = {
    
     "编号", "名字", "姓氏", "职位"};//表头
Object[][] Info = new Object[4][4];//表格内容,几行几列
JTable table = new JTable(Info, Names);//创建表格

функции основной библиотеки таблицы

//1.获取单元格数据
String cellValue=(String) tableModel.getValueAt(row, column);// 取单元格数据,row是行号,column是列号
//2.给单元格数据赋值,即给二维数组赋值,一般用ResultSet结果集赋值定义的表格Info
for(int i=0;i<4;i++)
   for(int j=0;j<4;j++){
    
    
      System.out.println(j+"ci");
      info[i][j]=rs.getString(j+1);						
    }
}
//3.单行插入 
String single_insert="insert into templ(empno,firstnme,lastname,edlevel)values (?,?,?,?)";

//4.多行插入 
int count =4//用户想插入四行
String sql="insert into templ(empno,firstnme,lastname,edlevel) values (?,?,?,?)";
for(int i=0;i<3;i++){
    
    
    sql=sql+",(?,?,?,?)";
}

//5.通过子查询插入 
String find_insert="insert into templ(empno,firstnme,lastname,edlevel)"+
                    "select empno,firstnme,lastname,edlevel from employee "+
                    "where empno=? "+
                    "and firstnme=? "+
                    "and lastname=? "+
                    "and edlevel=?";

4 Задача 6: Метод wasNull() ResultSet

//用于读取结果集下一行的语句判断是否为空
rs.next();
while(rs.next()){
    
    
......
}
rs.wasNull();

5 Задача 8: Реализовать изменение любой строки и столбца результирующего набора

5.1 Первый способ

String finalstr="";
String selectforupdate="select empno,firstnme,lastname,edlevel,job  from employee" +" for update";
//sql语句,不要忘记加上for update!!

int finalrow=0; 
int finalcolmn=0;
int r= table.getSelectedRow();//得到表格被选中的行数,与结果集对应 finalrow=r;
int c=table.getSelectedColumn();//得到表格被选中的列数,与结果集对应 finalcolmn=c;
stmt=sample.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); //创建可滚动,可更新的结果集
ResultSet select_rs=stmt.executeQuery(selectforupdate);
for(int i=0;i<finalrow;i++){
    
     
    select_rs.next();//结果集移动到第finalrow行
}
if(select_rs.next()){
    
     
	select_rs.updateObject(finalcolmn,finalstr);//更新结果集的第finalcolumn列,更新为finalstr
}
select_rs.updateRow();//将结果集落实到数据库

5.2 Второй способ

String finalstr=""; 
String selectforupdate="select empno,firstnme,lastname,edlevel,job from employee"+" for update";
//sql语句,不要忘记加上for update!! 
int finalrow=0; 
int finalcolmn=0;
int r= table.getSelectedRow();//得到表格被选中的行数,与结果集对应 
finalrow=r; 
int c=table.getSelectedColumn();//得到表格被选中的列数,与结果集对应 
finalcolmn=c;
stmt=sample.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.
CONCUR_UPDATABLE); 
ResultSet select_rs=stmt.executeQuery(selectforupdate);
select_rs.absolute(finalrow+1);//直接定位到第finalrow+1行
select_rs.updateObject(finalcolmn+1,finalstr);
select_rs.updateRow();

6 Задача 9:

6.1 Создайте прокручиваемый набор результатов и используйте последнюю, предыдущую, первую функции для перемещения

String sql="select NAME,JOB,SALARY from staff";
PreparedStatement stmt=sample.prepareStatement(sql,rs.TYPE_SCROLL_INSENSITIVE,rs.CONCUR_READ_ONLY);  //为了创建可滚动,只读的结果集
ResultSet rs = stmt.executeQuery( );    
 rs.last();
 rs.previous();
rs.first();

Знание

rs.absolute()//绝对位置,负数表示从后面数
rs.first()第一条
rs.last()最后一条
rs.previoust()前一条
rs.next()后一条

6.2 Пакетная операция, выполнение нескольких операторов одновременно

В интерфейсе Statement есть два метода:

  • void addBatch(String sql)- Добавляет данную команду SQL в текущий список команд этого объекта запроса. Команды в этом списке можно выполнять пакетами, вызывая метод executeBatch.
  • int[] executeBatch()—— Отправьте пакет команд в базу данных для выполнения и верните массив счетчиков обновлений, если все команды выполнены успешно.

Возвращает: массив, содержащий количество обновлений одного элемента для каждой команды в пакете (каждый элемент в массиве: количество обновлений количества строк в базе данных, затронутых выполнением команды после того, как команда была успешно обработана). ). Элементы массива упорядочены в соответствии с порядком добавления команд в пакет.
Пакетная операция, то есть выполнение нескольких операторов одновременно
Код:

Statement stmt=sample.createStatement();
stmt.addBatch("INSERT INTO DB2ADMIN.DEPARTMENT " +
              "VALUES ('BT6','BATCH6 NEWYORK','BBBBB1','BTT','NEW YORK CITY6')");
stmt.addBatch("INSERT INTO DB2ADMIN.DEPARTMENT " +
               "VALUES ('BT7','BATCH7 NEWYORK','BBBBB2','BT2','NEW YORK CITY7')");   
int []updateCounts=stmt.executeBatch();
sample.commit();

6.3 Получить структуру базы данных

DatabaseMetaData dbmd=sample.getMetaData();//获取数据库的结构,存储等信息。
String []tableTypes={
    
    "TABLE","VIEW"};
ResultSet rs=dbmd.getTables(null,"UDBA","%",tableTypes);

Знание:

  • dbmd.getTables(String catalog,String schema,String tableName,String[] types), этот метод имеет четыре параметра, и их значения следующие:
    String catalog: Для получения каталога, в котором находится таблица. """" означает отсутствие каталогов, Null означает наличие всех каталогов.
    String schema: Чтобы получить схему, где находится таблица. """" означает отсутствие шаблонов, Null означает все шаблоны.
    String tableName: Укажите те таблицы, имя которых соответствует этому параметру, который необходимо вернуть.
    String types: Массив, указывающий, какую таблицу нужно вернуть. Возможные элементы массива: "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYSNONYM".
  • Каждая таблица в результирующем наборе, возвращаемом методом getTables(), имеет описание 10 полей ниже, а их всего 10. Обычно мы используем поля, отмеченные красным. И в наборе результатов вы можете напрямую использовать серийный номер перед следующим полем, чтобы получить значение поля.
    1.TABLE_CAT (String) => каталог таблицы (может быть пустым)
    2.TABLE_SCHEM (String) => схема таблицы (может быть пустым)
    3.TABLE_NAME (String) => имя таблицы

7 Задача 10. Чтение и вставка объектов типа blob

Для назначения типа Blob используйте setBinaryStream(int n, java.io.InputStream x, int length)оператор:
①n указывает целое число параметра
②InputStream object
③length указывает целое количество байтов.

7.1 Запросить код изображения

Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select image from employee");
while(rs.next()){
    
    
    //读取Blob对象
    Blob blob= (Blob) rs.getBlob(1);
    
    //Blob对象转化为InputStream流
    java.io.InputStream inputStream =blob.getBinaryStream();
    
    //要写入的文件
    File fileOutput = new File("c:/backa.jpg");
    
    //文件的写入流的定义
    FileOutputStream fo = new FileOutputStream(fileOutput);
    int c;
    //读取流并写入到文件中
    while ((c = inputStream.read()) != -1)
        fo.write(c);
        //流的关闭:
        fo.close();
}

7.2 Вставьте код изображения

PreparedStatement preparedStatement = conn.prepareStatement("insert into emp_photo values('000130','jpeg',?)");
//创建文件对象:
File file=new File("e:/123.jpg");//参数是本地图片的路径名
// 创建流对象: 
BufferedInputStream imageInput = new BufferedInputStream(new  FileInputStream(file));
//参数赋值:
preparedStatement.setBinaryStream(1, imageInput,(int)file.length());
//第二个参数InputStream 对象,第三个参数字节数int
//执行语句
preparedStatement.executeUpdate();

8 Задача 11: Чтение типа clob

Clob resumelob = null;//定义clob类型
resumelob = rs3.getClob(3);//将结果集中第三个位置的clob取出
String detailinfo = resumelob.getSubString((long)1,(int)resumelob.length());
//将clob类型转化为字符串类型,参数固定,基本上就这么写

Также используется функция sql

POSSTR(RESUME,'Personal')//查看Personal这个单词在RESUME中的位置
SUBSTR(RESUME,1,length)//取resume中1-length长度的字段


2. Реальная экзаменационная практика (экзаменационные вопросы 2016-2017 гг.)

1. Операторы для установления соединения с базой данных, настройки объекта

static{
    
    
     try{
    
    
        class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
        }catch(Exception e){
    
    
            System.println("\n Error loading DB2 Driver...\n");
            System.println(e);
            System.exit(1);
          }
}
String url = "jdbc:db2:sample";
Connection con = DriverManager.getConnection(url,userid;passwd);
Statement st = con.creatStatement();

2. Определите объект набора результатов, оператор запроса, который будет выполнять объект, будет «запросить персонал таблицы, получить имя (имя), работу (должность) и зарплату (зарплату) сотрудника номер 10», и напишите конкретный код выполнения.

String SQL="SELECT NAME,JOB,SALARY FROM STAFF WHERE ID = 10";
Resultset rs = st.executeQuery(SQL);

3. Запишите метод следующей строки в результирующем наборе, предполагая, что объект rs, запишите конкретный код выполнения.

boolean more = rs.next();
while(more){
    
    
     String outline;
     name = rs.getString(1);
     job = rs.getString(2);
     salary = rs.getString(3);
     outline = ( name + blanks.substring(0,10-name.length()) ) +
               ( job + blanks.substring(0,10-job.length()) ) +
               ( salary + blanks.substring(0,12-salary.length()) )
     more=rs.next();
     }

4. Когда Sql="SELECT name FROM Temp WHERE id=?" выполняет эту инструкцию SQL, какой объект должен быть создан? Если имя объекта pstmt, напишите конкретный фрагмент программы.

String sql = "SELECT name FROM Temp WHERE id=?" ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1,id) ; // 这里用于设置了第一个?的值

Суть в том, чтобы дождаться, пока пользователь вручную "setString" проконтролирует условия поиска. После завершения настройки строится sql.

Подведем итог:

  • Знак вопроса — это то, что мы называем переменной. Определенного значения нет. Мы можем присвоить ему значение с помощью метода setString(), что очень важно для гибкости нашего sql.

5. ①Известен оператор обновления sql «UPDATE temp SET зарплата=зарплата*5» и записан конкретный код выполнения; ②count – это результат выполнения executeUpdate(), count=3, но исходная таблица запроса не изменилась. Почему?

sqlstmt = "UPDATE TEMP SET SALARY = SALARY * 5 WHERE DEPT = ?";
PreparedStatement pstmt = con.prepareStatement( sqlstmt );


Причина в том, что программа настроена так, чтобы не отправлять операторы SQL автоматически con.setAutoCommit(fALSE)
, поэтому результат, возвращаемый сразу после модификации, считывается из кеша в настройках программы для повышения производительности, а не из базы данных.

Общий процесс:

Connection sample = DriverManager.getConnection("jdbc:db2:sample",userid,passwd);
String deptno  = "";
String s = " ";
int mydeptno = 0;
int updateCount=0;

String sqlstmt = "UPDATE TEMP SET SALARY = SALARY * 5 WHERE DEPT = ?";

BufferedReader in = new BufferedReader( new InputStreamReader (System.in));
System.out.println("input deparement no._");
s = in.readLine();

While(s!=null){
    
    
   deptno = s.substring(0,2);//从输入流中获取指定的dep的值,结果返回字符串
   mydeptno = Integer.parseInt(deptno);//转换为int
   PreparedStatement pstmt = sample.prepareStatement( sqlstmt );//准备执行sql语句
   pstmt.setInt(1, mydeptno);//给sql中第一个?处赋值
   updateCount += pstmt.executeUpdate();//每次更新都要计数
   System.out.println("input deparement no");
   s = in.readline();
}
System.out.println("\n Number of rows updated: " + updateCount);

6. Предполагая, что объекты Connection, Statement и ResultSet являются con, stmt и rs соответственно, в каком порядке эти три объекта должны быть закрыты до конца программы, пожалуйста, напишите конкретные операторы на основе этого.

rs.close()
stmt.close()
con.close()

Также из первых двух вопросов видно, что сначала устанавливается соединение, затем получаются данные в текущем состоянии, затем выполняется соответствующая операция для получения результирующего множества, затем следует проследить процесс закрытия до source, поэтому закройте набор результатов --> закройте объект состояния --> закройте соединение.

7. Вставьте изображение "e:\photo\a.jpg" в столбец фото (атрибут BOLB) таблицы учеников, напишите основной оператор операции и настройте объект.

//将图片插入到BLOB类型的字段中
//建立一个表:
create table a(blob a);
//建立一个目录:
create directory tmp as 'e:\';
//建立一个PL/SQL块:
declare
     bfile b_file;
     blob b_lob;
begin
     insert into a(a) values(empty_blob()) 
     return a into b_lob;
     //为了使PL/SQL编译成功,必须先为该列插入一个empty_blob() 值
     //return a into b_lob是将该列与一个blog类型的变量绑定在一起,以后只要为b_lob赋值,即等于将该值插入了表中。
     
     b_file:=bfilename('tmp','filename.jpg');
     //tmp是建立的文件所在的目录,filename.jpg是文件名;将文件转换为bfile类型
     
     dbms_lob.open(b_file,dbms_lob.file_readonly);
     //将b_file 以只读的方式打开
     
     dbms_lob.loadfromfile(b_lob,b_file,dbms_lob.getlength(b_file));
     //将b_file中的内容转换到b_lob中
     
     dbms_lob.close(b_file);
     commit;
end;

Supongo que te gusta

Origin blog.csdn.net/KQwangxi/article/details/122232917
Recomendado
Clasificación