基于Javaweb实现校园疫情管理系统

作者简介:全栈开发工程,从事Java、Python、前端、小程序方面的开发和研究,对大数据应用与开发比较感兴趣,

主要内容:Java项目、前端项目、Python项目、小程序开发、大数据项目、单片机

收藏点赞不迷路  关注作者有好处

文末获取源码 

感谢您的关注,请收藏以免忘记,点赞以示鼓励,评论给以建议,爱你哟

项目编号:BS-GX-069

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:Javaweb

二,项目简介

本项目基于Javaweb开发实现一个校园疫情管理系统。系统设计的参与人员角色总共有三类:学生、教师、管理员。学生可以在线注册信息,教师由管理员分配账户,管理员由系统初始化指定。

学生登录系统可以在线申请离校和返校,提交个人体温数据,管理个人资料信息。老师登录系统可以对学生提交的信息进行审批,也可以上报自己的健康体温数据并修改个人信息。管理员登录系统后可对学生、教师、学院、专业、班级信息进行基础数据管理,并可以管理学生和教师上报的健康信息,管理入校和离校的申请信息,并统计离校人员数量。具体见下面展示。

三,系统展示

用户登录

管理员管理

学生信息管理

教职工管理

学院管理

专业管理

班级管理

健康和体温采集管理

入校申请管理

离校申请管理

离校统计

四,核心代码展示

package dao;

import util.threadlocal.LocalRequestContext;
import util.threadlocal.LocalRequestContextHolder;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * 继承自ArrayList 的实现,并实现分页代码的展示
 * @param <E>
 */
public class Collect<E> extends ArrayList<E> {
    // 总数
    protected long count = 0;
    // 当前分页
    protected int page = -1;
    // 分页总数
    protected int pageCount = 0;
    // 第一行起始位置 limit firstRow,listRows 即可
    public int firstRow = 0;
    // 取数据库的行数
    public int listRows = 15;
    // URL 规则
    protected String urlRule = "";


    // 表现层代码
    private String info;
    private Collect()
    {

    }

    public String getUrlRule() {
        return urlRule;
    }

    public String getInfo() {
        return info;
    }

    /**
     *
     * @param count 总行数
     * @param pagesize  一页展示多少条数据
     */
    public Collect(long count , int pagesize )
    {
        this.listRows = pagesize;
        this.count = count;
        this.initLimit();
    }

    /**
     *
     * @param count 总行数
     * @param pagesize 一页展示多少条数据
     * @param page  当前页
     */
    public Collect(long count , int pagesize , int page )
    {
        this.listRows = pagesize;
        this.count = count;
        this.page = page;
        this.initLimit();
    }

    /**
     * 初始化
     */
    protected void initLimit()
    {
        // 取分页数有多少
        double ceil = (double) this.count / (double)this.listRows;
        // 分页页面总数
        this.pageCount =  this.count == 0 ? 0 : new Double(Math.ceil(ceil)).intValue();
        // 取URL 规则
        this.urlRule = getRequestUrlPath();
        // 获取第一行的位置
        firstRow = listRows*(page-1);
        // 渲染分页代码
        info = reader();
        // 获取当前线程的Request
        LocalRequestContext content = LocalRequestContextHolder.getLocalRequestContext();
        HttpServletRequest res = content.getRequest();

        // 赋值给模版,模版采用 ${info.page} 即可显示分页
        HashMap p = new HashMap();
        p.put("info" , info);
        //PageCollect p = new PageCollect();
        //p.setInfo(info);
        res.setAttribute("page" , p);
    }

    public long getCount()
    {
        return count;
    }

    public void setCount(long c)
    {
        this.count = c;
    }

    /**
     * 渲染页面展示函数
     * @return
     */
    public String reader()
    {
        // 初始化字符串缓冲区
        StringBuffer buffer = new StringBuffer();
        // 替换URL 规则
        String url = urlRule.replace("page={page}" , "");
        // 生成表单
        buffer.append("<form action=\""+url+"\" method=\"get\"><div class=\"pages\">");
        buffer.append("<span>共").append(this.count).append("条").append("&nbsp;");
        buffer.append(this.page).append("/").append(this.pageCount).append("页</span>");

        // 渲染第一页
        getFirstPage(buffer);
        // 渲染上一页
        getPrevPage(buffer);
        // 渲染页码 如: 1 2 3 4 5 这样
        getCenterPage(buffer);
        // 渲染下一页
        getNextPage(buffer);
        // 渲染最后一页
        getLastPage(buffer);
        // 渲染下拉框
        getSelect(buffer);
        buffer.append("</div></form>");
        //int currentPage = ;
        // 返回渲染好的HTML 代码
        return buffer.toString();
    }

    /**
     * 渲染下拉框
     * @param buffer
     */
    protected void getSelect(StringBuffer buffer)
    {
        buffer.append("<select name=\"page\" onchange=\"this.form.submit()\">");
        for(int i=1;i<=pageCount;i++){
            buffer.append("<option value='"+i+"'"+(page==i?" selected":"")+">"+i+"</option>");
        }
        buffer.append("</select>");
    }

