javaEE-X-各层封装(反射)&&工具类

一、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 (); } } }

你可能感兴趣的:(javaEE-X-各层封装(反射)&&工具类)