package com.demos.dao.Impl;
import com.demos.dao.CategoryDao;
import com.demos.entity.Category;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//数据访问工厂:
//使用代理类方式(CategoryDaoProxy)非常麻烦,一个类就要写一个代理类
//所以使用这个数据访问工厂,用JDK生成代理类
public class DaoFactory {
private ProcessTrans pt;
private CategoryDaoImpl cdl;
public DaoFactory(){
this.pt = new ProcessTrans();
this.cdl = new CategoryDaoImpl();
}
//用JDK代理来产生代理对象,
// 并且产生的对象也是CategoryDao这个借口的对象
public CategoryDao getDaoClass(){
//生成代理对象
CategoryDao dao = (CategoryDao) Proxy.newProxyInstance(
this.getClass().getClassLoader(),
new Class[]{CategoryDao.class},
//接下来调用方法
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
//如果是insert方法,就要改变这个方法的执行
if(method.getName().equals("insert")){
//改变这个方法的执行
pt.beginTrans();
//调用你原来对象的方法,得到原来的值
cdl.insert((Category) args[0]);
//执行然后没有错误,再提交
pt.conmmit();
}
return result;
}
}
);
return dao;
}
}
ProcessTrans
package com.demos.dao.Impl;
public class ProcessTrans {
//开启事务
public void beginTrans(){
System.out.println("开启事务");
}
//提交事务
public void conmmit(){
System.out.println("提交事务");
}
//回滚事务
public void rollback(){
System.out.println("回滚事务");
}
}
CategoryDao
package com.demos.dao;
import com.demos.entity.Category;
public interface CategoryDao {
public void insert(Category category);
}
Category
package com.demos.entity;
public class Category {
private Long id;
private String cname;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
TestCategoryImpl
package com.demos.test;
import com.demos.dao.CategoryDao;
import com.demos.dao.Impl.DaoFactory;
import com.demos.entity.Category;
import org.junit.Test;
public class TestCategoryImpl {
@Test
public void testInsert() throws Exception{
//准备一个数据
Category c =new Category();
//调用getDaoClass()拿到数据访问对象dao
CategoryDao dao = new DaoFactory().getDaoClass();
//调用数据访问对象的insert方法
dao.insert(c);
}
}