    /**
     * 渲染页码 如1、2、3、4、5
     * @param buffer
     */
    protected void getCenterPage(StringBuffer buffer)
    {
        // 取中间页面
        int rollPage = 2;
        int show_nums = rollPage * 2 +1;
        int i=0;
        if(pageCount <= show_nums){

            for(i = 1;i<=pageCount;i++){
                if(i == this.page){
                    buffer.append("<a href=\"javascript:;\" class=\"active\">"+i+"</a>");
                }else{
                    buffer.append("<a href=\"").append(this.getUrlPath(i)).append("\">"+i+"</a>");
                }
            }
        }else if(page < (1+rollPage)){
            for(i = 1;i<=show_nums;i++){
                if(i == page){
                    buffer.append("<a href=\"javascript:;\" class=\"active\">"+i+"</a>");
                }else{
                    buffer.append("<a href=\"").append(this.getUrlPath(i)).append("\">"+i+"</a>");
                }
            }
        }else if(page >= (pageCount - rollPage)){
            for(i = pageCount - show_nums ; i <= pageCount ; i++){
                if(i == page){
                    buffer.append("<a href=\"javascript:;\" class=\"active\">"+i+"</a>");
                }else{
                    buffer.append("<a href=\"").append(this.getUrlPath(i)).append("\">"+i+"</a>");
                }
            }
        }else{
            int start_page = page - rollPage;
            int end_page = page + rollPage;
            for(i = start_page ; i<=end_page ; i++){
                if(i == page){
                    buffer.append("<a href=\"javascript:;\" class=\"active\">"+i+"</a>");
                }else{
                    buffer.append("<a href=\"").append(this.getUrlPath(i)).append("\">"+i+"</a>");
                }
            }
        }
    }

    /**
     * 渲染第一页
     * @param buffer
     */
    protected void getFirstPage(StringBuffer buffer)
    {
        buffer.append("<a href=\"").append(this.getUrlPath(1)).append("\">第一页</a>");
    }

    /**
     * 渲染上一页
     * @param buffer
     */

    protected void getPrevPage(StringBuffer buffer)
    {
        if(this.page == 1){
            getDisabledButton(buffer , "上一页");
        }else{
            buffer.append("<a href=\"").append(getUrlPath(this.page - 1)).append("\">上一页</a>");
        }
    }

    /**
     * 渲染下一页
     * @param buffer
     */
    protected void getNextPage(StringBuffer buffer)
    {
        if(this.page < this.pageCount)
        {
            buffer.append("<a href=\"").append(getUrlPath(this.page + 1)).append("\">下一页</a>");
        }else{
            getDisabledButton(buffer , "下一页");
        }
    }

    /**
     * 渲染最后一页
     * @param buffer
     */
    protected void getLastPage(StringBuffer buffer)
    {
        buffer.append("<a href=\"").append(this.getUrlPath(this.pageCount)).append("\">尾页</a>");
    }

    /**
     * 渲染不可点的按钮
     * @param buffer
     * @param name
     */
    protected void getDisabledButton(StringBuffer buffer , String name)
    {
        buffer.append("<a href='javascript:;' class=\"disabled\">").append(name).append("</a>");
    }

    /**
     * 获取替换成功的页码
     * @param page
     * @return
     */
    protected String getUrlPath(int page)
    {
        return this.urlRule.replace("{page}" , String.valueOf(page));
    }

    /**
     * 根据当前页面生成URL规则,
     * @return
     */
    protected String getRequestUrlPath()
    {
        // 获取当前线程的Request
        LocalRequestContext context = LocalRequestContextHolder.getLocalRequestContext();

        // 取 URL 后面的参数如: a=b&b=c&d=e
        String queryString = context.getRequest().getQueryString();
        if(queryString == null){
            queryString = "";
        }
        // 创建缓冲区
        StringBuffer buffer = new StringBuffer(queryString.length()+16);
        // 获取URL path 参数如: /index.jsp
        String requestURI = context.getRequest().getRequestURI();


        // 开始写入参数
        buffer.append(requestURI).append("?");
        // 获取URL提交的参数
        Map<String,String[]> param = context.getRequest().getParameterMap();
        String name = "";
        String value = "";

        // 是否搜索page 参数
        boolean isSearchPage = false;
        int page = -1;

        for (Map.Entry<String, String[]> entry : param.entrySet()) {
            try{
                name = entry.getKey();
                String[] values = entry.getValue();

                // 当前参数等于=page
                if(name.equals("page")){
                    page = Integer.valueOf(values[0]).intValue();

                    // 写入url 规则的是:page={page} 使用时替换{page}即可
                    buffer.append(name).append("=").append("{page}").append("&");
                    isSearchPage = true;
                } else if (null == values) {
                    // 值等于null,所以也写入
                    buffer.append(name).append("=").append("&");
                } else if (values.length>1) {
                    // 同名参数,多个
                    for (int i = 0; i < values.length; i++) { //用于请求参数中有多个相同名称
                        value = URLEncoder.encode(values[i] , "UTF-8");
                        buffer.append(name).append("=").append(value).append("&");
                    }
                    //value = value.substring(0, value.length() - 1);
                } else {
                    value = URLEncoder.encode(values[0] , "UTF-8");
                    buffer.append(name).append("=").append(value).append("&");//用于请求参数中请求参数名唯一
                }
            }catch (UnsupportedEncodingException e){
                e.printStackTrace();
            }
        }
        // 写入当前页码
        if(this.page == -1){
            this.page = page;
        }
        // 防止page 小于1
        this.page = Math.max(this.page , 1);

        // 没有搜索到页码直接写入
        if(!isSearchPage){
            buffer.append("page={page}&");
        }
        String result = buffer.toString();
        return result.substring(0 , result.length()-1);
    }


