package cn.mxl.jdbc;
import java.sql.Connection;
import java.sql.DriverAction;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class MenuStudent extends jdbcUtil{
//所有方法都能时候用输入流对象
public static Scanner input = new Scanner(System.in);
//主函数方法main
public static void main(String[] args) {
//直接进入一级菜单
one();
}
/**
* 一级菜单
*/
private static void one() {
System.out.println("1.注册");
System.out.println("2.登录");
System.out.println("3.退出");
int num = input.nextInt();
switch (num) {
case 1://注册
zhuce();
break;
case 2://登录
denglu();
break;
case 3://退出
break;
default:
System.out.println("输入错误重新输入");
one();
break;
}
}
/**
* 登录
*/
private static void denglu() {
try {
System.out.println("请输入用户名");
String name = input.next();
System.out.println("请输入密码");
String pwd = input.next();
//sql语句
String sql="SELECT * FROM student WHERE name=? AND password=?";
Object[] params = {name,pwd};
rs=myExcuteQuery(sql,params);
if (rs.next()) {//证明有数据
System.out.println("登录成功");
two();//二级菜单
}else {
System.out.println("请重新登录");
denglu();
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {//释放资源
closeConnection();
}
}
/**
* 二级菜单
*/
private static void two() {
System.out.println("请选择序号输入");
System.out.println("1.查询所有爱好");
System.out.println("2.修改密码");
System.out.println("3.删除用户");
int num = input.nextInt();
switch (num) {
case 1:
//查询所有爱好
suoyou();
break;
case 2:
//修改密码
Xaihao();
break;
case 3:
//删除用户
Saihao();
break;
default:
System.out.println("输入错误重新输入");
two();
break;
}
}
/**
* 查询所有
*/
private static void suoyou() {
try {
//创建sql语句
String sql ="SELECT * FROM student ";
rs=myExcuteQuery(sql);
System.out.println("ID\t用户名\t密码\t爱好");
//循环获取每一个student对象
while (rs.next()) {
System.out.print(rs.getString("NO")+"\t");
System.out.print(rs.getString("name")+"\t");
System.out.print(rs.getString("password")+"\t");
System.out.println(rs.getString("aihao"));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
closeConnection();
}
}
/**
* 删除用户
*/
private static void Saihao() {
System.out.println("请输入你要删除的用户");
String name = input.next();
try {
String sql ="DELETE FROM student WHERE `name`=?";
Object []param= {name};
int row = myExcuteUpdate(sql,param);
if (row>0) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
two();//返回二级菜单
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 修改密码
*/
private static void Xaihao() {
System.out.println("请输入账号");
String name=input.next();
System.out.println("请输入原密码");
String pwd = input.next();
System.out.println("请输入新密码");
String pwd2 = input.next();
try {
//创建sql语句
String sql = "UPDATE student SET `password`=? WHERE `password`=?";
Object []param = {pwd,pwd2};
int row =myExcuteUpdate(sql,param);
if (row>0) {
System.out.println("新密码更改成功");
}else {
System.out.println("新密码更改失败");
}
two();//返回二级菜单
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 注册
*/
private static void zhuce() {
System.out.println("请输入ID");
String ID = input.next();
System.out.println("请输入用户名");
String name = input.next();
System.out.println("请输入密码");
String pwd = input.next();
try {//加载驱动
getConnection();
//需要的sql语句
String sql="INSERT INTO student(`NO`,`name`,`password`)VALUES (?,?,?);";
Object [] param = {ID,name,pwd};
int row = myExcuteUpdate(sql,param);
if (row>0) {
System.out.println("注册成功");
one();
}else {
System.out.println("注册失败");
zhuce();//再次注册
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package cn.mxl.jdbc;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigManager {
//01.创建本类的静态变量
private static ConfigManager manager = new ConfigManager();
private static Properties properties;
//02.私有化构造
private ConfigManager() {
//实例化Properties对象
properties = new Properties();
InputStream stream = ConfigManager.class.getClassLoader()
.getResourceAsStream("jdbc.properties");
//加载properties文件
try {
properties.load(stream);
} catch (IOException e) {
e.printStackTrace();
}finally {//关闭流
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//03.对外提供访问接口
public static synchronized ConfigManager getInstance() {
return manager;
}
//04.让用户传递一个文件中的key 我们返回文件中的value
public static String getValue(String key) {
return properties.getProperty(key);
}
}
package cn.mxl.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 所有JDBC操作数据库的工具类
* 01.数据库四要素的获取
* 02.开启连接
* 03.关闭连接
* 04.公共的增删改
* 05.公共的查询
*/
public class jdbcUtil {
public static Connection conn = null;//便于我们释放资源
public static PreparedStatement ps = null;
public static ResultSet rs = null;//查询数据返回的结果集
/**
* 连接数据库
*/
public static boolean getConnection() throws ClassNotFoundException,
SQLException {
try {
//通过反射机制获取数据库驱动包
Class.forName(ConfigManager.getInstance().getValue("jdbc.driver"));
//通过DriverManager获取Conncetion连接对象
conn=DriverManager.getConnection(ConfigManager.getInstance().getValue("jdbc.url"),
ConfigManager.getInstance().getValue("jdbc.userName"),
ConfigManager.getInstance().getValue("jdbc.passWord"));
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 释放资源
*/
public static void closeConnection() {
if (ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 公共的增删改
*
* 我们可以确定的是有sql语句!因为只有sql语句才能操作数据库!
* 但是我们无法确定的是:
* 01.参数的个数
* 02.参数的类型
*
* 我们应该是考虑有参数 还是 没有参数 ? 有参数的!
* 考虑有1个参数还是有N个参数? 有N个参数的!
*
* 用户需要传递一个执行的sql语句
* 再擦混地一个参数列表
* @throws SQLException
* @throws ClassNotFoundException
*/
public static int myExcuteUpdate(String sql,Object...param) throws ClassNotFoundException, SQLException {
int rowNum = 0;
if (getConnection()) {//证明有连接
ps=conn.prepareStatement(sql);
//给sql语句中的 ? 一个一个赋值
for (int i= 0; i< param.length; i++) {
ps.setObject(i+1, param[i]);
}
rowNum = ps.executeUpdate();
}
closeConnection();//释放资源
return rowNum;
}
/**
* 公共的查询
* @throws SQLException
* @throws ClassNotFoundException
*/
public static ResultSet myExcuteQuery(String sql,Object...param)
throws ClassNotFoundException, SQLException {
if (getConnection()) {//证明有连接
ps=conn.prepareStatement(sql);
for (int i = 0; i < param.length; i++) {
ps.setObject(i+1, param[i]);
}
rs=ps.executeQuery();
}
/**
* 在这里不能实现关闭资源,因为子类中有rs的具体使用 还需要用到连接
* 子类使用完毕,自行了断!
*/
return rs;
}
}
创建一个和src一样的文件夹,然后在文件夹里创建jdbc.properties 后缀的文件,存储jdbc连接数据库的四大要素
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jdbc
jdbc.userName=meng
jdbc.passWord=3588105