常用的工具类DBUtil/ServiceFactory/TransactionInvocationHandler/UUIDUtil等等

常用的工具类DBUtil/ServiceFactory/TransactionInvocationHandler/UUIDUtil

package com.yy.crud.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DBUtil {

private DBUtil() {
}

private static Properties prop = new Properties();
// dds对象就是我们的数据库连接池对象(数据源对象)
private static DruidDataSource dds = null;

static {

	try {
		// db_server.properties
		prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db_server.properties"));
		dds = (DruidDataSource) DruidDataSourceFactory.createDataSource(prop);
	} catch (Exception e) {
		e.printStackTrace();
	}

}

private static ThreadLocal<Connection> t = new ThreadLocal<Connection>();

/*
 * 以下的getConn方法,有可能是创建一根连接返回,也有可能是直接返回已经有的连接
 * 
 * 在service层做调用的时候,是创建一根连接返回 在dao层做调用的时候,是直接返回已经有的连接
 * 
 */
public static Connection getConn() throws SQLException {

	Connection conn = t.get();

	if (conn == null) {
		
		//conn = DriverManager.getConnection(url, user, password);
		
		conn = dds.getConnection();
		
		t.set(conn);

	}

	return conn;

}

// 关闭相关资源
public static void myClose(Connection conn, PreparedStatement ps, ResultSet rs) throws SQLException {

	// 关闭资源的顺序为 按照创建的顺序 逆序关闭
	if (rs != null) {
		rs.close();
	}

	if (ps != null) {
		ps.close();
	}

	if (conn != null) {
		//将连接回收到连接池中
		conn.close();
		// 很容易忘
		t.remove();
	}

}

}


package com.wkcto.crud.util;

public class ServiceFactory {

public static Object getService(Object service){
	
	return new TransactionInvocationHandler(service).getProxy();
	
}

}


package com.wkcto.crud.util;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;

public class TransactionInvocationHandler implements InvocationHandler{

//zs
private Object target;

public TransactionInvocationHandler(Object target){
	this.target = target;
}


/*
 * 以下的invoke方法,就是ls的送花方法
 * 
 * 既然是ls的送花方法(代理类的业务方法),由两部分代码所组成
 * 
 * 一部分为使用成员变量(zs)来实现业务逻辑
 * 一部分为对于业务逻辑的增强(事务)
 * 
 */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
	
	Connection conn = null;
	
	Object obj = null;
	
	try{
		conn = DBUtil.getConn();
		conn.setAutoCommit(false);
		
		
		//业务逻辑 使用zs来调用方法来实现真正的业务逻辑
		/*
		 * zs
		 * method
		 * 
		 * zs也有了,zs的方法也有了,现在我们要使用zs去调用方法就可以了
		 *调用方法的时候,args就是参数
		 * 
		 */
		obj = method.invoke(target,args);
		
		
		
		conn.commit();
	}catch(Exception e){
		conn.rollback();
		e.printStackTrace();
	}finally{
		DBUtil.myClose(conn,null,null);
	}
	
	
	return obj;
}


//取得代理类的对象 (取ls对象)
public Object getProxy(){
	
	return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
	
}

}


package com.uu.crud.util;

import java.util.UUID;

public class UUIDUtil {

public static String getUUID(){
	
	return UUID.randomUUID().toString().replaceAll("-","");
	
}

}


1.代理模式有什么作用?*

理解

2.静态代理一般很少使用,多数使用动态代理,你能独立的写出动态代理的代码吗?*

3.能够用动态代理实现事务的控制吗?*

4.阿里巴巴的druid连接池会配置并且使用吗?*

5.连接池的实现原理是什么?有什么好处?*

理解

6.是否能够理解分页查询吗?*

7.能够使用模板方法设计模式实现核心控制器StudentController吗?*

/*BeanFactory工具类/
package com.wkcto.crm.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

/**

  • Bean工厂
  • @author Administrator

*/
public class BeanFactory {

/**
 * 将request中的数据取出赋值给javabean对象的相关属性,使用该<br>
 * 工具的时候要注意form表单提交的参数name必须和javabean的属性名一致。
 * @param request
 * @param clazz
 * @return
 */
public static Object getBean(HttpServletRequest request , Class clazz){
	// 创建javabean对象
	Object obj = null;
	try {
		// ...save.do?username=zhangsan&birth=2010-10-10&sex=1....
		// 获取所有的参数name
		Enumeration<String> names = request.getParameterNames();
		obj = clazz.newInstance();
		while(names.hasMoreElements()){
			try {
				// 获取了参数name
				String name = names.nextElement(); // customerName
				// 获取参数value
				String value = request.getParameter(name); // 2010-10-10
				// 给obj对象的相关属性赋值
				String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
				Method setMethod = clazz.getDeclaredMethod(methodName, String.class);
				setMethod.invoke(obj, value);
			} catch (NoSuchMethodException e) {
				// 异常可以让程序更加健壮,出问题之后不影响程序的继续执行。
				// 出现异常之后,提示异常信息,但不要耽误“生产”。
			}
		}
	} catch (InstantiationException e) {
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	} catch (SecurityException e) {
		e.printStackTrace();
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
	} catch (InvocationTargetException e) {
		e.printStackTrace();
	}
	return obj;
}

}