    public int getPage() {
        return page;
    }
}
package dao;


import dao.db.Builder;
import util.Info;
import util.StringUtil;

import java.sql.*;
import java.util.*;

/**
 * 操作数据库链式执行
 * 目前只实现了部分方法,之后会继续完善该代码,让其支持实体类的数据获取
 * 使用方法:Query.make("表名称").where("字段名" , "条件符号","条件值").select()
 *
 */
public class Query {
    protected String mName = "";
    protected HashMap mOption = null;
    protected String pk = "id";
    protected HashMap mData = null;
    protected Builder builder = null;


    public static HashMap tableFields = new HashMap();
    public Query()
    {
        reset();
    }


    /**
     * 构造Query
     * @param name
     */
    public Query(String name)
    {
        reset();
        setName(name);
    }

    /**
     * 重置并初始化数据
     * @return
     */
    protected Query reset()
    {
        mName = "";
        mOption = null;
        mOption = new HashMap();
        mData = new HashMap();
        builder = Builder.make(new CommDAO().getConn());

        if(tableFields == null)
        {
            tableFields = new HashMap();
        }
        return this;
    }

    /**
     * 设置一个字段自增
     * @param field
     * @param step
     * @return
     */
    public Query inc(String field , int step)
    {
        if(step<1)step = 1;
        ArrayList list = new ArrayList();
        list.add("inc");
        list.add(step);
        mData.put(field , list);
        return this;
    }
    /**
     * 设置一个字段自减
     * @param field
     * @param step
     * @return
     */
    public Query dec(String field , int step)
    {
        if(step<1)step = 1;
        ArrayList list = new ArrayList();
        list.add("dec");
        list.add(step);
        mData.put(field , list);
        return this;
    }
    /**
     * 马上更新数据字段自增1
     * @param field
     * @return
     */
    public boolean setInc(String field)
    {
        return setInc(field ,1);
    }
    /**
     * 马上更新数据字段自增step
     * @param field
     * @param step
     * @return
     */
    public boolean setInc(String field , String step)
    {
        return inc(field , Integer.valueOf(step).intValue()).update();
    }
    /**
     * 马上更新数据字段自增step
     * @param field
     * @param step
     * @return
     */
    public boolean setInc(String field , int step)
    {
        return inc(field , step).update();
    }
    /**
     * 马上更新数据字段自减1
     * @param field
     * @return
     */
    public boolean setDec(String field )
    {
        return setDec(field , 1);
    }
    /**
     * 马上更新数据字段自减step
     * @param field
     * @param step
     * @return
     */
    public boolean setDec(String field , String step)
    {
        return dec(field , Integer.valueOf(step).intValue()).update();
    }
    /**
     * 马上更新数据字段自减step
     * @param field
     * @param step
     * @return
     */
    public boolean setDec(String field , int step)
    {
        return dec(field , step).update();
    }
    /**
     * 设置某字段为某个值,并更新
     * @param field
     * @param step
     * @return
     */
    public boolean setField(String field , Object step)
    {
        mData.put(field , step);
        return update();
    }

    /**
     * 获取当前写入的data
     * @return
     */
    public HashMap getData()
    {
        return mData;
    }

    /**
     * 更新当前数据
     * @return
     */
    public boolean update()
    {
        return update(null);
    }

    /**
     * 更新当前数据加写入的data
     * @param updateData
     * @return
     */
    public boolean update( HashMap updateData )
    {
        if(updateData != null){
            mData.putAll(updateData);
        }
        String sql = builder.buildUpdate(this);
        executeInsert(sql);
        return true;
    }

    /**
     * 向query 写入data
     * @param data
     * @return
     */
    public Query data(Map data)
    {
        mData.putAll(data);
        return this;
    }

    /**
     * 向当前query 写入data
     * @param name
     * @param value
     * @return
     */
    public Query data(String name , String value)
    {
        mData.put(name , value);
        return this;
    }
    /**
     * 向当前query 写入data
     * @param name
     * @param value
     * @return
     */
    public Query data(String name , int value)
    {
        mData.put(name , value);
        return this;
    }
    /**
     * 向当前query 写入data
     * @param name
     * @param value
     * @return
     */
    public Query data(String name , long value)
    {
        mData.put(name , value);
        return this;
    }
    /**
     * 向当前query 写入data
     * @param name
     * @param value
     * @return
     */
    public Query data(String name , float value)
    {
        mData.put(name , value);
        return this;
    }
    /**
     * 向当前query 写入data
     * @param name
     * @param value
     * @return
     */
    public Query data(String name , double value)
    {
        mData.put(name , value);
        return this;
    }
    /**
     * 向当前query 写入data
     * @param name
     * @param value
     * @return
     */
    public Query data(String name , boolean value)
    {
        mData.put(name , value ? 1 : 0);
        return this;
    }

