实例化一个User对象,在(1)的情况下,拿到session后,调用session的方法即可完成,具体如下:
@Test
publicvoid testsave(){
User u = new User(); u.setName(\但是\); u.setBasicWage(5000); u.setPostWage(2000); u.setBonus(1000);
Session session = sf.getCurrentSession();//拿到当前内存中的session,session.beginTransaction();//开始事物 session.save(u);//调用session的方法
如果没有则创建一个
session.getTransaction().commit();//提交事务 }
4.3 查询方法
查询全部时,用list来装从数据库拿到的对象,用迭代器Iterator来遍历。如:
Iterator
User\,里面值得注意的是查询语句from的后面不是表明,而是类名(实体类),是通过HQL拿到的,这点要与SQL语句分开。其余地方与储存的一模一样,不再赘述。在按工号和姓名查询的过中和上述方法没有重要区别,完全是SQL条件的差异,这里也省略了,详情见附件。
查询方法中区别较大的是在储存员工时用到的查询方法,因为mysql中有一特殊语句查询
最后插入的记录,直接用hibernate的注解和扩展注解都不好用,所以我使用了hibernate的SQLQuery接口,在hibernate中使用原生态的sql,这样使用起来就方便多了,使用方法如下:
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。最简单的情况下,我们可以采用以下形式:
Listcats = sess.createSQLQuery(\
这个查询指定了:SQL查询字符串和查询返回的实体。
所以查询最后一条记录的方法如下:
@Test
publicvoid testQueyLast(){
26 / 66
}
Session session = sf.getCurrentSession(); session.beginTransaction();
String sqls = \Iterator
System.out.println(u.next());
user)\;
User.class).list().iterator();
4.4 数据更新方法
该课程设计中用到的数据更新有两种,即更新某一条记录的某一项和更新所有记录的某一
列,更新某一条记录的某一项的时候,和前面讲述的查询基本相同,关键的不同的地方是
Query q = session.createQuery(\User u set u.postWage=4555 where
u.id=3\);
q.executeUpdate();这里,这些通过hibernate的自带文档可以轻易得知。
但是哎更新所以记录的某一列时,hibernate会将这个数据表都load到内存中,然后在内存中逐条修改,这样执行耗资源的同时,效率太低,还不如返回去用jdbc操纵。先将mysql的驱动import到工程中,在myeclipse下的操作步骤是右键单击工程—>build path?configure build path-->选择libraries的对话框中点击add external jars?找到mysql-3.1.12.jar—>点击ok就行。
加载驱动Class.forName(\然后通过url,username和password取得连接就可以了,具体方法如下: @Test
publicvoid testUpdateByColum(){
String sql = \; try {
Class.forName(\).newInstance(); Connection cn =
DriverManager.getConnection(\\,\,\);
PreparedStatement ps = cn.prepareStatement(sql); int row = ps.executeUpdate(); System.out.println(\+row); ps.close(); cn.close();
// TODO Auto-generated catch block System.out.println(\更新数据失败\);
27 / 66
}catch (Exception e) {
}
}
4.5 删除员工方法
这过程比较特殊,先将给定id的对象load到内存中,然后执行删除,提交事务就可以完成。具体方法如下:
@Test
publicvoid testDeleteById(){ //按工号删除 Session session = sf.openSession(); }
到此,通过hibernate或者jdbc操纵数据的方法以设计完成,下一步只要将测试类中的
session.beginTransaction();
User u = (User)session.load(User.class,5); session.delete(u);
session.getTransaction().commit(); session.close();
方法copy到HibernateOperate类中,对每个方法中都加上beforeclass和afterclass中的内容,并且设计好引用的传递就可以了,因为在附件中有完整代码,所以这里不再讨论HibernateOperate类中的方法。
5 异常处理
根据本课题的设计思路,在外层模块的设计中,一般不涉及到异常的处理,由于整个过程中有很多异常,并且一类异常也有很多,所以就将异常分类来讨论,这样就不会重复,过程中把有
28 / 66
些系统异常改为了自定义异常,作为自定义异常的示例。
分析该课程设计的异常主要出现在输入检验、连接数据库和数据操纵这两个地方。下面将按这两类进行解析:
5.1 输入检验异常
在增加员工的模块的设计中,由于本课题设计将工工资的各项数据都确定为整型,所以当用户输入的是不能转化为整型数据的字符串时,将引起异常,代码中的处理如下:
if(!t[1].getText().equals(\) && flag){ }
if(!t[2].getText().equals(\) && flag){ }
if(!t[3].getText().equals(\) && flag){ }
try {
bonus = Integer.parseInt(t[3].getText()); flag = false;
} catch (NumberFormatException e1) { result.setText(\您输入的奖金有误!\); } try {
postWage = Integer.parseInt(t[2].getText()); flag = false;
} catch (NumberFormatException e1) { result.setText(\您输入的职务工资有误!\); } try {
basicWage = Integer.parseInt(t[1].getText()); flag = false;
} catch (NumberFormatException e1) { result.setText(\您输入的基础工资有误!\); }
在查询时,当用户输入的工号不合法时也是同样的处理方式,如:
try {
int a = Integer.parseInt(inputId.getText()); HibernateOperate q = new HibernateOperate(); q.testQueryById(a,result);
} catch (NumberFormatException e1) { result.setText(\请输入合法的工号!!\); }
5.2 数据操纵异常
29 / 66
修改和删除中均有用到工号,但是处理方法完全一样,所以修改和删除中的异常不再赘述。 在用jdbc连接数据库的过程中可能产生的异常有如下:
Try{??} catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { }
e.printStackTrace(); e.printStackTrace(); e.printStackTrace();
} catch (ClassNotFoundException e) { } catch (SQLException e) {
由于这里的设计没有必要分得太细,所以不再细化,用面向对象多态的应用,将这个整体的异常作为一个异常信息传出去: Try{??}catch (Exception e) {
row = -1;
}
5.3 自定义异常
首先得自己新建一个异常类,必须继承与系统已有的异常类,为了方便直观,我重写了父类的toString方法。如下:
publicclass UserException extends Exception{ }
在通过hibernate操纵数据时的异常,我把它定义成了一个自定义异常实例,在HibernateOperate类中时久让它往外抛,在各个模块中来catch,这样就是一个成功的自定义异常了。如:
在HibernateOperate中的 publicvoid testQuerySpecil(String msg,String mss,String mgg,TextArea throws UserException{
sf = new
Session session = sf.openSession(); session.beginTransaction();
Iterator
30 / 66
privatestaticfinallongserialVersionUID = 1L; UserException(){ }
public String toString(){
return\通过hibernate访问和操纵数据库异常!!!\; }
super();
ta)
AnnotationConfiguration().configure().buildSessionFactory();