一、Web
1、WebUtils
1.1、源码:
package com.kk.utils;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;
import javax.servlet.ServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
/**
* @Description: Web工具类
* @Author: Jk_kang
* @CreateDate: 2020/7/16 19:29
**/
public class WebUtilts {
/**
* 传入参数(查询的参数名,返回的类型,九大内置对象(request))
* 案例:Long id = WebUtilts.getParameter ("id", Long.class, request);
* @param param
* @param type
* @param request
* @param
* @return
*/
public static T getParameter(String param, Class type, ServletRequest request) {
//暂时不对数字做判断,传值还需谨慎
if (param != null && !"".equals (param)) {
//ServletRequestWrapper request = new HttpServletRequestWrapper ();
String parameter = request.getParameter (param);
if (parameter != null) {
if (type.isAssignableFrom (Long.class)) {
return (T) Long.valueOf (parameter);
} else if (type.isAssignableFrom (Integer.class)) {
return (T) Integer.valueOf (parameter);
} else if (type.isAssignableFrom (Double.class)) {
return (T) Double.valueOf (parameter);
}
return (T)parameter;
}
}
return null;
}
/**
* 校验当前传入对象,所有属性是否匹配(request参数标准,非空并且不为null)
*
* @param obj
* @return
* @throws IllegalAccessException
*/
public static boolean checkClass(Object obj) throws IllegalAccessException {
if (obj != null) {
//得到字节码对象
Class aClass = obj.getClass ( );
//得到所有属性
Field[] fields = aClass.getDeclaredFields ( );
for (int i = 0; i < fields.length; i++) {
//获取属性
Field field = fields[i];
//打开私有访问权限
field.setAccessible (true);
//得到属性名
String name = field.getName ( );
//Type genericType = field.getGenericType ( );
//System.out.println ("类型:"+genericType.toString () );
//获取属性值
Object valse = field.get (obj);
//System.out.println ("属性值:" + valse);
if (valse == null || "".equals (valse)) {
return false;
}
}
return true;
} else {
//实际开发不会用这个输出,浪费资源
System.out.println ("传入对象为null");
return false;
}
}
/**
* 传进来的参数,非空校验
*
* @param ages
* @return
*/
public static boolean checkParameter(Object... ages) {
if (ages.length != 0 && ages != null) {
for (int i = 0; i < ages.length; i++) {
if (ages[i] == null || "".equals (ages[i])) {
return false;
}
}
return true;
}
return false;
}
/**
* 把 Map 中的值注入到对应的 JavaBean 属性中。
*
* @param value
* @param bean
*/
public static T copyParamToBean(Map value, T bean) {
try {
//System.out.println ("注入之前:" + bean);
// 把所有请求的参数都注入到 user 对象中
BeanUtils.populate (bean, value);
//System.out.println ("注入之后:" + bean);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace ( );
}
return bean;
}
/**
* 把 Map 中的值注入到对应的 JavaBean 属性中。
*
* @param value
* @param bean
*/
public static T copyParamToBean(Map value, Class bean) {
try {
//System.out.println ("注入之前:" + bean);
// 把所有请求的参数都注入到 user 对象中
BeanUtils.populate (bean, value);
//System.out.println ("注入之后:" + bean);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace ( );
}
return (T)bean;
}
/**
* 将字符串转换成为int类型的数据
*
* @param strInt
* @param defaultValue
* @return
*/
public static int parseInt(String strInt, int defaultValue) {
try {
return Integer.parseInt (strInt);
} catch (Exception e) {
System.out.println ("空参数");
//e.printStackTrace();
}
return defaultValue;
}
}
1.2、使用案例:
2、BaseServlet
2.1、源码:
package com.kk.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public abstract class BaseServlet extends HttpServlet {
/*优化过程,一,二
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter ("action");
//优化一
if ("login".equals (action))
{
login (request,response);
}
else if ("regist".equals (action)){
regist (request,response);
}
//优化二:反射
try {
// 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass ( ).getDeclaredMethod (action, HttpServletRequest.class,
HttpServletResponse.class);
//System.out.println (method);
// 调用目标业务 方法
method.invoke (this,request,response);
} catch (Exception e) {
e.printStackTrace ( );
}
}
*/
//标签请求默认为GET,所以。。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//三句也可以写在过滤器中
req.setCharacterEncoding ("UTF-8");//处理post乱码
resp.setCharacterEncoding ("utf-8");//在页面显示测试防止乱码
resp.setContentType ("text/html;charset=UTF-8");
String action = req.getParameter ("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass ( ).getDeclaredMethod (action, HttpServletRequest.class, HttpServletResponse.class);
method.setAccessible (true);
//System.out.println (method);
// 调用目标业务 方法
method.invoke (this, req, resp);
} catch (Exception e) {
e.printStackTrace ( );
}
}
}
2.2、使用案例:
二、Dao
BaseDao:
1.1、JdbcUtils:连接工具类,基于德鲁伊连接池(非事务)
public abstract class BaseDao {
//使用DbUtils操作数据库
private QueryRunner queryRunner = new QueryRunner ( );
/**
* update() 方法用来执行:Insert\Update\Delete语句
*
* @return 如果返回-1,说明执行失败
返回其他表示影响的行数
*/
public int update(String sql, Object... args) {
Connection connection = JdbcUtils.getConnection ( );
try {
return queryRunner.update (connection, sql, args);
} catch (SQLException e) {
e.printStackTrace ( );
} finally {
JdbcUtils.close (connection);
}
return -1;
}
/**
* 查询返回一个javaBean的sql语句
*
* @param type 返回的对象类型
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @param 返回的类型的泛型
* @return
*/
public T queryForOne(Class type, String sql, Object... args) {
Connection con = JdbcUtils.getConnection ( );
try {
return queryRunner.query (con, sql, new BeanHandler (type), args);
} catch (SQLException e) {
e.printStackTrace ( );
} finally {
JdbcUtils.close (con);
}
return null;
}
/**
* 查询返回多个javaBean的sql语句
*
* @param type 返回的对象类型
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @param 返回的类型的泛型
* @return
*/
public List queryForList(Class type, String sql, Object... args) {
Connection con = JdbcUtils.getConnection ( );
try {
return queryRunner.query (con, sql, new BeanListHandler (type), args);
} catch (SQLException e) {
e.printStackTrace ( );
} finally {
JdbcUtils.close (con);
}
return null;
}
/**
* 执行返回一行一列的sql语句
*
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @return
*/
public Object queryForSingleValue(String sql, Object... args) {
Connection conn = JdbcUtils.getConnection ( );
try {
return queryRunner.query (conn, sql, new ScalarHandler ( ), args);
} catch (Exception e) {
e.printStackTrace ( );
} finally {
JdbcUtils.close (conn);
}
return null;
}
}
1.2、JdbcUtils:连接工具类,基于德鲁伊连接池(事务版)
public class JdbcUtils {
//德鲁伊数据源
private static DruidDataSource dataSource;
private static ThreadLocal conns = new ThreadLocal<> ( );
//德鲁伊连接池
static {
try {
Properties properties = new Properties ( );
// 读取 jdbc.properties属性配置文件
InputStream inputStream = JdbcUtils.class.getClassLoader ( ).getResourceAsStream ("jdbc.properties");
// 从流中加载数据
properties.load (inputStream);
// 创建 数据库连接 池
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource (properties);
} catch (Exception e) {
e.printStackTrace ( );
}
}
/**
* 获取数据库连接池中的连接
*
* @return 如果返回null, 说明获取连接失败
有值就是获取连接成功
*/
public static Connection getConnection() {
Connection conn = conns.get ( );
if (conn == null) {
try {
conn = dataSource.getConnection ( );//从数据库连接池中获取连接
conns.set (conn);// 保存到 ThreadLocal 对象中,供后面的 jdbc 操作使用
conn.setAutoCommit (false);// 设置为手动管理事务
} catch (Exception e) {
e.printStackTrace ( );
}
}
return conn;
}
/**
* 提交事务,并关闭释放连接
*/
public static void commitAndClose() {
Connection connection = conns.get ( );//获取连接
if (connection != null) {// 如果不等于 null,说明 之前使用过连接,操作过数据库
try {
connection.commit ( );// 提交事务
} catch (SQLException e) {
e.printStackTrace ( );
} finally {
try {
connection.close ( );// 关闭连接,资源
} catch (SQLException e) {
e.printStackTrace ( );
}
}
}
// 一定要执行 remove 操作,否则就会出错。(因为 Tomcat 服务器底层使用了线程池技术)
conns.remove ( );
}
/**
* 回滚事务,并关闭释放连接
*/
public static void rollbackAndClose() {
Connection connection = conns.get ( );
if (connection != null) {// 如果不等于 null,说明 之前使用过连接,操作过数据库
try {
connection.rollback ( );//回滚事务
} catch (SQLException e) {
e.printStackTrace ( );
} finally {
try {
connection.close ( );// 关闭连接,资源资源
} catch (SQLException e) {
e.printStackTrace ( );
}
}
}
// 一定要执行 remove 操作,否则就会出错。(因为 Tomcat 服务器底层使用了线程池技术)
conns.remove ( );
}
2.1、BaseDao:Mysql工具类,基于dbUtils封装(非事务)
public abstract class BaseDao {
//使用DbUtils操作数据库
private QueryRunner queryRunner = new QueryRunner ( );
/**
* update() 方法用来执行:Insert\Update\Delete语句
*
* @return 如果返回-1,说明执行失败
返回其他表示影响的行数
*/
public int update(String sql, Object... args) {
Connection connection = JdbcUtils.getConnection ( );
try {
return queryRunner.update (connection, sql, args);
} catch (SQLException e) {
e.printStackTrace ( );
} finally {
JdbcUtils.close (connection);
}
return -1;
}
/**
* 查询返回一个javaBean的sql语句
*
* @param type 返回的对象类型
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @param 返回的类型的泛型
* @return
*/
public T queryForOne(Class type, String sql, Object... args) {
Connection con = JdbcUtils.getConnection ( );
try {
return queryRunner.query (con, sql, new BeanHandler (type), args);
} catch (SQLException e) {
e.printStackTrace ( );
} finally {
JdbcUtils.close (con);
}
return null;
}
/**
* 查询返回多个javaBean的sql语句
*
* @param type 返回的对象类型
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @param 返回的类型的泛型
* @return
*/
public List queryForList(Class type, String sql, Object... args) {
Connection con = JdbcUtils.getConnection ( );
try {
return queryRunner.query (con, sql, new BeanListHandler (type), args);
} catch (SQLException e) {
e.printStackTrace ( );
} finally {
JdbcUtils.close (con);
}
return null;
}
/**
* 执行返回一行一列的sql语句
*
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @return
*/
public Object queryForSingleValue(String sql, Object... args) {
Connection conn = JdbcUtils.getConnection ( );
try {
return queryRunner.query (conn, sql, new ScalarHandler ( ), args);
} catch (Exception e) {
e.printStackTrace ( );
} finally {
JdbcUtils.close (conn);
}
return null;
}
}
2.2、BaseDao:Mysql工具类,基于dbUtils封装(事务版)
改动说明:在原有的基础上,把finlly关闭去掉,抛出throw new RuntimeException
public abstract class BaseDao {
//使用DbUtils操作数据库
private QueryRunner queryRunner = new QueryRunner ( );
/**
* update() 方法用来执行:Insert\Update\Delete语句
*
* @return 如果返回-1,说明执行失败
返回其他表示影响的行数
*/
public int update(String sql, Object... args) {
System.out.println (" BaseDao 程序在[" + Thread.currentThread ( ).getName ( ) + "]中");
Connection connection = JdbcUtils.getConnection ( );
try {
return queryRunner.update (connection, sql, args);
} catch (SQLException e) {
e.printStackTrace ( );
throw new RuntimeException ( );
}
}
/**
* 查询返回一个javaBean的sql语句
*
* @param type 返回的对象类型
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @param 返回的类型的泛型
* @return
*/
public T queryForOne(Class type, String sql, Object... args) {
Connection con = JdbcUtils.getConnection ( );
try {
return queryRunner.query (con, sql, new BeanHandler (type), args);
} catch (SQLException e) {
e.printStackTrace ( );
throw new RuntimeException ();
}
}
/**
* 查询返回多个javaBean的sql语句
*
* @param type 返回的对象类型
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @param 返回的类型的泛型
* @return
*/
public List queryForList(Class type, String sql, Object... args) {
Connection con = JdbcUtils.getConnection ( );
try {
return queryRunner.query (con, sql, new BeanListHandler (type), args);
} catch (SQLException e) {
e.printStackTrace ( );
throw new RuntimeException ();
}
}
/**
* 执行返回一行一列的sql语句
*
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @return
*/
public Object queryForSingleValue(String sql, Object... args) {
Connection conn = JdbcUtils.getConnection ( );
try {
return queryRunner.query (conn, sql, new ScalarHandler ( ), args);
} catch (Exception e) {
e.printStackTrace ( );
throw new RuntimeException ();
}
}
}