一、JDBC:mysql数据库和Java的连接
第一步:加载mysql驱动
第二步:连接数据库
第三步:创建执行环境
第四步:执行语句
public class JDBC {
public static void main(String[] args) {
try {
//第一步:加载mysql驱动
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("加载mysql驱动成功");
//第二步:连接数据库
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/data", "root", "20040705lxt");
System.out.println("连接数据库成功");
//第三步:创建执行环境
Statement statement=conn.createStatement();
//第四步:执行语句
ResultSet result=statement.executeQuery("SELECT *FROM info");
while(result.next()){
System.out.print("id:"+result.getInt("id")+" ");
System.out.print("username:"+result.getString("username")+" ");
System.out.print("password:"+result.getString("password")+" ");
System.out.print("type:"+result.getInt("type")+" ");
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、JDBCUtils和db.properties
1.db.properties
定义四个常量:String类型的数据不需要加双引号
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/data
username=root
password=20040705lxt
2.JDBCUtils
1:定义四个私有的静态全局变量:driver,URL,username,password
private static String driver;
private static String url;
private static String username;
private static String password;
2:获取四个静态全局变量的值和加载mysql驱动
第一步:读取db.properties文件
第二步:创建properties类型对象
第三步:加载文件
第四步:获取四个变量的值
第五步:加载mysql驱动
//第一步:读取db.properties文件
InputStream is=JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
//第二步:创建property类型对象
Properties p=new Properties();
try {
//第三步:加载对象p
p.load(is);
//第四步:获取四个全局变量的值
driver=p.getProperty("driver");
url=p.getProperty("url");
username=p.getProperty("username");
password=p.getProperty("password");
//第五步:加载mysql驱动
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
3:数据库的连接,获取连接对象
//连接数据库,获取连接对象
public static Connection getConnection(){
try {
return DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
4:释放资源
//释放资源
public static void close(Connection conn, Statement statement, ResultSet result){
try {
if(conn!=null){
conn.close();
conn=null;
}
if(statement!=null){
statement.close();
statement=null;
}
if(result!=null) {
result.close();
result = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
三、菜单视图
1:定义静态全局变量input
//定义输入的全局变量input
private static Scanner input=new Scanner(System.in);
2:菜单页面
学生和管理员共同可见的首页菜单
学生系统的首页功能菜单
管理员系统首页功能菜单
添加学生信息的菜单
删除学生信息的菜单
修改学生信息的菜单
查询学生信息的菜单
/*
学生管理系统的首页视图:管理员和学生都可见
根据输入的账号和密码在数据库中进行查询,得到用户的类型,根据类型12进入不同的菜单页面
*/
public static User indexView(){
System.out.println("******************************************************");
System.out.println("************\t\t学生管理系统\t\t*************");
System.out.println("************\t\t请根据提示操作\t\t*************");
System.out.println("************\t\t请输入账号:\t\t*************");
String username= input.nextLine();
System.out.println("************\t\t请输入密码\t\t*************");
String password= input.nextLine();
return new User(username,password);
}
/*
管理员首页视图:仅管理员可见
根据得到的选项进入不同的功能页面
*/
public static int ManagerMenuView(){
System.out.println("******************************************************");
System.out.println("************\t\t欢迎管理员回家\t\t*************");
System.out.println("************\t\t请根据提示操作\t\t*************");
System.out.println("************\t\t0.退出\t\t*************");
System.out.println("************\t\t1.添加学生信息\t\t*************");
System.out.println("************\t\t2.删除学生信息\t\t*************");
System.out.println("************\t\t3.修改学生信息\t\t*************");
System.out.println("************\t\t4.查询学生信息\t\t*************");
System.out.println("请输入您要进行的操作");
int select=input.nextInt();
if(select>4||select<0){
System.out.println("输入错误,请重新输入");
return ManagerMenuView();//回调:表示再次回到函数中
}else{
return select;//返回管理员需要进行操作的选项
}
}
/*
学生首页视图:仅学生可见
根据得到的选项进入不同的功能页面
*/
public static int StudentMenuView(){
System.out.println("******************************************************");
System.out.println("************\t\t欢迎来到学生查询系统\t\t*************");
System.out.println("************\t\t请根据提示操作\t\t*************");
System.out.println("************\t\t0.退出\t\t*************");
System.out.println("************\t\t1.修改学生账户密码\t\t*************");
System.out.println("******************************************************");
System.out.println("请输入您要进行的操作");
int select= input.nextInt();
if(select<0||select>1){
System.out.println("输入错误,请重新输入");
return StudentMenuView();//回调:表示再次回到函数中
}else{
return select;
}
}
/*
添加学生信息菜单页面:管理员专有
*/
public static User addMenuView(){
System.out.println("******************************************************");
System.out.println("************\t\t请根据提示操作\t\t*************");
System.out.println("请输入新添加的账号");
String username= input.nextLine();
System.out.println("请输入新添加的密码");
String password=input.nextLine();
System.out.println("******************************************************");
return new User(username,password);
}
/*
删除学生信息菜单页面:管理员专有
根据用户名来删除学生账号信息
*/
public static String deleteMenuView(){
System.out.println("******************************************************");
System.out.println("************\t\t请根据提示操作\t\t*************");
System.out.println("请输入要删除学生账号用户名");
String username= input.nextLine();
System.out.println("******************************************************");
return username;
}
/*
修改学生信息菜单页面:管理员和学生均有
*/
public static User UpdateMenuView(){
System.out.println("******************************************************");
System.out.println("************\t\t请根据提示操作\t\t*************");
System.out.println("请输入账号");
String username= input.nextLine();
System.out.println("请输入新的密码");
String password= input.nextLine();
System.out.println("******************************************************");
return new User(username,password);
}
/*
查询学生信息菜单页面:管理员专有
根据学生账号的用户名来查询学生信息
*/
public static String selectMenuView(){
System.out.println("******************************************************");
System.out.println("************\t\t请根据提示操作\t\t*************");
System.out.println("请输入要查询的学生账号");
String username= input.nextLine();
System.out.println("******************************************************");
return username;
}
四、用户类
ID,username,password,type四个属性
public class User {
int id;//ID
String username;//用户名
String password;//密码
int type;//类型1-管理员权限 2-学生权限
public User() {
}
public User(int id, String username, String password, int type) {
this.id = id;
this.username = username;
this.password = password;
this.type = type;
}
public User(String username,String password){
this.username=username;
this.password=password;
}
public User(String username,String password,int type){
this.username = username;
this.password = password;
this.type = type;
}
/**
* 获取
* @return id
*/
public int getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(int id) {
this.id = id;
}
/**
* 获取
* @return username
*/
public String getUsername() {
return username;
}
/**
* 设置
* @param username
*/
public void setUsername(String username) {
this.username = username;
}
/**
* 获取
* @return password
*/
public String getPassword() {
return password;
}
/**
* 设置
* @param password
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取
* @return type
*/
public int getType() {
return type;
}
/**
* 设置
* @param type
*/
public void setType(int type) {
this.type = type;
}
public String toString() {
return "User{id = " + id + ", username = " + username + ", password = " + password + ", type = " + type + "}";
}
}
五、方法的接口和方法的具体实现
1. 登陆方法
2. 添加学生信息方法
3. 删除学生信息方法
4. 修改学生信息方法
5. 查询学生修改信息方法
public interface UserDao {
/*
0登陆操作:
-1表示登陆失败,1表示管理员登陆成功,2表示学生登陆成功
*/
int login(User user);
/*
1增加学生信息的操作
通过添加学生信息功能菜单页面的返回值:User得到的password和username,类型都是2,表示学生,id在mysql中进行自增
方法返回值是true or false
*/
boolean insert(User user);
/*
2删除学生信息的操作
通过删除学生信息功能菜单页面的返回值:待删除学生账号的用户名
方法返回值是true or false
*/
boolean delete(String uname);
/*
3修改学生信息的操作
通过修改学生信息功能菜单页面的返回值:学生的用户名和修改后的新密码
方法返回值是true or false
*/
boolean update(User user);
/*
4查询学生信息的操作
通过查询学生信息功能菜单页面的返回值:学生的用户名
方法的返回值是:用户类
*/
User select(String uname);
}
方法一:登陆方法login
参数:管理员和学生共同可见页面方法返回得到的user(username,password)
返回值:-1代表登陆失败,1代表管理员登陆,2表示学生登陆
目标:根据用户名和密码得到该账户的type,从而进入不同的功能菜单页面(管理员和学生)
第一步:连接数据库,获取连接对象
第二步:创建预编译环境
第三步:设置执行语句中的两个参数
第四步:执行语句:根据用户名和密码进行查询得到类型
public static final String SQL_USER_LOGIN="SELECT type FROM info WHERE username=? AND `password`=?";//登陆方法的执行语句
@Override
public int login(User user) {
//第一步:连接数据库,获取连接对象
Connection conn= JDBCUtils.getConnection();
PreparedStatement preparedStatement=null;
ResultSet result=null;
try {
//第二步:创建预编译环境
preparedStatement=conn.prepareStatement(SQL_USER_LOGIN);
//第三步:设置执行语句中的参数
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
//第四步:执行语句
result=preparedStatement.executeQuery();//根据用户名和密码查询用户
while(result.next()){
int type=result.getInt("type");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
JDBCUtils.close(conn,preparedStatement,result);
}
return -1;
}
方法二:添加学生信息
参数是管理员可见的添加学生信息功能菜单页面返回的用户名和密码
返回值是是否受影响的条数大于0
public static final String SQL_USER_INSERT="INSERT INTO info VALUES(id,?,?,2)";//添加学生信息的执行语句,id自增,类型就是添加学生信息
@Override
public boolean insert(User user) {
//第一步:连接数据库,获取连接对象
Connection conn=JDBCUtils.getConnection();
PreparedStatement preparedStatement=null;
ResultSet result=null;
try {
//第二步:创建预编译环境
preparedStatement=conn.prepareStatement(SQL_USER_INSERT);
//第三步:设置执行语句中的两个参数
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
//第四步:执行语句
int affectedLine=preparedStatement.executeUpdate();//表示受到影响的条数
if(affectedLine>0){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//第五步:释放资源
JDBCUtils.close(conn,preparedStatement,null);
}
return false;
}
方法三:删除学生信息
参数:删除学生信息页面返回得到的学生账户的用户名
返回值:是否受影响的条数大于0
public static final String SQL_USER_DELETE="DELETE FROM info WHERE username=?";//删除学生信息的执行语句,通过用户名删除学生信息
@Override
public boolean delete(String uname) {
//第一步:连接数据库,获取连接对象
Connection conn=JDBCUtils.getConnection();
PreparedStatement preparedStatement=null;
try {
//第二步:创建预编译环境
preparedStatement= conn.prepareStatement(SQL_USER_DELETE);
//第三步:设置参数
preparedStatement.setString(1, uname);
//第四步:执行语句
int affectedLine=preparedStatement.executeUpdate();
if(affectedLine>0){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//第五步:释放资源
JDBCUtils.close(conn, preparedStatement, null);
}
return false;
}
方法四:修改学生信息
参数:修改学生菜单页面返回的user(username,password)
返回值:是否受影响的条数大于0
public static final String SQL_USER_UPDATE="UPDATE info SET `password`=? WHERE username=?";//修改学生信息的执行语句
@Override
public boolean update(User user) {
//第一步:连接数据库,获取连接对象
Connection conn=JDBCUtils.getConnection();
PreparedStatement preparedStatement=null;
try {
//第二步:创建预编译环境
preparedStatement= conn.prepareStatement(SQL_USER_UPDATE);
//第三步:设置参数
preparedStatement.setString(1, user.getPassword());
preparedStatement.setString(2, user.getUsername());
//第四步:执行语句
int affectedLine=preparedStatement.executeUpdate();
if(affectedLine>0){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//第五步:释放资源
JDBCUtils.close(conn, preparedStatement, null);
}
return false;
}
方法五:查询学生信息
参数:查询学生信息功能菜单的返回值学生账户的用户名
返回值:用户类
public static final String SQL_USER_SELECT="SELECT* FROM info WHERE username=?";//查询学生信息的执行语句
@Override
public User select(String uname) {
//第一步:连接数据库,获取连接对象
Connection conn=JDBCUtils.getConnection();
PreparedStatement preparedStatement=null;
ResultSet result=null;
int id=0;
String username=null;
String password=null;
int type=0;
try {
//第二步:创建预编译环境
preparedStatement=conn.prepareStatement(SQL_USER_SELECT);
//第三步:设置参数
preparedStatement.setString(1, uname);
//第四步:执行语句
result=preparedStatement.executeQuery();
while(result.next()){
id= result.getInt("id");
username=result.getString("username");
password=result.getString("password");
type= result.getInt("type");
}
return new User(id,username,password,type);
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
JDBCUtils.close(conn,preparedStatement,result);
}
return null;
}
六、主菜单控制:MAIN
public class Control {
public static void managerServer(){
UserDao_Imp userDao_imp=new UserDao_Imp();
boolean flag=false;
while(true) {
int select = View.ManagerMenuView();//展示管理员功能主页面
switch (select) {
case 0: {
System.exit(-1);
break;
}
case 1: {
User user = View.addMenuView();
flag = userDao_imp.insert(user);
if (flag == true) {
System.out.println("添加学生信息成功");
}
break;
}
case 2: {
String uname = View.deleteMenuView();
flag = userDao_imp.delete(uname);
if (flag == true) {
System.out.println("删除学生信息成功");
}
break;
}
case 3: {
User user = View.UpdateMenuView();
flag = userDao_imp.update(user);
if (flag == true) {
System.out.println("修改学生信息成功");
}
break;
}
case 4: {
String uname = View.selectMenuView();
User user = userDao_imp.select(uname);
System.out.println(user);
break;
}
default: {
break;
}
}
}
}
public static void studentServer(){
UserDao_Imp userDao_imp=new UserDao_Imp();
int select=View.StudentMenuView();
boolean flag=false;
while(true){
switch(select){
case 0:{
System.exit(-1);
break;
}
case 1:{
User user=View.UpdateMenuView();
flag=userDao_imp.update(user);
if(flag==true){
System.out.println("修改学生信息成功");
}
break;
}
default:{
break;
}
}
}
}
public static void main(String[] args) {
while(true){
//展示学生管理系统的主菜单:管理员学生都可见
User user=View.indexView();
//根据登陆的类型展示不同的页面
UserDao_Imp userDao_imp=new UserDao_Imp();
int type=userDao_imp.login(user);
if(type==1){//展示管理员功能页面
managerServer();
}else if(type==2){
studentServer();
}else{
System.out.println("不存在该登陆人的信息,无法登陆");
}
}
}
}