/常量类***/
package com.wkcto.crm.utils;

/**

  • 常量类。系统常量,所有项目中的常量都放到这个类当中。
  • @author Administrator

*/
public class Const {

/**
 * 登录成功之后,将用户对象绑定到session域时使用的name。
 */
public static final String SESSION_USER = "user";

}

/*日期工具类/

package com.wkcto.crm.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**

  • 日期工具类
  • @author Administrator

*/
public class DateUtil {

private DateUtil() {

}

/**
 * 获取当前系统时间
 * @return 日期格式: yyyy-MM-dd HH:mm:ss
 */
public static String getSysTime() {
	return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}

}
/读取excel文件*/

package com.wkcto.crm.utils;

import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelReader {

/**
 * 读取excel文件,获取List集合
 * @param excelPath
 * @param clazz
 * @return
 */
public List<T> read(String excelPath, Class clazz) {
	List<T> dataList = new ArrayList<>();
	try {
		Workbook workbook = null;
		if (excelPath.indexOf(".xlsx") > -1) {
			workbook = new XSSFWorkbook(new FileInputStream(excelPath));
		} else {
			workbook = new HSSFWorkbook(new FileInputStream(excelPath));
		}
		Sheet sheet = workbook.getSheetAt(0);
		Row row0 = sheet.getRow(0);
		int totalColumns = row0.getLastCellNum();
		String[] propertyNames = new String[totalColumns];
		for (int i = 0; i < totalColumns; i++) {
			Cell cell = row0.getCell(i);
			String cellValue = getCellValue(cell);
			propertyNames[i] = cellValue;
		}
		int totalRows = sheet.getPhysicalNumberOfRows();
		for (int i = 1; i < totalRows; i++) {
			Row row = sheet.getRow(i);
			if (row != null) {
				T obj = (T)clazz.newInstance();
				for (int j = 0; j < totalColumns; j++) {
					Cell cell = row.getCell(j);
					String cellValue = getCellValue(cell);
					String propertyName = propertyNames[j];
					String methodName = "set" + propertyName.substring(0, 1).toUpperCase()
							+ propertyName.substring(1);
					Method setMethod = clazz.getDeclaredMethod(methodName, String.class);
					setMethod.invoke(obj, cellValue);
				}
				dataList.add(obj);
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return dataList;
}

/**
 * 根据单元格获取单元格当中的文本
 * @param cell
 * @return
 */
private static String getCellValue(Cell cell) {
	DecimalFormat df = new DecimalFormat("#");
	if (cell == null)
		return "";
	switch (cell.getCellType()) {
	case Cell.CELL_TYPE_NUMERIC:
		if (DateUtil.isCellDateFormatted(cell)) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			return sdf.format(cell.getDateCellValue()).toString();
			// return
			// sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())).toString();
		}
		return df.format(cell.getNumericCellValue());
	case Cell.CELL_TYPE_STRING:
		// System.out.println(cell.getStringCellValue());
		return cell.getStringCellValue();
	case Cell.CELL_TYPE_FORMULA:
		return cell.getCellFormula();
	case Cell.CELL_TYPE_BLANK:
		return "";
	case Cell.CELL_TYPE_BOOLEAN:
		return cell.getBooleanCellValue() + "";
	case Cell.CELL_TYPE_ERROR:
		return cell.getErrorCellValue() + "";
	}
	return "";
}

}
/*写入excel文件/
package com.wkcto.crm.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelWriter {

/**
 * 根据数据返回workbook
 * @param dataList 数据
 * @param sheetName 表格名称
 * @param clazz 类型
 * @return 工作簿
 */
public XSSFWorkbook getWorkbook(List<T> dataList , String sheetName , Class clazz) {
	XSSFWorkbook workbook = new XSSFWorkbook();
	XSSFSheet sheet = workbook.createSheet(sheetName);
	XSSFRow row0 = sheet.createRow(0);
	Field[] fields = clazz.getDeclaredFields(); 
	for (int i = 0; i < fields.length; i++) {
		Field field = fields[i];
		String fieldName = field.getName();
		XSSFCell cell = row0.createCell(i);
		cell.setCellValue(fieldName);
	}
	try {
		for (int i = 0; i < dataList.size(); i++) {
			T obj = dataList.get(i);
			XSSFRow row = sheet.createRow(i + 1);
			for (int j = 0; j < fields.length; j++) {
				String propertyName = fields[j].getName();
				String getMethodName = "get" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
				Method getMethod = clazz.getDeclaredMethod(getMethodName);
				Object value = getMethod.invoke(obj);
				XSSFCell cell = row.createCell(j);
				cell.setCellValue(value == null ? "" : value.toString());
			}
		}
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
	} catch (SecurityException e) {
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
	} catch (InvocationTargetException e) {
		e.printStackTrace();
	}
	return workbook;
}

}
/**Md5加密/
package com.wkcto.crm.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5 {

/**
 * 生成32位md5码
 * @param password
 * @return
 */
public static String get(String password) {

	try {
		// 得到一个信息摘要器
		MessageDigest digest = MessageDigest.getInstance("md5");
		byte[] result = digest.digest(password.getBytes());
		StringBuffer buffer = new StringBuffer();
		// 把每一个byte 做一个与运算 0xff;
		for (byte b : result) {
			// 与运算
			int number = b & 0xff;// 加盐
			String str = Integer.toHexString(number);
			if (str.length() == 1) {
				buffer.append("0");
			}
			buffer.append(str);
		}

		// 标准的md5加密后的结果
		return buffer.toString();
	} catch (NoSuchAlgorithmException e) {
		e.printStackTrace();
		return "";
	}

}

}

