Java随机点名系统 [数据库版]

从应用案例入手:通过连接数据库做一个随机点名系统;

首先进行分析:

1、要展示数据库中的学生信息:姓名;

2、随机点名出某一个学生,并在对应该学生的count次数中+1;

3、判断是否继续点名(Y/N);

4、最后结束时,显示所有学生及对应点名的次数;

给出数据库信息:该数据库为MySQL,表名为student;后续Java连接数据库均是MySQL;

           

直接上代码及测试结果:因为博主是小白,代码有许多可改进之处,欢迎大家指出哈哈哈—:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

import com.hym.utils.CloseUtils;
import com.hym.utils.DBUtils;

public class RollCallTest {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		do {
			System.out.println("展示多个学生的信息: ");
			// 使用list集合去接收结果;
			List<String> list = getInfoStu();
			for (String name : list) {
				System.out.print(name + "\t");
			}
			// 随机点名
			Random random = new Random();
			int index = random.nextInt(list.size());
			System.out.println("\n点中的为: " + list.get(index));
			// 累加
			increCount(list.get(index));
			System.out.println("是否继续点名(Y/N): ");
			String flag = sc.next();
			if (!"y".equalsIgnoreCase(flag)) {
				break;
			}
		} while (true);
		// 最后不继续则展示点名信息;
		showInfo();
	}
    //最后显示学生的姓名及计数信息;
	private static void showInfo() {
		Connection conn = null;
		Statement sta = null;
		ResultSet rs = null;
		try {
			// 使用自定义DBUtils工具类加载驱动并获取连接对象;
			conn = DBUtils.getConnection();
			// 创建执行对象;
			sta = conn.createStatement();
			// 执行查询语句得到记录,并打印;
			rs = sta.executeQuery("Select * from student");
			System.out.println("姓名\t\t次数");
			// 这里只显示name and count
			while (rs.next()) {
				String name = rs.getString("name");
				int count = rs.getInt("count");
				System.out.println(name + "\t\t" + count);
			}
			// 最后程序执行完,把数据库中的count设置为0;保证每次点名计数从0开始;
			sta.executeUpdate("update student set count=0");
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 使用自定义的CloseUtils工具类关闭资源;
			CloseUtils.closeAll(rs, sta, conn);
		}
	}

	// 点名后,count+1;
	private static void increCount(String name) {
		Connection conn = null;
		Statement sta = null;
		try {
			conn = DBUtils.getConnection();
			sta = conn.createStatement();
			sta.executeUpdate("update student set count=count+1 where name='"
					+ name + "'");
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 同上--使用自定义的CloseUtils工具类关闭资源;
			CloseUtils.closeAll(sta, conn);
		}
	}

	// 得到学生信息
	private static List<String> getInfoStu() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		// 接收结果,最后返回;
		List<String> list = new ArrayList<>();
		try {
			conn = DBUtils.getConnection();
			String sql = "select name from student";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while (rs.next()) {
				list.add(rs.getString("name"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			CloseUtils.closeAll(rs, ps, conn);
		}
		return list;
	}
}

   


最后附上,自定义工具类CloseUtils和DBUtils;因为冗余部分比较多,所以抽取出来了:

public class CloseUtils {
	//可变参数:本质数组
	//统一资源关闭;
	public static void closeAll(AutoCloseable ... ac){
		for(AutoCloseable a : ac){
			if(a!=null){
				try {
					a.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtils {
	//加载驱动放入静态代码块中...只需要加载一次
	static{
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	//获取连接对象;
	public static Connection getConnection(){
		Connection conn = null;
		try {
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sql_test", "root", "1230");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}

补充:在获取学生信息的时候;也可以创建一个实体类Student,使用List集合去存储Student,这样可以少写一个方法,大家可自行测试;

List<Student> list = getStuList();
for (Student name : list) {
	System.out.print(name.getName() + "\t");
}

 

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值