常用的工具类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("-", "");
}
}