学生信息管理模块
学生信息管理模块持久层
由于层与层之间的依赖关系,我们还是从持久层出发,先来完成持久层代码的设计和测试,和用户登录模块的做
法一样,先设计一个StudentsDao接口,然后再设计一个StudnetsDaoImpl实现类,这个实现类包括我们自己设计
的主键生成方法。
StudentsDao接口:
package com.demo.dao;
import java.util.List;
import com.demo.entity.Students;
public interface StudentsDAO {
public List<Students> queryAllStudents();
public Students queryStudentsBySid(String sid);
public boolean addStudents(Students students);
public boolean updateStudents(Students students);
public boolean deleteStudents(String sid);
}
StudnetsDaoImpl实现类:
package com.demo.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.demo.dao.StudentsDAO;
import com.demo.entity.Students;
import com.demo.util.MyHIbernateSessionFactory;
public class StudentsDAOImpl implements StudentsDAO {
@SuppressWarnings("unchecked")
@Override
public List<Students> queryAllStudents() {
Transaction tx = null;
List<Students>list = null;
String hql = "";
try {
Session session = MyHIbernateSessionFactory.getSessionFactory().getCurrentSession();
tx = session.beginTransaction();
hql = "from Students";
Query query = session.createQuery(hql);
list = query.list();
tx.commit();
return list;
} catch (Exception e) {
e.printStackTrace();
tx.commit();
return list;
} finally {
if(tx != null){
tx = null;
}
}
}
@Override
public Students queryStudentsBySid(String sid) {
Transaction tx = null;
Students students = null;
try {
Session session = MyHIbernateSessionFactory.getSessionFactory().getCurrentSession();
tx = session.beginTransaction();
students = (Students) session.get(Students.class, sid);
tx.commit();
return students;
} catch (Exception e) {
e.printStackTrace();
tx.commit();
return students;
} finally {
if(tx != null){
tx = null;
}
}
}
@Override
public boolean addStudents(Students students) {
students.setSid(getNewSid());//设置学生学号
Transaction tx = null;
try {
Session session = MyHIbernateSessionFactory.getSessionFactory().getCurrentSession();
tx = session.beginTransaction();
session.save(students);
tx.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
tx.commit();
return false;
} finally {
if(tx != null){
tx = null;
}
}
}
@Override
public boolean updateStudents(Students students) {
Transaction tx = null;
try {
Session session = MyHIbernateSessionFactory.getSessionFactory().getCurrentSession();
tx = session.beginTransaction();
session.update(students);
tx.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
tx.commit();
return false;
} finally {
if(tx != null){
tx = null;
}
}
}
@Override
public boolean deleteStudents(String sid) {
Transaction tx = null;
try {
Session session = MyHIbernateSessionFactory.getSessionFactory().getCurrentSession();
tx = session.beginTransaction();
Students students = (Students) session.get(Students.class, sid);
session.delete(students);
tx.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
tx.commit();
return false;
} finally {
if(tx != null){
tx = null;
}
}
}
//生成学生的学号
private String getNewSid() {
Transaction tx = null;
String hql = "";
String sid = null;
try {
Session session = MyHIbernateSessionFactory.getSessionFactory().getCurrentSession();
tx = session.beginTransaction();
//获得当前学生的最大编号
hql = "select max(sid) from Students";
Query query = session.createQuery(hql);
sid = (String) query.uniqueResult();
if(sid==null||"".equals(sid)){
//设置一个默认的最大编号
sid = "S0000001";
} else {
String temp = sid.substring(1);
int i = Integer.parseInt(temp);
i++;
//还原为字符串
temp = String.valueOf(i);
int len = temp.length();
//凑够七位
for(int j=0; j<7-len; j++){
temp = "0"+temp;
}
sid = "S" + temp;
}
tx.commit();
return sid;
} catch (Exception e) {
e.printStackTrace();
tx.commit();
return null;
} finally {
if (tx != null) {
tx = null;
}
}
}
}
由于需要测试,我们先来插入一些数据:
package com.demo.entity;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.demo.util.MyHIbernateSessionFactory;
public class TestStudents {
@Test
public void testSave(){
Session session = MyHIbernateSessionFactory.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Students students1 = new Students("S0000001","王丽","女",new Date(),"北京市");
Students students2 = new Students("S0000002","王强","男",new Date(),"天津市");
Students students3 = new Students("S0000003","李静","女",new Date(),"河北省");
Students students4 = new Students("S0000004","张三","女",new Date(),"河北省");
session.save(students1);
session.save(students2);
session.save(students3);
session.save(students4);
tx.commit();
MyHIbernateSessionFactory.getSessionFactory().close();
}
}
控制台输出:
数据库显示:
主键生成方法的测试,在进行测试之前,先把主键生成方法的访问修饰符由private变为public以便于测试,测试
完成之后再改回private,因为这个方法只有这个类实用,设计为私有的比较好。
主键生成方法测试类:
package com.demo.dao;
import java.util.Date;
import java.util.List;
import org.junit.Test;
import com.demo.dao.impl.StudentsDAOImpl;
import com.demo.entity.Students;
import junit.framework.Assert;
public class TestStudentsDAO {
@Test
public void testGetNewSid(){
StudentsDAOImpl studentsDAO = new StudentsDAOImpl();
System.out.println(studentsDAO.getNewSid());
}
}
结果:
由于数据表中有四条学生记录信息,因此结果必须是S0000005
持久层测试代码:
package com.demo.dao;
import java.util.Date;
import java.util.List;
import org.junit.Test;
import com.demo.dao.impl.StudentsDAOImpl;
import com.demo.entity.Students;
import junit.framework.Assert;
public class TestStudentsDAO {
@Test
public void testQueryAllStudents(){
StudentsDAO studentsDAO = new StudentsDAOImpl();
List<Students> list = studentsDAO.queryAllStudents();
for (Students students : list) {
System.out.println(students);
}
}
@Test
public void testGetNewSid(){
StudentsDAOImpl studentsDAO = new StudentsDAOImpl();
//System.out.println(studentsDAO.getNewSid());
}
@Test
public void testAddStudents(){
StudentsDAOImpl studentsDAO = new StudentsDAOImpl();
Students students = new Students();
students.setSname("赵瑶");
students.setGender("女");
students.setBirthday(new Date());
students.setAddress("上海");
Assert.assertEquals(true, studentsDAO.addStudents(students));
}
}
控制台输出:
testQueryAllStudents方法和testAddStudents方法控制台输出结果:
数据库显示:
学生信息管理模块控制层
由于有了SuperAction类,我们写StudentsAction类继承这个类,具体的代码如下:
package com.demo.action;
import java.text.SimpleDateFormat;
import java.util.List;
import com.demo.dao.StudentsDAO;
import com.demo.dao.impl.StudentsDAOImpl;
import com.demo.entity.Students;
@SuppressWarnings("serial")
public class StudentsAction extends SuperAction {
public String query(){
StudentsDAO studentsDAO = new StudentsDAOImpl();
List<Students> list = studentsDAO.queryAllStudents();
if(list!=null && list.size()>0){
session.setAttribute("students_list", list);
}
return "query_success";
}
public String delete() {
StudentsDAO studentsDAO = new StudentsDAOImpl();
String sid = request.getParameter("sid");
studentsDAO.deleteStudents(sid);
return "delete_success";
}
public String add() throws Exception {
StudentsDAO studentDao = new StudentsDAOImpl();
Students students = new Students();
students.setSname(request.getParameter("sname"));
students.setGender(request.getParameter("gender"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
students.setBirthday(sdf.parse(request.getParameter("birthday")));
students.setAddress(request.getParameter("address"));
studentDao.addStudents(students);
return "add_success";
}
public String modify() {
StudentsDAO studentDao = new StudentsDAOImpl();
String sid = request.getParameter("sid");
Students students = studentDao.queryStudentsBySid(sid);
session.setAttribute("modify_students", students);
return "modify_success";
}
public String save() throws Exception {
StudentsDAO studentDao = new StudentsDAOImpl();
Students students = new Students();
students.setSid(request.getParameter("sid"));
students.setSname(request.getParameter("sname"));
students.setGender(request.getParameter("gender"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
students.setBirthday(sdf.parse(request.getParameter("birthday")));
students.setAddress(request.getParameter("address"));
studentDao.updateStudents(students);
return "save_success";
}
}
配置信息:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default" />
<package name="users" namespace="/users" extends="default">
<action name="*_*" class="com.demo.action.{1}Action" method="{2}">
<result name="login_success">/users/Users_login_success.jsp</result>
<result name="login_failure">/users/Users_login.jsp</result>
<result name="logout_success">/users/Users_login.jsp</result>
<result name="input">/users/Users_login.jsp</result>
</action>
</package>
<package name="students" namespace="/students" extends="default">
<action name="*_*" class="com.demo.action.{1}Action" method="{2}">
<result name="query_success">/students/Students_query_success.jsp</result>
<result name="delete_success" type="chain">Students_query</result>
<result name="add_success">/students/Students_add_success.jsp</result>
<result name="modify_success">/students/Students_modify.jsp</result>
<result name="save_success">/students/Students_modify_success.jsp</result>
</action>
</package>
</struts>
页面调用
学生信息管理模块设计的几个类为:
有这样几处修改:
启动Tomcat服务器测试: