Spring AOP動態代理例子
阿新 • • 發佈:2019-01-10
對Oracle資料庫的部門表進行增刪改查:
話不多說;
1.實體類可以不寫.hbm.xml檔案直接寫註解方式:
package com.jadeon.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @SuppressWarnings("serial") @Entity @Table(name = "dept") public class Dept implements Serializable { private Integer deptno; private String dname; private String loc; public Dept() { super(); } public Dept(String dname, String loc) { super(); this.dname = dname; this.loc = loc; } public Dept(Integer deptno,String dname, String loc) { super(); this.deptno = deptno; this.dname = dname; this.loc = loc; } @Id @Column(name="deptno") @GenericGenerator(name="myGenerator",strategy="increment") @GeneratedValue(generator="myGenerator") public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } @Column(name="dname") public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } @Column(name="loc") public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } }
2.dao介面
package com.jadeon.dao; import java.util.List; public interface BasicDao<T> { public void saveBasic(T o); public void updateBasicById(T o); public void delBasicById(T o); public T selectBasicById(T o,String column,Object byId); public List<T> seletctAllBasic(T o); }
實現dao介面類
3.service介面類package com.jadeon.dao.impl; import java.util.List; import org.hibernate.criterion.Restrictions; import com.jadeon.dao.BasicDao; import com.jadeon.util.DBHelper; public class BasicDaoImpl<T> implements BasicDao<T> { @Override public void saveBasic(T o) { DBHelper.openSession().save(o); } @Override public void updateBasicById(T o) { DBHelper.openSession().merge(o); } @Override public void delBasicById(T o) { DBHelper.openSession().delete(o); } @SuppressWarnings("unchecked") @Override public T selectBasicById(T o, String column, Object byId) { return (T) DBHelper.openSession().createCriteria(o.getClass()).add(Restrictions.eq(column, byId)) .uniqueResult(); } @SuppressWarnings("unchecked") @Override public List<T> seletctAllBasic(T o) { return DBHelper.openSession().createCriteria(o.getClass()).list(); } }
package com.jadeon.service;
import java.util.List;
import com.jadeon.entity.Dept;
public interface DeptService {
public void saveDept(Dept info);
public void updateDeptById(Dept info);
public Dept selectDeptById(Integer byId);
public List<Dept> seletctAllDept();
public void delDeptById(Integer byId);
}
實現service介面類
package com.jadeon.service.impl;
import java.util.List;
import com.jadeon.dao.BasicDao;
import com.jadeon.dao.impl.BasicDaoImpl;
import com.jadeon.entity.Dept;
import com.jadeon.service.DeptService;
public class DeptServiceImpl implements DeptService {
private BasicDao<Dept> dao = new BasicDaoImpl<Dept>();
@Override
public void saveDept(Dept info) {
dao.saveBasic(info);
}
@Override
public void updateDeptById(Dept info) {
dao.updateBasicById(info);
}
@Override
public void delDeptById(Integer byId) {
Dept info = dao.selectBasicById(new Dept(), "deptno", byId);
dao.delBasicById(info);
}
@Override
public Dept selectDeptById(Integer byId) {
return dao.selectBasicById(new Dept(), "deptno", byId);
}
@Override
public List<Dept> seletctAllDept() {
return dao.seletctAllBasic(new Dept());
}
}
4.幫助類(DBHelper):
package com.jadeon.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class DBHelper {
private static SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
private static Session session;
public static Session openSession(){
//判斷session是否開啟
if (session == null || !session.isOpen())
session = sessionFactory.openSession();
return session;
}
}
5.strutsxml和Hibernate.cfg.xml、web.xml配置檔案
<?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>
<package name="default" namespace="/" extends="struts-default">
<action name="dept_*" class="com.jadeon.action.DeptAction" method="{1}">
<result name="success">/allDept.jsp</result>
<result name="update">/updateDept.jsp</result>
</action>
</package>
</struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:localhost:1521:orcl</property>
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">tiger</property>
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
<property name="hibernate.show_sql">true</property>
<!-- <mapping resource="com/jadeon/entity/Dept.hbm.xml"/> -->
<mapping class="com.jadeon.entity.Dept"/>
</session-factory>
</hibernate-configuration>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>spring_02_proxy</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
6.代理類:
package com.jadeon.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.hibernate.Session;
public class TranscationDynamicProxy implements InvocationHandler{
private Object obj;//需要代理的目標物件
private Session session;
public TranscationDynamicProxy() {
super();
}
public TranscationDynamicProxy(Object obj,Session session) {
super();
this.obj = obj;
this.session = session;
}
/***
* 例項化代理物件
*
* @param args
* @return
*/
public static Object newInstance(Object args,Session session){//將目標物件傳入進行代理
// 1. 例項化物件
// 2. 定義的介面,所需要完成事情
// 3. 開始做事情
return Proxy.newProxyInstance(
args.getClass().getClassLoader(),
args.getClass().getInterfaces(),
new TranscationDynamicProxy(args,session));//返回代理物件
}
// 開始做事情 什麼時候觸發呢?
// 在例項化LogDynamicProxy物件時 會觸發該方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
System.out.println("begin recording log...");
session.beginTransaction().begin();
result = method.invoke(obj, args);//呼叫invoke方法,result 儲存該方法的返回值
session.beginTransaction().commit();
System.out.println("end recording log...");
} catch (Exception e) {
e.printStackTrace();
session.beginTransaction().rollback();
} finally {
//session.close();
}
return result;
}
}
7.action測試類:
package com.jadeon.action;
import java.util.ArrayList;
import java.util.List;
import com.jadeon.entity.Dept;
import com.jadeon.proxy.TranscationDynamicProxy;
import com.jadeon.service.DeptService;
import com.jadeon.service.impl.DeptServiceImpl;
import com.jadeon.util.DBHelper;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class DeptAction extends ActionSupport {
private List<Dept> infos = new ArrayList<Dept>();
private Dept info = new Dept();
DeptService service = (DeptService) TranscationDynamicProxy.newInstance(new DeptServiceImpl(), DBHelper.openSession());
public String getAllDept() {
infos = service.seletctAllDept();
return "success";
}
public String savaDept() {
service.saveDept(info);
return getAllDept();
}
public String updateDeptById() {
if (info.getDname() == null && info.getDeptno() > 0 && info.getLoc() == null) {
info = service.selectDeptById(info.getDeptno());
return "update";
}else{
service.updateDeptById(info);
return getAllDept();
}
}
public String delDeptById() {
service.delDeptById(info.getDeptno());
return getAllDept();
}
public List<Dept> getInfos() {
return infos;
}
public void setInfos(List<Dept> infos) {
this.infos = infos;
}
public Dept getInfo() {
return info;
}
public void setInfo(Dept info) {
this.info = info;
}
}
主頁面:
<html>
<head>
<title>DEPT TABLE INFORMATION</title>
</head>
<body>
<center>
<a href="dept_getAllDept">SELECT ALL DEPT INFORMATION</a>
</center>
</body>
</html>
查詢和刪除部門.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>DEPT TABLE INFORMATION</title>
</head>
<body>
<center>
<table>
<tr><th colspan="4"><h2>DEPT TABLE INFORMATION</h2></th></tr>
<tr>
<th>DEPTNO</th>
<th>DNAME</th>
<th>LOC</th>
<th colspan="2"> OPERATION</th>
</tr>
<c:forEach items="${infos}" var="dept">
<tr>
<td>${dept.deptno}</td>
<td>${dept.dname}</td>
<td>${dept.loc}</td>
<td>
<a href="dept_delDeptById?info.deptno=${dept.deptno}">delete</a>
|
<a href="dept_updateDeptById?info.deptno=${dept.deptno}">update</a>
</td>
</tr>
</c:forEach>
</table>
<a href="addDept.jsp">add</a>
</center>
</body>
</html>
新增部門.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>DEPT TABLE INFORMATION</title>
<link rel="stylesheet" type="text/css" href="CSS/style.css">
</head>
<body>
<center>
<form action="dept_savaDept" method="post">
<table>
<tr><th colspan="2"><h2>UPDATE TABLE INFORMATION</h2></th></tr>
<tr>
<th>DNAME</th>
<th>LOC</th>
</tr>
<tr>
<td><input type="text" name="info.dname" /></td>
<td><input type="text" name="info.loc" /></td>
</tr>
</table>
<input type="submit" value="YES"/>
</form>
</center>
</body>
</html>
修改部門.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>DEPT TABLE INFORMATION</title>
<link rel="stylesheet" type="text/css" href="CSS/style.css">
</head>
<body>
<center>
<form action="dept_updateDeptById" method="post">
<input type="hidden" name="info.deptno" value="${info.deptno}"/>
<table>
<tr><th colspan="2"><h2>UPDATE TABLE INFORMATION</h2></th></tr>
<tr>
<th>DNAME</th>
<th>LOC</th>
</tr>
<tr>
<td><input type="text" name="info.dname" value="${info.dname}"/></td>
<td><input type="text" name="info.loc" value="${info.loc}"/></td>
</tr>
</table>
<input type="submit" value="YES"/>
</form>
</center>
</body>
</html>