/**响应json工具类/

package com.wkcto.crm.utils;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**

  • 响应json工具类
  • @author Administrator

*/
public class OutJson {

private OutJson(){
	
}

/**
 * 响应json,输出结果为:{"success" : true}或者{"success" : false}
 * @param response
 * @param success
 */
public static void print(HttpServletResponse response , boolean success){
	try {
		Map<String, Boolean> jsonMap = new HashMap<>();
		jsonMap.put("success", success);
		ObjectMapper om = new ObjectMapper();
		String json = om.writeValueAsString(jsonMap);
		response.setContentType("text/json;charset=UTF-8");
		response.getWriter().print(json);
	} catch (JsonGenerationException e) {
		e.printStackTrace();
	} catch (JsonMappingException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

/**
 * 响应json
 * @param response
 * @param jsonMap
 */
public static void print(HttpServletResponse response , Object jsonMap){
	try {
		ObjectMapper om = new ObjectMapper();
		String json = om.writeValueAsString(jsonMap);
		response.setContentType("text/json;charset=UTF-8");
		response.getWriter().print(json);
	} catch (JsonGenerationException e) {
		e.printStackTrace();
	} catch (JsonMappingException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

}

/*mybatis工具类/
package com.wkcto.crm.utils;

import java.io.IOException;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**

  • MyBatis的工具类。
  • @author Administrator

*/
public class SqlSessionUtil {

private static SqlSessionFactory factory;
private static ThreadLocal<SqlSession> local = new ThreadLocal<>();

/**
 * 类加载的时候,加载mybatis的核心配置文件,初始化SqlSessionFactory对象。
 * 该对象只被创建一次,不能销毁,不能重建。所以将代码放到静态代码块当中。
 */
static {
	try {
		factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
	} catch (IOException e) {
		e.printStackTrace();
	}
}

/**
 * 获取当前线程中的SqlSession对象
 * 
 * @return
 */
public static SqlSession getCurrentSqlSession() {
	SqlSession sqlSession = local.get();
	if (sqlSession == null) {
		sqlSession = factory.openSession();
		local.set(sqlSession);
	}
	return sqlSession;
}

/**
 * 关闭资源
 * 
 * @param sqlSession
 */
public static void close(SqlSession sqlSession) {
	if (sqlSession != null) {
		sqlSession.close();
		local.remove(); // 解除当前线程和SqlSession对象的绑定关系。原因是:线程在Tomcat服务器中可以被重复使用。(Tomcat有一个线程池)
	}
}

/**
 * 回滚事务
 * 
 * @param sqlSession
 */
public static void rollback(SqlSession sqlSession) {
	if (sqlSession != null) {
		sqlSession.rollback();
	}
}

}
/动态代理工具类/
package com.wkcto.crm.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.apache.ibatis.session.SqlSession;

public class TransactionHandler implements InvocationHandler {

private Object target;

public TransactionHandler(Object target) {
	this.target = target;
}

// 为什么是成员方法
public Object getProxy() {
	return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
	SqlSession sqlSession = null;
	Object retValue = null;
	try {
		sqlSession = SqlSessionUtil.getCurrentSqlSession();
		// 执行真正service方法。
		retValue = method.invoke(target, args); 
		sqlSession.commit();
	} catch (Exception e) {
		SqlSessionUtil.rollback(sqlSession);
		e.printStackTrace();
		// 继续将异常上抛给controller
		throw e.getCause(); // 注意:一定要将原始的LoginException抛出。(e.getCause()得根异常。)
	} finally {
		SqlSessionUtil.close(sqlSession);
	}
	return retValue;
}

}
/UUID生成器/

package com.wkcto.crm.utils;

import java.util.UUID;

/**

  • UUID生成器
  • @author Administrator

*/
public class UUIDGenerator { // 生成器Generator,比较器Comparator

private UUIDGenerator(){
	
}

/**
 * 生成uuid
 * @return
 */
public static String generate(){ // 方法名是动词(generate)
	return UUID.randomUUID().toString().replaceAll("-", "");
}

}

猜你喜欢

转载自blog.csdn.net/qq_30347133/article/details/84069852