讲到Interceptor,相信熟悉struts2的童鞋肯定不会陌生了,struts2可以自定义拦截器进行自己想要的一系列相关的工作。而这里我们说的Interceptor也是差不多相似的功能。
废话不说,直接来代码:
下面这个是MyInterceptor类,它实现了Interceptor接口:
public String onPrepareStatement(String arg0) {
return arg0;
}
public boolean onSave(Object arg0, Serializable arg1, Object[] arg2,
String[] arg3, Type[] arg4) throws CallbackException {
if (arg0 instanceof User) {
System.out.println("User to be saved=>"+((User)arg0).getName());
}
return false;
}
其他方法就不看了,按默认实现就行,我们只需要改这两个方法,需要把onPrepareStatement中的返回值改一下,改成返回当前的SQL语句,参数中就是传入的执行的SQL语句,我们直接返回就可以打印出该语句。
而在onSave中,看名字就可以知道是在保存的时候进行调用的。我们可以进行一系列保存前的工作。
相信大家看参数名称就可以看明白了吧。
Serializable是指序列号的参数,在这里是指跟数据库ID进行映射的属性
Object[]这是一系列的状态,暂时没怎么用到,以后用到再研究,但API中说明了,不管用何种方式修改了这个数组中的值,这个onSave方法必须返回true。
String[]是指属性的名称
而Type[]也就是相应属性的类型。
1)这个Interceptor可以在保存数据库前和后做一些相应的操作。比如想对数据进行修改,添加前缀或后缀的,都可以用它来实现,下面我们来看一下。
public boolean onSave(Object arg0, Serializable arg1, Object[] arg2,
String[] arg3, Type[] arg4) throws CallbackException {
if (arg0 instanceof User) {
System.out.println("User to be saved=>"+((User)arg0).getName());
}
//我们在这里添加123作为名字的前缀
User user = (User)arg0;
user.setName("123"+user.getName());
return false;
}
我们看一下测试方法:
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Interceptor interceptor = new MyInteceptor();
Session session = sessionFactory.openSession(interceptor);
User user = new User();
user.setName("shun");
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close();
}
很简单,我们只是进行了简单的保存而已。这里就没给出映射文件和实体类,大家随便弄个试一下就行。
运行它,我们可以看到:
User to be saved=>shun
Hibernate: insert into USER (USER_NAME, age) values (?, ?)
Hibernate: update USER set USER_NAME=?, age=? where USER_ID=?
它会在最后进行更新姓名和年龄的操作,主要是因为我们在onSave方法中进行了修改。
我们看到数据库中的值已经修改为有123前缀的了。
2)同样道理,我们可以在加载时修改属性的值:
public boolean onLoad(Object arg0, Serializable arg1, Object[] arg2,
String[] arg3, Type[] arg4) throws CallbackException {
if (arg0 instanceof User) {
System.out.println("User to be loaded=>"+(arg2[0]+":"+arg2[1]));
}
User user = (User)arg0;
//判断哪个属性是name
for (int i = 0; i < arg3.length; i ++){
if (arg3[i].equals("name")){
user.setName(((String)arg2[i]).replace("123",""));
arg2[i] = ((String)arg2[i]).replace("123","");
}
}
return false;
}
加载时修改属性的值是写在onLoad方法内。
这里的arg0就是我们的User对象,这里它还没有值,这个方法在load方法之后才进行调用,所以我们此时对user进行操作已经是于事无补了,而且我们这里的user.setName是没用的操作。主要在:
arg2[i] = ((String)arg2[i]).replace("123","");
这句代码改变了返回的属性的值,那么我们在程序中拿到的user对象中的值也会改变,我们运行测试方法看看:
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Interceptor interceptor = new MyInteceptor();
Session session = sessionFactory.openSession(interceptor);
User user = (User)session.load(User.class,new Long(39));
System.out.println("User name:"+user.getName());
session.close();
}
看结果,我们得到了:
Hibernate: select user0_.USER_ID as USER1_0_0_, user0_.USER_NAME as USER2_0_0_, user0_.age as age0_0_ from USER user0_ where user0_.USER_ID=?
User to be loaded=>123shun:0
User name:shun
我们已经把原来的123给去掉了,在真正加载后进行了相关的处理,不过这个并不是真正加载前的处理,有点投机的嫌疑。但也不失为一个考虑的方案。Interceptor也许用得最多的还是在日志的相关处理上,比如我们需要对每次操作都进行相应的日志记录,那么Interceptor是一个很好的选择。
- 大小: 2.5 KB
分享到:
相关推荐
Hibernate4,Interceptor,spring,quartz
主要介绍了Java的Hibernate框架中的Interceptor和Collection,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
Hibernate API 1 接口类型 1 .访问数据库的各种操作的接口 包括 Session 、 Transaction .......Hibernate .......Hibernate ...Interceptor 接口。
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
使用拦截器时按如下步骤进行: (1)定义实现Interceptor接口的拦截器类 (2)通过Session启用拦截器,或者通过Configuration启用全局拦截器请看示例代码
springmvc3.0+hibernate+interceptor+AOP注解+EHcache
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
使用Hibernate拦截器检测Persistence Context中的实体更改 使用Hibernate拦截器对数据库中的实体更改做出React 使用观察者设计模式来监视实体持久性更改并对其做出React 使用命令设计模式提供一种通用方法,可将...
以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。 工程...
前几天搞 Spring + Hibernate + Struts 事务配置 ,网上找了好多资料,不过好无语,大多都是 Ctrl + V,浪费俺的宝贵时间 现在我总结配出一套,给大家参考参考,可能有不足,请大家多多交流。 附:内有弹出...
该项目是根据朋友的ERP中对仓库管理的设计,基础模块(用户、菜单、角色、职务)都已完成,业务模块有数据库设计文档。 SSH框架的配置文件分别是 Spring:spring.service.cfg.xml Hibernate:spring.local....
spring3.2+strut2+hibernate4 注解方式。 spring.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context=...
BeetSql是一个全功能DAO工具,同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。 在开发效率上,无需注解,自动使用大量内置SQL,轻易完成增删...
<interceptor name="myInterceptor" class="util.MyInterceptor"></interceptor> 定义拦截器的值栈空间 <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> ...
相比于Struts 1,Struts 2加入很多新的元素,如访问截取组件(interceptor)。 在Struts 2的技术框架,所有的请求均被截取组件先处理,再交由动作类分发 。Struts.xml是Struts 2的必须配置文件,放在WEB-INF/classes...
SpringMVC整合Shiro,Shiro是一个强大易用的Java...<bean id="authorizingRealm" class="com.mjm.core.interceptor.ShiroRealm"> 2.Shiro Filter 设置拦截的内容和登录页面和成功、失败页面 3.配置securityManager ...
该演示系统应用了SpringMVC、JQuery、Hibernate-Validator、Interceptor、Object Converter、DIV+CSS3、JSON、Interceptor等主流技术,另外借助了Map、List、文本文件等数据存储器。