前言
作者是一个才学java的新手,水平比较低,见谅
而且这个小练习也是基于之前写过的一个练习修改而来(将数据存储获取全部改为利用MySQL)
本文的代码想要正常运行需要安装MySQL数据库并配置好环境,
而且在项目中需要添加JDBC驱动包,如下图:
以下是源代码
1.连接数据库
package DataBaseOperation;
/*
* 用于获取数据库连接
*/
import java.sql.*;
public class JDBCutil
{
private String Driver;//驱动
private String URL;//服务器地址,数据库名
private String USERNAME;//用户名
private String PASSWORD;//用户密码
private Connection connect;//数据库连接对象
public JDBCutil()
{
this.Driver = "com.mysql.jdbc.Driver";
//?useSSL=false加上这段,是因为如果不加会警告不建议连接没有带服务器身份验证的SSL(虽然无所谓,简单练习不需要纠结证书
this.URL = "jdbc:mysql://localhost:3306/express?useSSL=false";
this.USERNAME = "root";
this.PASSWORD = "这里输入你自己设置的密码";
}
public Connection getConnection()
{
try
{
Class.forName(this.Driver);//加载MySQL JDBC驱动程序
System.out.println("Success loading MySQL Driver");
}
catch(Exception e)
{
System.out.println("Error loading MySQL Driver");
e.printStackTrace();
}
try
{
this.connect = DriverManager.getConnection(this.URL, this.USERNAME, this.PASSWORD);//建立连接
System.out.println("Success connect MySQL server");
}
catch(Exception e)
{
System.out.println("Error connect MySQL server");
e.printStackTrace();
}
return this.connect;
}
/*public static void main(String[] args)
{
}*/
}
2.对数据进行操作
package DataBaseOperation;
/*
* 利用SQL语句对数据库进行操作
* 读取,插入,删除,更新
*/
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;
import Information.ExpressInformation;
public class SqlOperation
{
private Connection connect;//与数据库的连接
private PreparedStatement pstmt;//预编译SQL语句对象
private ResultSet rs;//pstmt返回的表结果集(pstmt关闭该类也自动关闭
private ArrayList<ExpressInformation> data;//用于存放读取的数据集
private JDBCutil util;//获取连接类
public SqlOperation()
{
this.util = new JDBCutil();
this.connect = this.util.getConnection();
this.data = new ArrayList<ExpressInformation>();
}
public ArrayList<ExpressInformation> getData()
{
return this.data;
}
//查询读取数据
public void Load()
{
//查询用的SQL语句
String SelectSQL = "SELECT *" + "FROM information";
try
{
this.pstmt = this.connect.prepareStatement(SelectSQL);//这个方法需要捕捉异常
this.rs = this.pstmt.executeQuery();//执行查询SQL语句,获得表的结果集
while(rs.next())
{
this.data.add(new ExpressInformation(rs.getString(1),rs.getInt(2),
rs.getString(3),rs.getString(4),
rs.getString(5),rs.getString(6)));//获得每一列的数据(和类的构造函数参数顺序对应)
}
this.rs.close();//立即释放该对象的JDBC和数据库资源
this.pstmt.close();//同上
}
catch(SQLException e)
{
System.out.println("Data load error");
e.printStackTrace();
}
}
//插入新的订单
public void Insert(ExpressInformation order)
{
//插入用的SQL语句
//初始化就需要设置的列(INSERT INTO后表名+列 ,要按顺序对应,占位符的数量也要相同,不然会产生越界错误
String InsertSQL = "INSERT INTO information(id,kind,sender,addressee,SendDate,ReceiveDate)"
+ "VALUES(?,?,?,?,?,?)";//?是占位符,必须在执行前通过setXXX方法进行设置
try
{
this.pstmt = this.connect.prepareStatement(InsertSQL);
//对应数据库中表的行的每一列,顺序不能错
//这些setXXXX方法都是设置之前预编译在pstmt中的SQL语句的占位符
this.pstmt.setString(1, order.getID());
this.pstmt.setInt(2, order.getKind());
this.pstmt.setString(3, order.getSender());
this.pstmt.setString(4, order.getAddressee());
this.pstmt.setString(5, order.getSendDate());
this.pstmt.setString(6, order.getReceiveDate());
this.pstmt.executeUpdate();//执行更新SQL语句,SQL更新语句是预编译在其中的
JOptionPane.showMessageDialog(null, "订单创建成功");//如果上句出现异常,将会跳过这句执行catch的提示
this.pstmt.close();
}
catch(SQLException e)
{
JOptionPane.showMessageDialog(null, "订单已存在");
e.printStackTrace();
}
}
public void Delete(String d_id)
{
//删除用的SQL语句,因为id用String型存储,WHERE筛选记得用' '括住传入的id变量
String DeleteSQL = "DELETE FROM information "+ "WHERE id = ?";
try
{
this.pstmt = this.connect.prepareStatement(DeleteSQL);
this.pstmt.setString(1, d_id);
this.pstmt.executeUpdate();
this.pstmt.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
public void Updata(String u_id,String u_col)//修改订单的订单号和将要修改的列
{
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
String date = df.