    /**
     * 插入数据
     * @param insertData
     * @return
     */
    public int insert(HashMap insertData ){ return insert(insertData , false); }

    /**
     * 插入数据
     * @param insertData
     * @param replace
     * @return
     */
    public int insert(HashMap insertData , boolean replace)
    {
        if(insertData != null){
            mData.putAll(insertData);
        }
        String sql = builder.buildInsert(this , replace);
        return executeInsert(sql);
    }

    /**
     * 获取当前自增字段名称
     * @return
     */
    public String getPk() {
        return pk;
    }

    /**
     * 设置自增字段名
     * @param pk
     */
    public void setPk(String pk) {
        this.pk = pk;
    }

    /**
     * 尚未实现该代码,获取表的数据
     */
    protected void finalize()
    {

        //Statement st = conn.createStatement();
        //System.out.print(sql);
        //ResultSet rs
        //super.finalize();

        free();
    }

    /**
     * 释放资源
     */
    public void free()
    {
        // 释放rs
        for(int i=0;i<resultSetList.size();i++){
            Object os = resultSetList.get(i);
            try{
                if(os instanceof Statement){
                    Statement st = ((Statement) os);
                    st.close();
                }else if(os instanceof ResultSet){
                    ((ResultSet) os).close();
                }
            }catch (SQLException e){
            }
        }
        resultSetList.clear();
    }

    /**
     * 设置表名称
     * @param name
     * @return
     */
    public Query setName(String name)
    {
        mName = name;
        return this;
    }

    /**
     * 获取表名称
     * @return
     */
    public String getName()
    {
        return mName;
    }

    /**
     * 设置属性
     * @param name
     * @param value
     * @return
     */
    public Query setAttribute(String name , Object value)
    {
        getOptionHashMap("data").put(name , value);
        return this;
    }
    /**
     * 获取属性
     * @param name
     * @return
     */
    public Object getAttribute(String name)
    {
        return getOptionHashMap("data").get(name);
    }

    /**
     * 设置字段为 获取所有字段
     * @return
     */
    public Query field()
    {
        return field("*");
    }

    /**
     * 设置字段,可以用","逗号隔开多个
     * @param field
     * @return
     */
    public Query field(String field)
    {
        getOptionArrayList("field").add(field);
        return this;
    }

    /**
     * 设置表
     * @param nTable
     * @return
     */
    public Query table(String nTable)
    {
        getOptionArrayList("table").add(nTable);
        return this;
    }
    /**
     * 设置表
     * @param nTable
     * @return
     */
    public Query table(String nTable , String alias)
    {
        getOptionArrayList("table").add(nTable+" "+alias);
        return this;
    }
    /**
     * 设置行数
     * @param nLimit
     * @return
     */
    public Query limit(int nLimit)
    {
        //getOptionHashMap("limit").put("limit" , String.valueOf(nLimit));
        return limit(String.valueOf(nLimit));
    }

    /**
     * 设置起始行和行数
     * @param offset
     * @param nLimit
     * @return
     */

    public Query limit(int offset , int nLimit)
    {
        return limit(String.valueOf(offset) , String.valueOf(nLimit));
    }

    /**
     * 设置是否锁表
     * @param lock
     * @return
     */
    public Query lock( boolean lock )
    {
        return this.lock(lock ? " FOR UPDATE " : "");
    }

    /**
     * 设置锁表代码
     * @param lock
     * @return
     */
    public Query lock(String lock)
    {
        getOption().put("lock" , lock);
        return this;
    }

    /**
     * 设置行数,字符串形式
     * @param nLimit
     * @return
     */
    public Query limit(String nLimit)
    {
        if(nLimit.indexOf(",") != -1){
            String[] list = nLimit.split(",");
            return limit(list[0] , list[1]);
        }
        getOptionHashMap("limit").put("limit" , nLimit);
        return this;
    }

    /**
     * 设置起始行和行数
     * @param offset
     * @param nLimit
     * @return
     */
    public Query limit(String offset , String nLimit)
    {
        HashMap map = getOptionHashMap("limit");
        map.put("limit" , nLimit);
        map.put("offset" , offset);
        return this;
    }

    /**
     * 根据ID 获取一行数据
     * @param id
     * @return
     */
    public HashMap find(int id)
    {
        where(pk , String.valueOf(id));
        return find();
    }
    /**
     * 根据ID 获取一行数据
     * @param id
     * @return
     */
    public HashMap find(String id)
    {
        where(pk , id);
        return find();
    }
    /**
     * 根据当前条件获取一行数据
     * @return
     */
    public HashMap find()
    {
        //limit(1);
        String sql = builder.buildSelect(this);
        ResultSet rs = query(sql);
        QueryData data = fetch(rs);
        return data;
    }

    /**
     * 生成统计计算语句
     * @param f
     * @param func
     * @return
     */
    protected double total(String f , String func)
    {
        String ifnull = builder.parseIfNull(func+"("+f+")" , "0");
        String field = ifnull+" count";
        if(mOption.containsKey("field")){
            getOptionArrayList("field").clear();
        }
        getOptionArrayList("field").add(field);
        HashMap data = find();
        if(data.containsKey("count")){
            String count = data.get("count").toString();
            return Double.valueOf(count).doubleValue();
        }
        return 0;
    }

