从应用案例入手:通过连接数据库做一个随机点名系统;
首先进行分析:
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");
}