本次主要是利用自己封装好的,jdbc连接工具实现对数据库数据的增删改查(也就是数据持久化)
在下面给出的是主要代码,数据库中对应的两张表的实体类代码没有给出!
jdbc工具封装代码如下:
package stuifo.Tools;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.beanutils.BeanUtils;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
public class jdbcTool {
public static Connection conn;
public static PreparedStatement stmt;
public static ResultSet rs;
public static DataSource dataSource;
static {
InputStream resourceAsStream = jdbcTool.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
//加载流文件
try {
properties.load(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
//获取德鲁伊配置
try {
dataSource = DruidDataSourceFactory.createDataSource(properties);
conn = dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
//关闭文件流
if (resourceAsStream != null) {
try {
resourceAsStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 获取预处理对象
* @param sql 调用方法传过来
* @param parameters 调用方法传过来
* @return
* @throws SQLException
*/
public static PreparedStatement getPreparedStatement(String sql, Object... parameters) throws SQLException {
stmt = conn.prepareStatement(sql);
ParameterMetaData parameterMetaData = stmt.getParameterMetaData();
int count = parameterMetaData.getParameterCount();
if (count != 0 && parameters != null && parameters.length == count)
for (int i = 0; i < count; i++) {
stmt.setObject(i + 1, parameters[i]);
}
return stmt;
}
/**
* 用于关闭Connection、PreparedStatement、ResultSet资源
* @param resources
*/
public static void closeAll(AutoCloseable... resources) {
if (resources != null && resources.length > 0) {
Arrays.stream(resources).forEach(source -> {
if (source != null) {
try {
source.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
/**
* 增加、删除、更新操作
* @param sql 按需求传参数
* @param parameters 设置sql中的?
* @return
* @throws SQLException
*/
public static int cru(String sql, Object... parameters) throws SQLException {
stmt = getPreparedStatement(sql, parameters);
int i = stmt.executeUpdate();
jdbcTool.closeAll(stmt, rs);
return i;
}
/**
* 查询操作
* @param sql
* @param parameters
* @return
* @param <T>
* @throws SQLException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static <T> List<T> select(String sql, Class<T> cls,Object... parameters) throws SQLException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
ArrayList<T> arrayList = new ArrayList<>();
// String table = sql.split("")[3];
// Class<?> cls = Class.forName(table);
T t = null;
stmt = jdbcTool.getPreparedStatement(sql, parameters);
rs = stmt.executeQuery();
ResultSetMetaData metaData = rs.getMetaData();
int count = metaData.getColumnCount();
while (rs.next()) {
t = cls.newInstance();//实例化一个bean的空对象,用来封装数据
for (int i = 1; i <= count; i++) {
BeanUtils.setProperty(t, metaData.getColumnName(i), rs.getObject(i));
}
arrayList.add(t);
}
jdbcTool.closeAll(stmt, rs);
return arrayList;
}
}
项目入口代码如下:
package stuifo;
import stuifo.Model.admin;
import stuifo.Tools.codeTool;
import stuifo.Tools.jdbcTool;
import stuifo.UserView.UserUi;
import java.util.List;
import java.util.Scanner;
public class StudentRun {
public static void main(String[] args) throws Exception {
System.out.println("--------------------------------------");
System.out.println("**欢迎使用学生信息管理系统***");
System.out.println("--------------------------------------");
System.out.println("----请输入管理员的账号和密码进行登陆:-----");
Scanner scanner = new Scanner(System.in);
System.out.print("账号|:");
String user = scanner.next();
System.out.print("密码|:");
String pw = scanner.next();
String code = codeTool.code();
System.out.print("验证码(" + code + ")|:");
String userCode = scanner.next();
if (!userCode.equals(code)) {
System.out.println("验证码错误");
} else if (checkLogin(user, pw)) {
System.out.println("*****请选择你的业务操作******");
//生成操作界面 用户表现层
UserUi useUi = new UserUi();
useUi.UI();
} else {
System.out.println("账号或密码错误!");
}
}
public static boolean checkLogin(String user, String pw) throws Exception {
List<admin> login = jdbcTool.select("select * from admin where username = ? AND password = ?", admin.class, user, pw);
if (login.size() > 0) {
return true;
} else return false;
}
}
业务实现代码如下:
package stuifo.UserView;
import stuifo.Tools.jdbcTool;
import stuifo.Model.student;
import java.util.List;
import java.util.Scanner;
/**
* 表现层
*/
public class UserUi {
public static int num = 0;
public static int num1 = 0;
public static int id = 1;
public void UI() throws Exception {
jdbcTool jt = new jdbcTool();
boolean flag = true;
while (flag) {
System.out.println("1.查询所有学生信息");
System.out.println("2.添加学生信息");
System.out.println("3.删除学生信息");
System.out.println("4.修改学生信息");
System.out.println("5.查找学生信息");
System.out.println("0.退出系统");
Scanner scanner = null;
int num = 0;
while (true) {
try {
UserUi.num1 = 0;
System.out.println("请输入你的业务数字");
scanner = new Scanner(System.in);
num = scanner.nextInt();
break;
} catch (Exception e) {
System.out.println("请输入正确的业务数字!");
}
}
switch (num) {
case 1: {
List<student> stu = jt.select("select * from student", student.class);
for (student o : stu) {
System.out.println(o);
}
System.out.println("成功查询" + stu.size() + "条数据");
}
break;
case 2: {
System.out.println("请输入学号:");
int sno = scanner.nextInt();
System.out.println("请输入姓名:");
String name = scanner.next();
System.out.println("请输入性别:");
String sex = scanner.next();
System.out.println("请输入年龄:");
int age = scanner.nextInt();
System.out.println("请输入专业:");
String major = scanner.next();
System.out.println("成功插入" + jt.cru("insert into student values(?,?,?,?,?)", sno, name, sex, age, major) + "条数据");
}
break;
case 3: {
System.out.println("请输入要删除的学号:");
int sno = scanner.nextInt();
int i = jt.cru("delete from student where sno=?", sno);
if (i > 0) {
System.out.println("成功删除" + i + "条数据");
} else System.out.println("信息不存在");
}
break;
case 4: {
System.out.println("请输入要修改的学号:");
int sno = scanner.nextInt();
List<student> stu = jt.select("select * from student where sno=?", student.class, sno);
if (stu.size()>0) {
for (student o : stu) {
System.out.println(o);
}
System.out.println("请输入要转入的专业:");
String major = scanner.next();
jt.cru("update student set major=? where sno=?",major,sno);
System.out.println("成功修改" + stu.size() + "条数据");
} else System.out.println("信息不存在!");
}
break;
case 5: {
System.out.println("请输入要查找的姓名:");
String name = scanner.next();
List<student> stu = jt.select("select * from student where name=?", student.class, name);
if (stu.size() > 0) {
for (student o : stu) {
System.out.println(o);
}
System.out.println("查询到" + stu.size() + "条数据");
} else System.out.println("信息不存在!");
}
break;
case 0:
System.out.println("退出系统");
flag = false;
break;
}
}
}
}
这里放一个自己写的生成验证码的工具:
package stuifo.Tools;
import java.util.Random;
public class codeTool {
public static String code() {
String res = "";
char[] str = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'A', 'b', 'B', 'c', 'd', 'F'};
Random random = new Random();
for (int i = 0; i < 4; i++) {
int anInt = random.nextInt(16);
res += str[anInt];
}
return res;
}
}
整个项目代码在我的gitee上有上传,看主页自取