第十四周课程总结&实验报告(简单记事本的实现)

课程总结:

1.JDBC(Java Database Connectivity)

2.JDBC API:JDBC API是Java语言中用于连接各种数据库的API。

3.主要的包和相应的接口、类:
java.sql.: class DriverManager; interface Connection, Statement, ResultSet, PreparedStatement, CallableStatement
javax.sql.
: interface DataSource

4.使用JDBC的6个关键步骤
加载驱动

Class.forName("com.mysql.jdbc.Driver");

建立连接

connection = DriverManager.getConnection(url, user, passwd);

创建Statement

statement = connection.createStatement();

执行查询

String sql = "show databases";
resultSet = statement.executeQuery(sql);

处理结果

while (resultSet.next()) {
    String database = resultSet.getString("Database");
    System.out.println("Query: " + database);
}

关闭连接(放到finally子句)

finally {
    //6.关闭连接
    try {
        resultSet.close();
        statement.close();
        connection.close();
    } catch (NullPointerException e) {
        System.out.println("数据库连接未建立或查询操作有误!");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

5.控制事务

Connection还有如下几个用于控制事务的方法。
Savepoint setSavepoint() throws SQLException;创建一个保存点;
Savepoint setSavepoint(String name) throws SQLException;以指定名字来创建一个保存点;
void setTransactionIsolation(int level) throws SQLException;设置事务的隔离级别;
void rollback() throws SQLException;回滚事务;
void rollback(Savepoint savepoint) throws SQLException;将事务回滚到指定的保存点;
void setAutoCommit(boolean autoCommit) throws SQLException;关闭自动提交,打开事务;
void commit() throws SQLException;提交事务;

Statement批处理相关方法:

void addBatch(String sql):添加一条语句到“批”中。
int[] executeBatch():执行“批”中所有语句。返回值表示每条语句所影响的行数据。
void clearBatch():清空“批”中的所有语句。

Statement 向数据库发送 SQL 语句有三个常用的方法:

int executeUpdate(String sql):
该方法可以执行 insert、update、delete 语句,也何以执行 create table、alter table、drop table 等更新数据库表的操作。返回值为更新操作影响的行数。
ResultSet executeQuery(String sql):
该方法执行查询语句,返回结果为 ResultSet 对象,表示一个二维的表格。
Boolean execute():
该方法可以执行所有的 SQL 语句,返回值为 Boolean 类型,表示 SQL 语句是否有结果集。当执行更新操作时,可以掉用 int getUpdateCount() 方法来获取更新操作影响的行数。当执行查询操作时,可以掉用 ResultSet getResultSet() 来获取查询结果。

PreparedStatement批处理

        String sql = "insert into stu values(?,?,?,?)";
        preparedStatement= con.prepareStatement(sql);
        for(int i = 0; i < 10; i++) {
            preparedStatement.setString(1, "S_10" + i);
            preparedStatement.setString(2, "stu" + i);
            preparedStatement.setInt(3, 20 + i);
            preparedStatement.setString(4, i % 2 == 0 ? "male" : "female");
            preparedStatement.addBatch();
        }
        preparedStatement.executeBatch();

数据库操作也是I/O过程。
PreparedStatement
优点:防止SQL注入,有相应的setInt()等方法。
基本使用:
创建PreparedStatement:

preparedStatement = connection.prepareStatement("select ename from emp where ename like ?");

设置参数值(注意,这里的columnIndex是从1开始的)

preparedStatement.setString(1,"%A%");

执行查询

resultSet = JdbcUtil.executeQueryPrepared();

关闭PreparedStatement:调用close方法。

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
如下:

show databases; 显示数据库
create database name; 创建数据库
use databasename; 选择数据库
drop database name 直接删除数据库,不提醒
show tables; 显示表
describe tablename; 表的详细描述
select中加上distinct 去除重复字段

实验总结

源代码

package text;
import java.awt.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.event.*;
import java.io.*;

@SuppressWarnings("serial")
public class test extends JFrame implements ActionListener {
JMenuBar menubar = new JMenuBar();
JMenu file = new JMenu("文件(F)");
JMenu edit = new JMenu("编辑(E)");
JMenuItem create = new JMenuItem("新建");
JMenuItem open = new JMenuItem("打开...");
JMenuItem save = new JMenuItem("保存");
JMenuItem printf = new JMenuItem("打印");
JMenuItem exit = new JMenuItem("退出");

JMenuBar popup = new JMenuBar();
JScrollPane scroll = new JScrollPane(textarea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
String pathSelect;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

public static JTextArea textarea = new JTextArea();

public test() {
  
file.setMnemonic(KeyEvent.VK_F);
edit.setMnemonic(KeyEvent.VK_E);


create.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
printf.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK));

save.addActionListener(this);
create.addActionListener(this);
open.addActionListener(this);
printf.addActionListener(this);
exit.addActionListener(this);

file.add(create);
file.add(open);
file.add(save);
file.add(printf);
file.addSeparator();
file.add(exit);

menubar.add(file);
menubar.add(edit);


textarea.add(popup);
textarea.addMouseListener(new MouseAdapter() {
@SuppressWarnings("deprecation")
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
popup.show();
}
}
});

this.add(menubar, BorderLayout.NORTH);
this.add(scroll, BorderLayout.CENTER);
this.setTitle("记事本");
this.setSize(500, 400);
this.setLocationRelativeTo(null);
//this.setIconImage(new ImageIcon(this.getClass().getResource("/icon/notepad.png")).getImage());//图标放在源目录的icon文件夹
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setVisible(true);
}

 @SuppressWarnings("static-access")
public void actionPerformed(ActionEvent e) {
  // Event对象发生源
  if (e.getSource() == open) {

   JFileChooser chooser = new JFileChooser();
   FileNameExtensionFilter filter = new FileNameExtensionFilter("文本文档(*.txt)", "txt");
   chooser.setFileFilter(filter);
   chooser.setDialogTitle("文件打开");
   chooser.showOpenDialog(null);
   chooser.setVisible(true);

  }

  if (e.getSource() == save && (pathSelect == null)) {
   JFileChooser chooser = new JFileChooser();
   chooser.setDialogTitle("保存");
   chooser.showSaveDialog(null);
   chooser.setVisible(true);

   PrintStream ps;
   try {
    pathSelect = chooser.getSelectedFile().getPath();
    ps = new PrintStream(pathSelect);
    System.setOut(ps);
    System.out.println(this.textarea.getText());

   } catch (Exception e1) {
   }
  } else if (e.getSource() == save && !(pathSelect == null)) {
   PrintStream ps;
   try {
    ps = new PrintStream(pathSelect);
    System.setOut(ps);
    System.out.println(this.textarea.getText());
   } catch (FileNotFoundException e1) {
   }
  }

  if (e.getSource() == create) {
   textarea.setText("");
   pathSelect = null;
  }

  if (e.getSource() == exit) {
   System.exit(0);
  }
  }
 public static void main(String[] args) {
  new test();
 }
}

实验截图

实验感想
写这个代码老是好多错误,还是参考了一下样例代码才写出来的。那个打印我觉得没连接机器也弄不了就当个摆设吧。写完之后,感觉对于数据库和图形界面的东西还是不熟悉。

posted @ 2019-11-29 20:00  反语ooo  阅读(202)  评论(1编辑  收藏  举报