Java实验四 JDBC
使用SQL Server数据库或者MySQL数据库各自的客户端工具,完成如下任务:
(1)创建数据库students;
(2)在数据students中创建表scores,包括如下字段:学号、姓名、性别、得分,字段类型自行定义。学号为主键。
接着使用JDBC编写Java程序,完成如下任务:
(1)在表格scores插入5条记录,代表5个学生,三位男生二位女生,各字段内容自定(“得分”字段填入自定分数);
(2)显示5位学生的所有信息;
(3)将三位男生的得分减去5分,将两位女生的成绩加上3分;
(4)从键盘输入不同学号,根据学号显示相应学生的所有信息。
做成了窗口,界面是这样的
1.安装JDBC,配置SqlServer
可以参考之前写的博客:Java使用JDBC连接SQL Server数据库
注意Java的版本
2.写代码
文件目录是这样的
两个文件,
SqlCode.java
SqlCode.java存放静态SQL代码
/*
* 这里放的是 静态Sql代码
*/
public class SqlCode {
//在数据students中创建表scores
static String createTable = ""
+ "USE students;"
+ "\n"
+ "CREATE TABLE scores"
+ "("
+ "sno int not null,"
+ "name varchar(20) not null,"
+ "ssex varchar(10) CHECK(ssex IN('boy','girl')),"
+ "score int not null,"
+ "PRIMARY KEY(sno),"
+ ")";
//在表格scores插入5条记录
static String insertValues = ""
+ "USE students"
+ "\n"
+ "INSERT INTO scores(sno,name,ssex,score) VALUES(1,'DaWang','boy','61')"
+ "\n"
+ "INSERT INTO scores(sno,name,ssex,score) VALUES(2,'ErWang','girl','62')"
+ "\n"
+ "INSERT INTO scores(sno,name,ssex,score) VALUES(3,'SanWang','boy','63')"
+ "\n"
+ "INSERT INTO scores(sno,name,ssex,score) VALUES(4,'siWang','girl','65')"
+ "\n"
+ "INSERT INTO scores(sno,name,ssex,score) VALUES(5,'wuWang','girl','66')";
//显示5位学生的所有信息
static String queryString = ""
+ "USE students"
+ "\n"
+ "SELECT TOP 5 * FROM scores";
//将三位男生的得分减去5 tucao:男生真累
static String updateScoreBoy = ""
+ "USE students"
+ "\n"
+ "UPDATE scores "
+ "\n"
+ "SET score = score - 5"
+ "\n"
+ "WHERE ssex = 'boy'"
+ "\n";
//将两位女生的成绩加上3分
static String updateScoreGirl = ""
+ "USE students"
+ "\n"
+ "UPDATE scores "
+ "\n"
+ "SET score = score + 3"
+ "\n"
+ "WHERE ssex = 'girl'"
+ "\n";
//删除某个学号 自己测试数据用的
static String deleteByIdSql = "USE students"
+ "\n"
+ "DELETE FROM scores WHERE sno = ";
}
SqlServerStu.java
SqlServerStu.java文件就是主文件,使用JDBC来操作数据库了,最后还是做成了花里胡哨的窗口。。一共450行 (´ཀ`」 ∠)
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Closeable;
import java.sql.*;
import java.util.Scanner;
import javax.naming.OperationNotSupportedException;
import javax.sound.sampled.Line;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
class sqlServer{
private Connection connection = null; //连接接口实例
private Statement statmment = null; //执行静态sql的接口实例
private PreparedStatement preStatement = null; //执行动态sql的接口实例
private ResultSet resSet = null; //sql查询的返回数据集合
String dbName = "students"; //数据库名
String tbName = "scores"; //数据表名 没必要其实
String url = "jdbc:sqlserver://127.0.0.1:1433"; //sqlserver连接地址url
String userName = "sa"; //sqlserver的账号名 要在SMSS安全性里面设置
String passWord = "root"; //sqlserver的账号的密码 要在SMSS安全性里面设置
//下面就是按课题要求写的一些静态代码(String字符串类型,在SqlCode.java文件中的全局变量)
String createTableSql = SqlCode.createTable;
String insertSql = SqlCode.insertValues;
String queryAllSql = SqlCode.queryString;
String updateBoySql = SqlCode.updateScoreBoy;
String updateGrilSql = SqlCode.updateScoreGirl;
String delByIdSql = SqlCode.deleteByIdSql;
//无参构造函数 初始化建立连接
public sqlServer() {
// TODO Auto-generated constructor stub
try {
//加载数据库驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//DriverManager接口获取连接
this.connection = DriverManager.getConnection(url,userName,passWord);
//获取 执行数据库静态SQL语法的接口
this.statmment = connection.createStatement();
if(connection != null) {
System.out.println("连接成功!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//有参构造函数 urlParam初始化建立连接
public sqlServer(String urlParam) {
// TODO Auto-generated constructor stub
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
this.connection = DriverManager.getConnection(urlParam);
this.statmment = connection.createStatement();
if(connection != null) {
System.out.println("连接成功!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭连接
public void close() throws SQLException {
if(resSet != null) {
resSet.close();
}
if(statmment != null) {
statmment.close();
}
if(preStatement != null) {
preStatement.close();
}
if(connection != null) {
System.out.println("关闭连接!");
connection.close();
}
}
//打印输出 ResultSet集合中的数据
public void rsPrint(ResultSet rS) throws SQLException {
if(rS == null) return;
System.out.println("");
System.out.println("sno"+"| name"+" | ssex"+" | score");
while(rS.next()) {
int sno = rS.getInt("sno");
String name = rS.getString("name");
String ssex = rS.getString("ssex");
int score = rS.getInt("score");
System.out.println(sno+" | "+name+" | "+ssex+" | "+score);
}
}
//返回ResultSet集合
public ResultSet queryBySno(int snoId) throws SQLException {
String queryByIdString = ""
+ "USE students"
+ "\n"
+ "SELECT * FROM scores"
+ "\n"
+ "WHERE scores.sno = ?"
+ "";
this.preStatement = connection.prepareStatement(queryByIdString);
preStatement.setInt(1, snoId);
return preStatement.executeQuery();
}
//查询全部
public ResultSet queryAll(String querySql) throws SQLException {
return statmment.executeQuery(querySql);
}
//创建数据库
public void generalExc(String sql) throws SQLException {
preStatement = connection.prepareStatement(sql);
preStatement.executeUpdate();
}
//创建数据库
public void createDataBase(String dbName) throws SQLException {
String createSql = "CREATE DATABASE "+dbName;
preStatement = connection.prepareStatement(createSql);
// preStatement.setString(1, dbName);
preStatement.executeUpdate();
System.out.println("创建数据库"+dbName+"成功!");
}
//删除数据库
public void delDataBase(String dbName) throws SQLException {
String deleteSql = "DROP DATABASE "+dbName;
preStatement = connection.prepareStatement(deleteSql);
// preStatement.setString(1, dbName);
preStatement.executeUpdate();
System.out.println("删除数据库"+dbName+"成功!");
}
//通过sno学号删除 数据表中的记录
public void delById(int sno) throws SQLException {
preStatement = connection.prepareStatement(delByIdSql + sno);
preStatement.executeUpdate();
System.out.println("删除记录"+"成功!");
}
//创建数据表
public void createTable(String createSql) throws SQLException {
statmment.execute(createSql);
System.out.println("创建数据表"+"成功!");
}
//插入数据到数据表
public void insertValue(String insertSql) throws SQLException {
statmment.execute(insertSql);
System.out.println("删除数据表"+"成功!");
}
//更新数据表中的数据
public void updateValue(String updateSql) throws SQLException {
statmment.execute(updateSql);
System.out.println("更新完成!");
}
//scanner输入指定学号,查询学生信息
public void inputSnoAndQuery() throws SQLException {
Scanner inputScanner = new Scanner(System.in);
int snoId = inputScanner.nextInt();
rsPrint(queryBySno(snoId));
}
//返回值:把ResultSet集合中的数据转换成String类型 (因为后面展示到窗口文本域需要string类型)
public String returnString(ResultSet rS) throws SQLException {
// TODO Auto-generated method stub
StringBuffer myBuffer = new StringBuffer();
int line = 0;
while(rS.next()) {
if(line == 0) {
line++;
myBuffer.append("查询结果如下: "+"\n");
// myBuffer.append("sno"+"| name"+" | ssex"+" | score"+"\n");
}
int sno = rS.getInt("sno");
String name = rS.getString("name");
String ssex = rS.getString("ssex");
int score = rS.getInt("score");
myBuffer.append(sno+" | "+name+" | "+ssex+" | "+score+"\n");
}
if(line == 0) myBuffer.append("");
return myBuffer.toString();
}
}
class window{
//组件
public JFrame sqlWindowFrame;
public JPanel PanelSouth;
public JPanel PanelNorth;
public JTextArea textArea;
public JScrollPane scrollPane;
public JTextField inpuTextField;
//一系列按钮
public JButton customQueryBtn; //执行自定义sql代码的查询按钮
public JButton noResultBtn; //执行没有返回值的sql代码的按钮 比如:create insert delete 这些
public JButton createDBBtn; //创建数据库按钮
public JButton createTBBtn; //创建数据表按钮
public JButton insertBtn; //添加数据按钮
public JButton showBtn; //展示5个学生数据的按钮
public JButton updateBtn; //更新数据的按钮 男-5 女+3
public JButton querySnoBtn; //通过学号查询的按钮
public JLabel labelSouth; //底部标签
public JLabel labelNorth; //顶部标签
public sqlServer myServer; //把sqlServer作为内部类
//窗口构造函数 主要用来初始化组件
public window() {
// TODO Auto-generated constructor stub
this.sqlWindowFrame = new JFrame("by fishers _(´ཀ`」 ∠)_"); //设置窗体 名字为notePad
this.sqlWindowFrame.setLayout(new BorderLayout()); //边界布局方式
this.sqlWindowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭框
this.sqlWindowFrame.setSize(800,500);
this.textArea = new JTextArea();
this.scrollPane = new JScrollPane(textArea);
this.inpuTextField = new JTextField(30);
this.customQueryBtn = new JButton("执行查询");
this.noResultBtn = new JButton("执行无返回值的sql");
this.createDBBtn = new JButton("创建数据库");
this.createTBBtn = new JButton("创建数据表");
this.insertBtn = new JButton("添加数据");
this.showBtn = new JButton("展示数据");
this.updateBtn = new JButton("更新数据");
this.querySnoBtn = new JButton("查询学号");
this.PanelSouth = new JPanel();
this.PanelNorth = new JPanel();
this.labelSouth = new JLabel("输入sql语法: ");
this.labelNorth = new JLabel("内置功能区: ");
this.myServer = new sqlServer();
textArea.setFont(new Font("宋体",Font.PLAIN,20));
textArea.setEditable(false); //设置文本域组件不可以编辑
itemAdd();
addListen();
}
//添加组件都写在这里
public void itemAdd() {
PanelSouth.add(labelSouth);
PanelSouth.add(inpuTextField);
PanelSouth.add(customQueryBtn);
PanelSouth.add(noResultBtn);
PanelSouth.add(noResultBtn);
PanelNorth.add(labelNorth);
PanelNorth.add(createDBBtn);
PanelNorth.add(createTBBtn);
PanelNorth.add(insertBtn);
PanelNorth.add(showBtn);
PanelNorth.add(updateBtn);
PanelNorth.add(querySnoBtn);
sqlWindowFrame.add(scrollPane,BorderLayout.CENTER);
sqlWindowFrame.add(PanelSouth,BorderLayout.SOUTH);
sqlWindowFrame.add(PanelNorth,BorderLayout.NORTH);
sqlWindowFrame.setVisible(true);
}
//监听方法都写在这里
public void addListen() {
//监听自定义查询按钮
customQueryBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String textString = inpuTextField.getText();
System.out.println(textString);
if(textString != null) {
try {
// myServer.rsPrint(myServer.queryAll(textString));
String queryAns = myServer.returnString(myServer.queryAll(textString));
System.out.println(queryAns);
textArea.setText(queryAns);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
//监听没有返回值的按钮
noResultBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String textString = inpuTextField.getText();
System.out.println(textString);
if(textString != null) {
try {
myServer.generalExc(textString);
textArea.setText("执行完成!");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
//监听创建数据库按钮
createDBBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
myServer.createDataBase("students");
textArea.setText("创建数据库完成!");
} catch (SQLException e1) {
// TODO Auto-generated catch block
textArea.setText("创建数据库失败,请检查语法是否正确!或当前连接已经存在该数据库!");
e1.printStackTrace();
}
}
});
//监听创建数据表的按钮
createTBBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
myServer.createTable(myServer.createTableSql);
textArea.setText("创建数据表完成!");
} catch (SQLException e1) {
textArea.setText("创建数据表失败,请检查语法是否正确!或当前数据库中已经存在该数据表!");
e1.printStackTrace();
}
}
});
//监听插入数据的按钮
insertBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
myServer.insertValue(myServer.insertSql);
textArea.setText("添加数据完成!");
} catch (SQLException e1) {
textArea.setText("添加数据失败,请检查语法是否正确!或当前数据库中已经存在该数据!");
e1.printStackTrace();
}
}
});
//监听展示数据的按钮
showBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
String queryAns = myServer.returnString(myServer.queryAll(myServer.queryAllSql));
System.out.println(queryAns);
textArea.setText(queryAns);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
});
//监听更新数据的按钮
updateBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
myServer.updateValue(myServer.updateBoySql);
myServer.updateValue(myServer.updateGrilSql);
textArea.setText("更新数据完成!");
} catch (SQLException e1) {
// TODO Auto-generated catch block
textArea.setText("更新数据失败,请检查语法是否正确!");
e1.printStackTrace();
}
}
});
//监听通过学号查询数据的按钮
querySnoBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
int sno = Integer.valueOf(inpuTextField.getText());
String queryAns = myServer.returnString(myServer.queryBySno(sno));
// if(queryAns == " " || queryAns == null) queryAns = "未查到该学生信息";
// System.out.println(queryAns);
textArea.setText(queryAns);
} catch (SQLException e1) {
// TODO Auto-generated catch block
textArea.setText("查询失败,请检查语法是否正确");
e1.printStackTrace();
}
}
});
}
}
//主进程启动
public class SqlServerStu {
public static void main(String []args) throws SQLException {
// String urlParam = "jdbc:sqlserver://127.0.0.1:1433?user=sa&password=root"; //这个连接url好像不能用啊
// sqlServer myServer = new sqlServer();
// myServer.createDataBase("students"); //创建数据库
// myServer.createTable(myServer.createTableSql); //创建数据表
// myServer.insertValue(myServer.insertSql); //增
// myServer.rsPrint(myServer.queryAll(myServer.queryAllSql)); //查
// myServer.rsPrint(myServer.queryBySno(2)); //查
// myServer.updateValue(myServer.updateBoySql); //改
// myServer.delById(1); //删
// myServer.rsPrint(myServer.queryAll(myServer.queryAllSql)); //查
// myServer.delDataBase("students"); //删
// myServer.close(); //关闭连接
// myServer.inputSnoAndQuery();
// myServer.updateValue(myServer.updateBoySql);
// myServer.delDataBase("students");
// myServer.createDataBase("qwertest12");
window myWindow = new window(); //最后还是做成了窗口 orz
}
}
//凑够450行
做数据库实验也是可以的??