/*
* jdbc步骤
* 1、加载数据驱动
* 2、通过DriverManager获取数据库连接对象
* 3、通过Connection创建Statement对象1)creatStatement()基本创建2)prepareStatement(String sql)根据传入SQL语句创建预编译的Statement对象
* 4、使用Statement执行SQL语句1)execute可任何语句 比较麻烦2)executeUpdate()主要执行DML(受影响行数)、DDL语句(返回0)3)executeQuery只能执行查询语句,执行后返回代表查询的ResultSet对象
* 5、操作结果集,如果执行是查询语句,执行结果将返回一个Result对象,该对象保存sql语句查询结果
* 6、回收数据库资源
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.AttributedString;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
import java.util.jar.Attributes.Name;
import javax.management.loading.PrivateClassLoader;
public class Test {
/*查询用Statement接口和executeQuery
*修改用PreparedStatement子接口和executeUpdate
*/
public static Connection mysqlConnection() throws SQLException{//抛出SQL类异常 数据库连接方法
final String url = "jdbc:mysql://localhost:3306/test_java?serverTimezone=GMT";//数据库url
final Connection conn=DriverManager.getConnection(url, "root","ler210023");//DriverManager应用程序与数据库建立连接 尝试建立到给定的数据库url的连接
return conn;}
/*
* sql查询管理员名称是否已被注册
*/
public static boolean mysqlCheck1(String name) throws SQLException {
boolean flag=false;
Connection conn=mysqlConnection();//调用方法 负责与特定的数据库连接
Statement smt=null;//封装调用SQL语句对数据库进行访问的各类操作 提供执行SQL语句和获取数据库在执行完成后的返回结果
smt=conn.createStatement();//coonnection方法创建一个 Statement 对象,封装 SQL 语句发送给数据库,通常用来执行不带参数的 SQL 语句。
//mysql语句
String sql="SELECT * FROM adminers";
//将返回值传给rs
ResultSet rs=smt.executeQuery(sql);//Statement的executeQuery()方法来下达select指令以查询数据库 返回一个ResultSet对象
while(rs.next()) {//将光标从当前位置向前移动一行
String name1=rs.getString("name");
String password1=rs.getString("password");
if(name1.equals(name)) {//输入正确
return flag;//输入正确 返回false
}
}
smt.close();
rs.close();
flag=true;
return flag;//输入错误返回true
}
/*
* sql查询管理员 输入是否正确
*/
public static boolean mysqlCheck1(String name,String password) throws SQLException {
boolean flag=false;
Connection conn=mysqlConnection();//调用方法
Statement smt=null;
smt=conn.createStatement();//创建一个 Statement 对象,封装 SQL 语句发送给数据库,通常用来执行不带参数的 SQL 语句
//mysql语句
String sql="SELECT * FROM adminers";
ResultSet rs=smt.executeQuery(sql);//executeQuery()方法来下达select指令以查询数据库
while(rs.next()) {
String name1=rs.getString("name");
String password1=rs.getString("password");
if(name1.equals(name)&&password1.equals(password)) {//输入都正确
return flag;//输入正确 返回false
}
}
smt.close();
rs.close();
flag=true;
return flag;//输入错误返回true
}
/*
* sql插入注册管理员
*/
public static void mysqlInsert1(String name,String password) throws SQLException {//抛出SQL类异常
//连接数据库
Connection conn=mysqlConnection();
//PreparedStatement继承Statement prepareStatement对象防止sql注入的方式是把用户非法输入的单引号用\反斜杠做了转义,从而达到了防止sql注入的目的,安全性高
//可执行带参数的SQL语句,用?代替,其后对其进行赋值
PreparedStatement smt=null;
//判断单号是否已被使用
String sql="insert into adminers(name,password)values(?,?)";//?会被作为参数传入
smt=conn.prepareStatement(sql);//SQL 语句被预编译并存储在 PreparedStatement 对象中。
smt.setString(1, name);//将指定的参数设置为给定参数的值
smt.setString(2, password);
int result=smt.executeUpdate();//executeUpdate()是PreparedStatement对象众多的抽象方法中的一个 返回受影响的记录条数 返回值为int
if(result==1) {//判断插入数据成功
System.out.println("注册成功!");
}
else {
System.out.println("注册失败!");
}
smt.close();//关闭资源,释放内存
}
/*
* 注册管理员
*/
public static void add1() throws SQLException{
Scanner input=new Scanner(System.in);
System.out.println("请输入名字:");
String name=input.next();
System.out.println("请输入密码:");
String password=input.next();
boolean flag=mysqlCheck1(name);//检索名字是否被使用
if(flag==false) {//重复 返回flase
System.out.println("你已注册,请登陆");
}
else{
mysqlInsert1(name,password);
}}
/*
* sql查询用户名称是否已被注册
*/
public static boolean mysqlCheck2(String name) throws SQLException {
boolean flag=false;
Connection conn=mysqlConnection();
Statement smt=null;
smt=conn.createStatement();
//mysql语句
String sql="SELECT * FROM users";
//将返回值传给rs
ResultSet rs=smt.executeQuery(sql);
while(rs.next()) {
String name1=rs.getString("name");
if(name1.equals(name)) {//输入重复
return flag;//返回false
}
}
flag=true;
return flag;//为重复返回true
}
/*
* sql查询用户输入是否正确
*/
public static boolean mysqlCheck2(String name,String password) throws SQLException {
boolean flag=false;
Connection conn=mysqlConnection();
Statement smt=null;
smt=conn.createStatement();
//mysql语句
String sql="SELECT * FROM users";
ResultSet rs=smt.executeQuery(sql);
while(rs.next()) {
String name2=rs.getString("name");
String password2=rs.getString("password");
if(name2.equals(name)&&password2.equals(password)) {//检索输入是否正确
return flag;//输入正确返回false
}
}
flag=true;
return flag;//输入错误返回true
}
/*
* sql插入注册用户
*/
public static void mysqlInsert2(String name,String password) throws SQLException {//抛出SQL类异常
Connection conn=mysqlConnection();
PreparedStatement smt=null;
String sql="insert into users(name,password)values(?,?)";//?会被作为参数传入
smt=conn.prepareStatement(sql);
smt.setString(1, name);//设置
smt.setString(2, password);
int result=smt.executeUpdate();//executeUpdate()是PreparedStatement对象众多的抽象方法中的一个 返回受影响的记录条数 返回值为1或0
if(result==1) {//判断插入数据成功
System.out.println("注册成功!");
}
else {
System.out.println("注册失败!");
}
smt.close();//关闭资源,释放内存
}
/*
* 注册用户
*/
public static void add2() throws SQLException{
Scanner input=new Scanner(System.in);
System.out.println("请输入名字:");
String name=input.next();
System.out.println("请输入密码:");
String password=input.next();
boolean flag=mysqlCheck2(name);//调用方法 检索名字是否被使用
if(flag==false) {//重复 返回flase
System.out.println("你已注册,请登陆");
}
else{
mysqlInsert2(name,password);
}
}
/*
* 查询快递表检索快递单号是否被使用
*/
public static boolean mysqlCheck(String number) throws SQLException {
boolean flag=false;
Connection conn=mysqlConnection();
Statement smt=null;
smt=conn.createStatement();
//mysql语句
String sql="SELECT * FROM express";
ResultSet rs=smt.executeQuery(sql);
while(rs.next()) {
String number1=rs.getString("number");
if(number1.equals(number)) {//比较查询的单号与输入的单号判断单号是否已被使用
flag=true;
return flag;//已被使用返回true
}
}
return flag;//未被使用返回flag
}
/*
* sql输入快递信息
*/
public static void mysqlInsert(String number,String a_date,String t_date,String K_name) throws SQLException {//抛出SQL类异常
boolean flag=mysqlCheck(number);//调用方法 判断是否单号被使用
if(flag) {//真,则已被使用
System.out.println("该单号已被使用");
}
//未被使用
else {
Connection conn=mysqlConnection();
//表示一条预编译过的 SQL 语句
PreparedStatement smt=null;
String sql="insert into express(number,a_date,t_date,k_name)values(?,?,?,?)";//?会被作为参数传入
smt=conn.prepareStatement(sql);
smt.setString(1, number);//对参数进行设置
smt.setString(2, a_date);
smt.setString(3, t_date);
smt.setString(4, K_name);
int result=smt.executeUpdate();
if(result==1) {//判断插入数据成功
System.out.println("分配快递成功");
}
else {
System.out.println("分配快递失败");
}
smt.close();//关闭资源,释放内存
}
}
/*
* 添加快递信息
*/
public static void add() throws SQLException{
Scanner input=new Scanner(System.in);
while(true) {
System.out.println("温馨提示:输入任意数字表示添加快递,0为不添加");
if(input.nextInt()==0) {
break;
}
else {
System.out.println("请输入快递单号:");
String number=input.next();
System.out.println("请输入快递到达时间:");
String a_date=input.next();
System.out.println("请输入快递提取时间:");
String t_date=input.next();
System.out.println("请输入快递的所属人的名称:");
String k_name=input.next();
mysqlInsert(number, a_date, t_date, k_name);
}}}
/*
* 查询所有快递
*/
public static void mysqlShow() throws SQLException {
Connection conn=mysqlConnection();
Statement smt=null;
smt=conn.createStatement();
String sql="SELECT * FROM express";
ResultSet rs=smt.executeQuery(sql);
//循环输出快递信息
while(rs.next()) {
System.out.println("单号:"+rs.getString("number")+"到达日期:"+rs.getString("a_date")+"提取日期"+rs.getString("t_date")+"姓名:"+rs.getString("k_name"));
}
rs.close();
smt.close();
}
/*
* sql更新快递信息
*/
public static void mysqlUpdate(String number1,String number,String a_date,String t_date,String k_name) throws SQLException {
Connection conn=mysqlConnection();
PreparedStatement smt=null;
String sql="update express set number=?,a_date=?,t_date=?,k_name=? where number=?";//?会被作为参数传入
smt=conn.prepareStatement(sql);
smt.setString(1, number);//输入修改信息
smt.setString(2, a_date);
smt.setString(3, t_date);
smt.setString(4, k_name);
smt.setString(5, number1);//原单号
int result=smt.executeUpdate();
if(result==1) {//判断插入数据成功
System.out.println("快递修改成功");
}
else {
System.out.println("快递修改失败");
}
smt.close();
}
/*
* 修改快递信息
*/
public static void alter() throws SQLException {
Scanner input=new Scanner(System.in);
System.out.println("请输入要修改的快递单号:");//原单号
String number1=input.next();
System.out.println("请输入新的快递单号:");//新单号
String number=input.next();
System.out.println("请输入快递到达时间:");
String a_date=input.next();
System.out.println("请输入快递提取时间:");
String t_date=input.next();
System.out.println("请输入快递的所属人的名称:");
String k_name=input.next();
mysqlUpdate(number1,number, a_date, t_date, k_name);//调用更新方法
}
/*
* sql中查看自己的快递
*/
public static void sqlFind(String name) throws SQLException {
Connection conn=mysqlConnection();
Statement smt=null;
smt=conn.createStatement();
String sql="SELECT * FROM express";
ResultSet rs=smt.executeQuery(sql);
//循环输出快递信息
int count=0;
while(rs.next()) {
String k_name=rs.getString("k_name");
if(k_name.equals(name)) {
System.out.println("请及时取件");
System.out.println("单号:"+rs.getString("number")+"到达日期:"+rs.getString("a_date")+"提取日期"+rs.getString("t_date")+"姓名:"+rs.getString("k_name"));
count++;
}
}
if(count==0) {
System.out.println("暂无你的快递");
}
smt.close();
rs.close();
}
/*
* 查询快递
*/
public static void findName() throws SQLException {
Scanner input=new Scanner(System.in);
System.out.println("请输入你的姓名");
String name=input.next();
sqlFind(name);
}
/*
* sql中删除自己的快递
*/
public static void sqlDelete(String number) throws SQLException {
Connection conn=mysqlConnection();
PreparedStatement smt=null;
String sql="delete from express where number=?";//?会被作为参数传入
smt=conn.prepareStatement(sql);
smt.setString(1, number);
int result=smt.executeUpdate();//对于CREATETABLE或DROPTABLE等不操作行的语句,executeUpdate的返回值总为零
if(result!=0) {
System.out.println("取件成功!");
}
else {
System.out.println("取件失败!");
}
smt.close();
}
/*
* 领取快递
*/
public static void takeAway() throws SQLException {
Scanner input=new Scanner(System.in);
System.out.println("请输入你的快递单号");
String number=input.next();
sqlDelete(number);
}
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
/*
* 驱动
*/
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();//打印输出异常
}
Scanner input=new Scanner(System.in);
Views v=new Views();
//欢迎
v.welcome();
while(true) {
//主菜单
int menu=v.menu();
switch (menu) {
case 0://退出
System.out.println("欢迎下次光临!");
return;
case 1://注册管理员
add1();
break;
case 2://注册普通用户
add2();
break;
case 3://管理员登陆
System.out.println("登陆请输入姓名:");
String n1=input.nextLine();
System.out.println("请输入密码:");
String p1=input.nextLine();
boolean flag1=mysqlCheck1(n1,p1);//检索是否输入正确
if(flag1) {//输入错误 返回true
System.out.println("输入错误");
break;
}
//输入正确
else {
System.out.println("登陆成功");
while(true) {
int gmenu=v.gMenu();
switch(gmenu) {
case 0://退出
return;
case 1://分配快递
add();
break;
case 2://查看所有快递
System.out.println("所有快递如下:");
mysqlShow();
break;
case 3://修改快递
alter();
break;}
if(gmenu==4)//返回上一步
break;}
}
break;
case 4://普通用户登录
System.out.println("登陆请输入姓名:");
String n2=input.nextLine();
System.out.println("请输入密码:");
String p2=input.nextLine();
boolean flag2=mysqlCheck2(n2,p2);
if(flag2) {//真,即输入错误
System.out.println("输入错误");
break;
}
//输入正确
else{
System.out.println("登陆成功");
while(true) {
int pmenu=v.pMenu();
switch(pmenu) {
case 0://退出
return;
case 1://查看快递
findName();
break;
case 2://取走快递
takeAway();
break;}
if(pmenu==3)//返回上一步
break;}
}
break;
}
}
}}
/*
* 管理员菜单
*/
public int gMenu() {
System.out.println("------你好,管理员-------");
System.out.println("1.快递分配");
System.out.println("2.查看所有快递");
System.out.println("3.修改快递信息");
System.out.println("4.返回上一步");
System.out.println("0.退出");
System.out.println("---------------------");
System.out.println("请根据提示,选择业务");
int c=input.nextInt();
if(c<0||c>4) {//输入异常
System.out.println("输入异常,请重新输入");
return gMenu();
}
return c;
}
/*
* 用户菜单
*/
public int pMenu() {
System.out.println("------你好,用户员-------");
System.out.println("请根据提示,输入功能序号");
System.out.println("1.查看有否有快递");
System.out.println("2.取走快递");
System.out.println("3.返回上一步");
System.out.println("0.退出");
System.out.println("---------------------");
int c=input.nextInt();
if(c<0||c>3) {//输入异常
System.out.println("输入异常,请重新输入");
return pMenu();
}
return c;
}
}
附数据库
CREATE TABLE `adminers` (
`name` varchar(10) NOT NULL COMMENT 'name',
`password` varchar(10) DEFAULT NULL COMMENT 'password',
PRIMARY KEY (`name`)
)
CREATE TABLE `express` (
`number` varchar(10) NOT NULL COMMENT 'number',
`a_date` varchar(10) DEFAULT NULL COMMENT 'a_date',
`t_date` varchar(10) DEFAULT NULL COMMENT 't_date',
`k_name` varchar(10) DEFAULT NULL COMMENT 'k_name',
PRIMARY KEY (`number`)
)
CREATE TABLE `users` (
`name` varchar(10) NOT NULL COMMENT 'name',
`password` varchar(10) DEFAULT NULL COMMENT 'password',
PRIMARY KEY (`name`)
)