    /**
     * 求某字段和
     * @param field
     * @return
     */
    public double sum(String field)
    {
        return total(field , "SUM");
    }

    /**
     * 求某字段的平均值
     * @param field
     * @return
     */
    public double avg(String field)
    {
        return total(field , "AVG");
    }

    /**
     * 求最大值
     * @param field
     * @return
     */
    public double max(String field){
        return total(field , "MAX");
    }

    /**
     * 求最小值
     * @param field
     * @return
     */
    public double min(String field)
    {
        return total(field , "MIN");
    }

    /**
     * 求数据行数
     * @return
     */
    public long count()
    {
        return count(null);
    }
    /**
     * 根据字段名求数据行数
     * @return
     */
    public long count( String field )
    {
        if(field == null){
            if(mOption.containsKey("alias")){
                field = "count("+mOption.get("alias")+".id) count";
            }else{
                field = "count(*) count";
            }
        }else{
            field = "count("+field+") count";
        }
        if(mOption.containsKey("field")){
            mOption.put("field" , new ArrayList());
            //getOptionArrayList("field").clear();
        }
        if(mOption.containsKey("order")){
            mOption.remove("order");
        }
        getOptionArrayList("field").add(field);
        HashMap data = find();
        if(data.containsKey("count")){
            return Long.valueOf((String)data.get("count")).longValue();
        }
        return 0;
    }

    /**
     * 根据列表id 删除数据
     * @param ids
     * @return
     */
    public long delete(List ids)
    {
        where(getPk() , "in" , ids);
        return delete();
    }

    /**
     * 根据id 删除数据
     * @param id
     * @return
     */

    public long delete(int id)
    {
        where(getPk() , id);
        return delete();
    }

    /**
     * 根据id 删除数据
     * @param id
     * @return
     */
    public long delete(String id)
    {
        if(id.indexOf(",")!=-1){
            where(getPk() , "in" , id);
        }else{
            where(getPk() , id);
        }
        return delete();
    }

    /**
     * 根据当前条件删除数据,如果没有条件则不执行删除
     * @return
     */
    public long delete()
    {
        if(!mOption.containsKey("where")){
            return -1;
        }
        String sql = this.builder.buildDelete(this);
        return executeUpdate(sql);
    }

    /**
     * 根据当前条件获取数据集
     * @return
     */
    public ArrayList select()
    {
        ArrayList result = new ArrayList();
        String sql = builder.buildSelect(this);

        ResultSet rs = query(sql);
        if (rs == null) {
            return result;
        }
        QueryData data = null;
        while( !((data = fetch(rs)).isEmpty()) ){
            result.add(data);
        }
        return result;
    }

    /**
     * 根据ResultSet 获取数据行
     * @param rs
     * @return
     */
    public QueryData fetch(ResultSet rs)
    {
        QueryData data = new QueryData();
        if(rs == null)return data;
        try {
            if(rs.next()){
                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();
                for(int i=1;i<=columnCount;i++){
                    String name = rsmd.getColumnName(i);
                    String value = rs.getString(i);
                    if(value == null || value.toLowerCase().equals("null")){
                        value = "";
                    }
                    data.put(name , value);
                }
            }
        }catch (SQLException sql){
            sql.printStackTrace();
        }
        return data;
    }

    protected ArrayList resultSetList = new ArrayList();

