1、创建业务层UserService接口定义需要完成的功能
1
2
3
4
5
6
|
/** * 创建目标接口,定义目标接口要完成的功能 */ public interface UserService { boolean save(User user); } |
2、创建持久层UserDao接口定义具体的CURD
1
2
3
4
5
6
|
/** * 创建目标接口,定义目标接口要完成的功能 */ public interface UserService { boolean save(User user); } |
3、完成UserService接口和UserDao的实现类
1
2
3
4
5
6
7
8
9
|
public class UserServiceImpl implements UserService { private UserDao dao= new UserDaoImpl(); @Override public boolean save(User user) { boolean success= false ; success=dao.insert(user); return success; } } |
这里省略具体的JDBC代码
1
2
3
4
5
6
7
|
public class UserDaoImpl implements UserDao { @Override public boolean insert(User user) { System.out.println( "insert into t_user (username,password)values('" +user.getUsername()+ "','" +user.getPassword()+ "')" ); return true ; } } |
4、创建InvocationHandler接口的实现类
为什么需要这个接口?
因为在开发中,业务层可能含有涉及到多步数据库操作,所以这一步需要开启事务,但是开发中这样的情况太多了,所以我们需要面向横切面编程,创建代理代理,在调用业务层方法时,我们利用jdk动态代理的增强功能提供事务。这样,事务代码只用写一次,但是每次业务层方法调用时,我们都可以使用代理对象去调用业务层方法来开启事务。实现了代码复用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class UserHandler implements InvocationHandler { //动态创建目标对象 Object target= null ; public UserHandler(Object target){ this .target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //返回值 Object result= null ; //增强功能 System.out.println( "begin Transaction....." ); result=result=method.invoke(target,args); System.out.println( "commit Transaction....." ); System.out.println( "rollback Transaction....." ); System.out.println( "end Transaction....." ); //返回值 return result; } } |
这里我就用输出语句代表事务语句。
5、创建表示层Servlet去完成调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class UserSaveServlet { public static void main(String[] args) throws Exception { //需要调用的目标类 Class c= UserServiceImpl. class ; Object obj = c.newInstance(); //获取该类的类加载器 ClassLoader loader = obj.getClass().getClassLoader(); //目标对象实现的接口 Class<?>[] interfaces=obj.getClass().getInterfaces(); //获取InvocationHandler对象 InvocationHandler handler= new UserHandler(obj); //创建代理对象 //将返回值转为接口类型 UserService service=(UserService)Proxy.newProxyInstance(loader,interfaces,handler); boolean success=service.save( new User( "张三" , "123456" )); System.out.println(success? "保存成功" : "保存失败" ); } } |
总结
本篇文章就到这里了,希望能够帮助到你,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/qq_45796208/article/details/109551228