学生的成绩统计在excel中,给出按学分绩排名的名次(学分绩等于各科成绩的加权平均,为了解决教师判分标准不统一的问题,其中单科成绩折算公式为:单科成绩=(个人单科成绩/本课程最高成绩)*100)。
所用知识
hibernate编程式事务
poi访问excel表
一、新建项目,导入mysql,poi,hibernate,junit,mysql驱动的jar包
代码具体如下:
1、Score.java
package com.wsz.entity; public class Score { private Integer id; // 主键 private String studentNumber; // 学号 private String name; // 姓名 private String courseName; // 课程名 private Double score; // 课程成绩 private Double highestScore; // 课程最高成绩 private Double creditPoints; // 学分 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getStudentNumber() { return studentNumber; } public void setStudentNumber(String studentNumber) { this.studentNumber = studentNumber; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public Double getScore() { return score; } public void setScore(Double score) { this.score = score; } public Double getHighestScore() { return highestScore; } public void setHighestScore(Double highestScore) { this.highestScore = highestScore; } public Double getCreditPoints() { return creditPoints; } public void setCreditPoints(Double creditPoints) { this.creditPoints = creditPoints; } }
2、Score.hbm.xml映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.wsz.entity.Score"> <id name="id"> <generator class="identity" /> </id> <property name="studentNumber" /> <property name="name" /> <property name="courseName" /> <property name="score" /> <property name="highestScore" /> <property name="creditPoints" /> </class> </hibernate-mapping>
3、hibernate配置文件 hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!--一个数据库一个session-factory定义--> <session-factory> <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_score</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">admin</property> <property name="hibernate.current_session_context_class">thread</property> <!--数据库方言,不同数据库的方言不同--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!--执行时会输出sql语句,方便调试--> <property name="hibernate.show_sql">true</property> <!--所有的实体对象的配置文件都要在这里关联起来--> <mapping resource="com/wsz/entity/Score.hbm.xml"/> </session-factory> </hibernate-configuration>
4、ScoreDao.java
package com.wsz.entity; import org.hibernate.Session; public class ScoreDao { public void addScore(Score score) { Session session = null; try { session = HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); session.save(score); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } } }
5、初始化数据
package com.wsz.entity; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import junit.framework.TestCase; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class InitDate extends TestCase { String strFilePath = "C:\\";// 设置路径 String strFileName = "控计学院" + ".xls";// 设置名称 ScoreDao scoreDao=new ScoreDao(); // 导入excel表数据到数据库 public void importScore() { try { File fSource = new File(strFilePath + strFileName); FileInputStream in = new FileInputStream(fSource); HSSFWorkbook workbook = new HSSFWorkbook(in); HSSFSheet sheet = workbook.getSheetAt(0); // 默认读取第一个工作簿 int count = sheet.getLastRowNum(); System.out.println(count); // 数据的行数 HSSFRow temprow = sheet.getRow(0); System.out.println(temprow.getCell(0).getStringCellValue()); System.out.println(temprow.getCell(1).getStringCellValue()); System.out.println(temprow.getCell(2).getStringCellValue()); System.out.println(temprow.getCell(3).getStringCellValue()); System.out.println(temprow.getCell(4).getStringCellValue()); System.out.println(temprow.getCell(5).getStringCellValue()); for (int i = 1; i < count + 1; i++) { Score score = new Score(); HSSFRow row = sheet.getRow(i); score.setStudentNumber(row.getCell(0).getStringCellValue()); score.setName(row.getCell(1).getStringCellValue()); score.setCourseName(row.getCell(2).getStringCellValue()); score.setCreditPoints(Double.valueOf(row.getCell(3).getStringCellValue())); score.setScore(Double.valueOf(row.getCell(4).getStringCellValue())); score.setHighestScore(Double.valueOf(row.getCell(5).getStringCellValue())); // 保存数据 scoreDao.addScore(score); System.out.println(score.getId()); System.out.println(score.getStudentNumber()); System.out.println(score.getName()); System.out.println(score.getCourseName()); System.out.println(score.getScore()); System.out.println(score.getHighestScore()); System.out.println(score.getCreditPoints()); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
6、ExportDB.java
package com.wsz.entity; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ExportDB { public static void main(String[] args) { //读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); SchemaExport export = new SchemaExport(cfg); export.create(true, true); } }
7、HibernateUtils.java
package com.wsz.entity; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory factory; static { try { Configuration cfg = new Configuration().configure(); factory = cfg.buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } } public static SessionFactory getSessionFactory() { return factory; } // factory.getCurrentSession()可以用于同一线程的多个方法,以保证使用同一个Session public static Session getSession() { return factory.openSession(); } public static void closeSession(Session session) { if (session != null) { if (session.isOpen()) { session.close(); } } } }
8、查看排名的sql语句(没写client)
select name ,sum(score/highestScore*creditPoints*100)/sum(creditPoints) as “成绩” from score group by name order by sum(score/highestScore*creditPoints*100)/sum(creditPoints) desc;
9、结果: