第十四周课程总结&实验报告(简单记事本的实现)
课程总结:
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();
}
}
实验截图
实验感想
写这个代码老是好多错误,还是参考了一下样例代码才写出来的。那个打印我觉得没连接机器也弄不了就当个摆设吧。写完之后,感觉对于数据库和图形界面的东西还是不熟悉。