    /**
     * 查询sql 语句并返回ResultSet,这个不需要释放,系统在释放时会自动释放
     * @param sql
     * @return
     */
    public ResultSet query(String sql)
    {
        try {
            Connection conn = this.getConn();
            Statement st = conn.createStatement();
            System.out.println(sql);
            ResultSet rs = st.executeQuery(sql);

            resultSetList.add(rs);
            resultSetList.add(st);
            return rs;
        }catch (SQLException e){
            int code = e.getErrorCode();
            String message = e.getMessage();
            System.err.println("SQL execute Error");
            System.err.println("code:"+code);
            System.err.println("Message:"+message);
            //e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据当前条件获取一行数据中的某个字段的值
     * @param name
     * @return
     */
    public String value(String name)
    {
        if(!mOption.containsKey("field")){
            field(name);
        }
        HashMap data = find();
        if(data.isEmpty()){
            return "";
        }
        return String.valueOf(data.get(name));
    }

    /**
     * 设置SQL 分组
     * @param nGroup
     * @return
     */
    public Query group(String nGroup)
    {
        getOptionArrayList("group").add(nGroup);
        return this;
    }

    /**
     * 设置 SQL 排序字段
     * @param nOrder
     * @return
     */
    public Query order(String nOrder)
    {
        getOptionArrayList("order").add(nOrder);
        return this;
    }

    /**
     * 设置SQL语句使用全连接 会生成如下:INNER JOIN table t on cond 的形式
     * @param table
     * @param cond 条件
     * @return
     */
    public Query joinInner(String table , String cond)
    {
        return join(table , cond , "INNER");
    }

    /**
     * 设置sql 语句使用右连接 会生成如下:RIGHT JOIN table t on cond 的形式
     * @param table
     * @param cond
     * @return
     */
    public Query joinRight(String table , String cond)
    {
        return join(table , cond , "RIGHT");
    }
    /**
     * 设置sql 语句使用左连接 会生成如下:table t on cond 的形式
     * @param table
     * @param cond
     * @return
     */
    public Query joinLeft(String table , String cond)
    {
        return join(table , cond , "LEFT");
    }

    /**
     * 设置sql 语句使用右连接 会生成如下:type JOIN table t on cond 的形式
     * @param table
     * @param cond
     * @param type 跨不会类型
     * @return
     */
    public Query join(String table , String cond , String type)
    {
        StringBuffer buffer = new StringBuffer();
        buffer.append(" ").append(type).append(" JOIN ").append(table).append(" ON ").append(cond);

        getOptionArrayList("join").add(buffer.toString());
        return this;
    }

    /**
     * 设置当前表的别名
     * @param name
     * @return
     */
    public Query alias(String name)
    {
        mOption.put("alias" , name);
        return this;
    }

    /**
     * 获取设置参数
     * @param type
     * @return
     */
    private HashMap getOptionHashMap(String type)
    {
        if(mOption.containsKey(type)){
            return (HashMap) mOption.get(type);
        }
        HashMap map = new HashMap();
        mOption.put(type , map);
        return map;
    }

    /**
     * 获取设置参数
     * @param type
     * @return
     */
    private ArrayList getOptionArrayList(String type)
    {
        if(mOption.containsKey(type)){
            return (ArrayList) mOption.get(type);
        }
        ArrayList map = new ArrayList();
        mOption.put(type , map);
        return map;
    }

    /**
     * 设置SQL条件
     * @param name
     * @return
     */
    public Query where(String name)
    {
        HashMap list = new HashMap();
        list.put("where" , name);
        getOptionArrayList("where").add(list);
        return this;
    }

    /**
     * 设置SQL条件 会自动写成 and name='value' 这样的形式
     * @param name 字段名
     * @param value 条件值
     * @return
     */
    public Query where(String name , Object value)
    {
        return where(name , null , value ,null);
    }

    /**
     * 设置SQL条件 会自动写成 and name eq 'value' 这样的形式
     * @param name
     * @param eq   符号,可以写成:=、>、>=、<、<=、eq、neq、gt、egt、lt、elt
     * @param value
     * @return
     */
    public Query where(String name ,String eq, Object value)
    {
        return where(name , eq , value ,null);
    }

    /**
     * 设置SQL条件 会自动写成 and name eq 'value' 这样的形式
     * @param name
     * @param eq   符号,可以写成:=、>、>=、<、<=、eq、neq、gt、egt、lt、elt
     * @param Value
     * @param connect  连接符默认为:and
     * @return
     */
    public Query where(String name , String eq , Object Value , String connect)
    {
        HashMap list = new HashMap();
        list.put("name",name);
        list.put("exp" , eq == null ? "=" : eq);
        list.put("value",Value == null ? "" : Value);
        list.put("connect",connect == null ? "and" : connect);

        getOptionArrayList("where").add(list);

        return this;
    }

    /**
     * 设置SQL条件 会自动写成 and field in(inArray) 这样的形式
     * @param field
     * @param inArray
     * @return
     */

    public Query whereIn(String field , String inArray)
    {
        String[] arr = inArray.split(",");
        return where(field , "in" , arr);
    }

    /**
     * 设置SQL条件 会自动写成 and field in(inArray1,inArray2) 这样的形式
     * @param field
     * @param inArray
     * @return
     */
    public Query whereIn(String field , Object inArray)
    {
        return where(field , "in" , inArray);
    }
    /**
     * 设置SQL条件 会自动写成 and field not in(inArray1) 这样的形式
     * @param field
     * @param inArray
     * @return
     */
    public Query whereInNot(String field , Object inArray)
    {
        return where(field , "not in" , inArray);
    }

    /**
     * 设置SQL条件 会自动写成 and field between inArray 这样的形式
     * @param field
     * @param inArray
     * @return
     */
    public Query whereBetween(String field , String inArray)
    {
        String[] arr = inArray.split(",");
        return where(field , "between" , arr);
    }
    /**
     * 设置SQL条件 会自动写成 and field between 'start' and 'end' 这样的形式
     * @param field
     * @param start
     * @param end
     * @return
     */
    public Query whereBetween(String field , String start , String end)
    {
        return where(field , "between" , "'"+start+"' AND '"+end+"'");
    }

    /**
     * 设置SQL条件 会自动写成 and field not between inArray 这样的形式
     * @param field
     * @param inArray
     * @return
     */
    public Query whereBetweenNot(String field , String inArray)
    {
        String[] arr = inArray.split(",");
        return where(field , "not between" , arr);
    }
    /**
     * 设置SQL条件 会自动写成 and field not between 'start' and 'end' 这样的形式
     * @param field
     * @param start
     * @param end
     * @return
     */
    public Query whereBetweenNot(String field , String start , String end)
    {
        return where(field , "not between" , "'"+start+"' AND '"+end+"'");
    }

    /**
     * 获取connection 连接
     * @return
     */
    protected Connection getConn()
    {
        return new CommDAO().getConn();
    }

    /**
     * 根据字段类型生成默认值
     * @param type
     * @return
     */
    protected String getFieldDefault(String type)
    {
        String t = type.toUpperCase();
        if(t.equals("DATE")){
            return "0000-00-00";
        }else if(t.equals("DATETIME")){
            return "0000-00-00 00:00:00";
        }else if(t.equals("TIME")){
            return "00:00:00";
        }else if(t.equals("TIMESTAMP")){
            return Info.getDateStr();
        }else if(t.equals("FLOAT") || t.equals("DOUBLE") || t.equals("DECIMAL") || t.indexOf("INT")!=-1){
            return "0";
        }
        return "''";
    }

    /**
     * 设置字段信息防止xxs 注入
     * @param type
     * @param value
     * @return
     */
    protected String getFieldValue(String type , String value)
    {
        String t = type.toUpperCase();

        if(value == null || value.equals("")){
            // 等于空值,就写入默认值
            return getFieldDefault(type);
        }
        if(t.equals("FLOAT") || t.equals("DOUBLE") || t.equals("DECIMAL") || t.indexOf("INT")!=-1){
            return value;
        }
        return "'"+value.replace("'" , "\\'")+"'";
    }

    /**
     * 获取表字段信息
     * @param table
     * @return
     */
    protected HashMap getTableField(String table )
    {
        if(table == null){
            table = mName;
        }

        if(tableFields.containsKey(table)){
            return (HashMap) tableFields.get(table);
        }

        HashMap result = new HashMap();
        try{
            Connection conn = this.getConn();
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("select * from " + table);
            ResultSetMetaData rsmd = rs.getMetaData();
            int i = rsmd.getColumnCount();
            for (int j = 1; j <= i; j++) {
                result.put(rsmd.getColumnName(j) , rsmd.getColumnTypeName(j));
            }
            rs.close();
            st.close();
        }catch (SQLException e){
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 根据表字段生成键值 和 value值
     * @param map    数据
     * @param fields 空的字段信息
     * @param values 空的value 值 也就是要写入的值,不需要传值
     * @param isInsert  是否为插入,插入的话要写入默认值
     */
    protected void getFieldValueList(HashMap map , ArrayList fields , ArrayList values , boolean isInsert)
    {
        try{
            Connection conn = this.getConn();
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("select * from " + mName);

            ResultSetMetaData rsmd = rs.getMetaData();
            int i = rsmd.getColumnCount();
            for (int j = 1; j <= i; j++) {
                String col =rsmd.getColumnName(j);
                if (col.toLowerCase().equals("id")) continue;
                String type = rsmd.getColumnTypeName(j);
                if(map.containsKey(col)){
                    // 存在,就不理他了
                    fields.add(col);
                    values.add(getFieldValue(type ,String.valueOf(map.get(col))) );
                }else{
                    // 插入的时候才将所有字段弄过去
                    if(isInsert){
                        fields.add(col);
                        values.add(getFieldDefault(type));
                    }

                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 添加数据
     * @param map
     * @return
     */
    public String add( HashMap map )
    {
        ArrayList fields = new ArrayList();
        ArrayList values = new ArrayList();
        getFieldValueList(map , fields , values , true);

        String field = StringUtil.join(",",fields);
        String value = StringUtil.join("," , values);

        String sql = "INSERT INTO "+mName+"("+field+") VALUES("+value+")";
        int insertID = executeInsert(sql);

        return insertID == -1 ? "" : String.valueOf(insertID);
    }

    /**
     * 更新数据
     * @param map
     * @return
     */
    public boolean save(HashMap map)
    {
        ArrayList fields = new ArrayList();
        ArrayList values = new ArrayList();
        getFieldValueList(map , fields , values , false);
        ArrayList key2val = new ArrayList();
        for(int i=0;i<fields.size();i++){
            String field = (String)fields.get(i);
            String value = (String)values.get(i);
            key2val.add(field+"="+value);
        }
        ArrayList where = getOptionArrayList("where");
        if(where.size() == 0 && map.containsKey(pk)){
            this.where(pk , (String) map.get(pk));
        }
        if(where.size() == 0){
            return false;
        }

        String sql = "UPDATE "+mName+" SET "+StringUtil.join("," , key2val)+" " + parseWhere(where);

        executeInsert(sql);
        return true;
    }

    /**
     * 执行插入语句
     * @param sql
     * @return
     */
    public int executeInsert(String sql)
    {
        try {
            Connection conn = this.getConn();
            Statement rs = conn.createStatement();
            System.out.println(sql);
            rs.executeUpdate(sql , Statement.RETURN_GENERATED_KEYS);
            ResultSet rsKey = rs.getGeneratedKeys();
            rsKey.next();
            int id = rsKey.getInt(1);
            return id;
        }catch (SQLException e)
        {
            int code = e.getErrorCode();
            String message = e.getMessage();
            System.err.println("SQL execute Error");
            System.err.println("code:"+code);
            System.err.println("Message:"+message);
            //e.printStackTrace();
        }
        return -1;
    }

    /**
     * 执行更新语句
     * @param sql
     * @return
     */
    public int executeUpdate(String sql)
    {
        try {
            Connection conn = this.getConn();
            Statement rs = conn.createStatement();
            System.out.println(sql);
            int id = rs.executeUpdate(sql , Statement.RETURN_GENERATED_KEYS);
            return id;
        }catch (SQLException e)
        {
            int code = e.getErrorCode();
            String message = e.getMessage();
            System.err.println("SQL execute Error");
            System.err.println("code:"+code);
            System.err.println("Message:"+message);
            //e.printStackTrace();
        }
        return -1;
    }

    /**
     * 快速构建Query
     * @param name
     * @return
     */
    public static Query make(String name)
    {
        Query query = new Query();
        query.setName(name);
        return query;
    }

    /**
     * 获取一页数据,并生成分页代码
     * @param pagesize
     * @return
     */
    public Collect page( int pagesize )
    {
        Query c = new Query(getName());

        c.mOption.putAll(mOption);
        // 总长度
        long count = c.count();
        Collect result = new Collect( count , pagesize);
        this.limit(result.firstRow , result.listRows);
        builder.setPage(true);
        ArrayList list = select();
        builder.setPage(false);
        result.addAll(list);

        return result;
    }

    /**
     * 解析条件
     * @return
     */
    protected String parseWhere()
    {
        if(!mOption.containsKey("where")){
            return "";
        }
        return parseWhere(getOptionArrayList("where"));
    }

    /**
     * 获取当前option
     * @return
     */
    public HashMap getOption() {
        return mOption;
    }

    /**
     * 解析条件
     * @param whereList
     * @return
     */
    private String parseWhere(ArrayList whereList)
    {
        StringBuffer buffer = new StringBuffer();
        for(int i=0;i<whereList.size();i++)
        {
            HashMap map = (HashMap) whereList.get(0);
            if(i!=0){
                // 每一个的连接符
                buffer.append(" ");
                buffer.append(map.get("connect"));
                buffer.append(" ");
            }
            String key = (String) map.get("name");
            String exp = (String) map.get("exp");
            Object val = map.get("value");

            if(-1 != key.indexOf("|")){
                String[] keys = key.split("|");
                buffer.append("(");
                for(int j=0;j<keys.length;j++){
                    if(j!=0){
                        buffer.append(" OR ");
                    }
                    parseWhereItem(buffer , keys[j] , exp , val);
                }
                buffer.append(")");
            }else{
                parseWhereItem(buffer , key , exp , val);
            }
        }
        if(buffer.length() > 0){
            buffer.insert(0 , " where ");
        }
        return buffer.toString();
    }

    /**
     * 根据当前条件,获取一列的数据
     * @param field
     * @return
     */
    public List<String> getCol(String field)
    {
        List<String> result = new ArrayList();
        // 取某一列
        List<HashMap> list= select();
        for (HashMap map:list){
            result.add(map.get(field).toString());
        }
        return result;
    }

    /**
     * 根据当前条件获取列数据,健对值的关系
     * @param field
     * @param key
     * @return
     */
    public Map<String ,String> getColkey(String field , String key)
    {
        Map result = new LinkedHashMap();
        List<HashMap> list= select();
        for (HashMap map:list){
            result.put(map.get(key).toString(),map.get(field).toString());
        }
        return result;
    }

    /**
     * 格式化字符串
     * @param val
     * @return
     */
    private String formatString( String val)
    {
        return "'"+val.replace("'" , "\\'")+"'";
    }

    /**
     * 解析where 条件子语句
     * @param buffer
     * @param key
     * @param exp
     * @param val
     */
    private void parseWhereItem(StringBuffer buffer , String key , String exp , Object val)
    {
        List<String> exps = Arrays.asList("eq,neq,lt,elt,gt,egt".split(","));
        int index = exps.indexOf(key);
        String[] exps2 = "=,!=,<,<=,>,=>".split(",");
        if(index != -1){
            exp = exps2[index];
        }
        exp = exp.toLowerCase().trim();
        if(exp.equals("in") || exp.equals("not in")){
            ArrayList inArrayList = new ArrayList();
            if(val instanceof String || val instanceof String[]){
                String[] inList = val instanceof String ? ((String)val).split(",") : (String[]) val;
                for (int i=0;i<inList.length;i++){
                    inArrayList.add(formatString(inList[i]));
                }
            }else if(val instanceof List){
                for (int i=0;i<((List) val).size();i++)
                {
                    inArrayList.add(formatString((String)((List) val).get(i)));
                }
            }else if(val instanceof int[]){
                for (int i=0;i<((int[]) val).length;i++)
                {
                    inArrayList.add(((int[]) val)[i]);
                }
            }else if(val instanceof float[]){
                for (int i=0;i<((float[]) val).length;i++)
                {
                    inArrayList.add(((float[]) val)[i]);
                }
            }else if(val instanceof double[]){
                for (int i=0;i<((double[]) val).length;i++)
                {
                    inArrayList.add(((double[]) val)[i]);
                }
            }else if(val instanceof long[]){
                for (int i=0;i<((long[]) val).length;i++)
                {
                    inArrayList.add(((long[]) val)[i]);
                }
            }
            buffer.append(" ");
            buffer.append(key);
            buffer.append(" "+exp+"("+StringUtil.join("," , inArrayList)+") ");

        }else{
            buffer.append(" "+key);
            buffer.append(" "+exp+" ");
            buffer.append(formatString((String) val));
            buffer.append(" ");
        }
    }

}

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统

 

 

猜你喜欢

转载自blog.csdn.net/znzbs/article/details/132914423