小型员工管理系统 1.0 绿色版(java实现版,附源码)

小型员工管理系统 1.0 绿色版(java实现版)

🍅 Java学习路线:搬砖工的Java学习路线
🍅 作者:程序员小王
🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF
🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步
🍅 欢迎点赞 👍 收藏 ⭐留言 📝

员工管理系统简介:

整个系统其实很简单,这里主要技术:idea开发工具+JSP + Struts2+ JDBC + Mysql实现
1、管理员的登录,注册,验证码功能
2、员工的增删改查,批量删除,上传文件,下载文件 其中类的设计(实体)很有参考意义。
整个系统设计的目标人群是管理者,系统的主要功能是对员工进行各种信息的操作。
主要是完成对数据库的增删改查的功能。

一. 项目整体目录结构

MVC实现,界面层(Web)主要使用jsp来动态展现数据库中的数据,业务逻辑层(servlets)使用的servlet,数据访问层(dao)主要是连接各个Servlet与数据库之前的通信,从而实现对数据库的各种操作。其中的entity包主要是封装了两个实体:管理员和员工,方便且规范对数据的操作和代码的书写。

二. 界面效果展示:

1、管理员页面

(1)管理员登录页面

(2)管理员注册页面

2、员工页面

(1)员工页面展示
  • 页面展示完成员工的增删改查,员工资料管理系统:完成上传文件,下载文件

(2)员工更新【页面数据回显】

(3)添加员工页面

三、数据库设计

1、admin表(管理员的账号和密码)

2、user表(员工信息表)

四、核心jar包(jar包下载参见文章末尾)

五、核心代码展示:(完整代码参见文章末尾)

1、entity类

(1)Admin.java(管理员属性的实体层,这里有管理员的登录账号和密码的定义)

package com.tjcu.entity;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/27 18:48
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:管理员功能:登录  注册   退出
 */
public class Admin {
    private String id;
    private String name;
    private String password;

    public Admin() {
    }

    public Admin(String id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

(2)User.java(和Admin.java差不多主要是实体属性的get和set方法)

package com.tjcu.entity;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/27 18:49
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class User {
    private String id;
    private String username;
    private Double salary;
    private Integer age;

    public User() {
    }

    public User(String id, String username, Double salary, Integer age) {
        this.id = id;
        this.username = username;
        this.salary = salary;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                ", salary=" + salary +
                ", age=" + age +
                '}';
    }
}

2、Dao层

(1)AdminDao接口
  • 管理员功能:登录 注册 退出
package com.tjcu.dao;
import com.tjcu.entity.Admin;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/27 18:47
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:管理员功能:登录  注册   退出
 */
public interface AdminDao {
    /**
     * 登录
     * @param admin
     */
    public void insert(Admin admin);

    /**
     * 注册
     * @param name
     * @param password
     * @return
     */
    public Admin selectByNameAndPassword(String name,String password);

}

(2)AdminDao接口实现
package com.tjcu.dao.impl;

import com.tjcu.dao.UserDao;
import com.tjcu.entity.User;
import com.tjcu.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/27 18:56
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:员工功能:展示所有 、 添加 、 删除 、 修改
 */
public class UserDaoImpl implements UserDao {
    @Override
    public List<User> selectAll() {
        ResultSet rs = null;
        PreparedStatement pstm = null;
        Connection conn = null;
        List<User> list = new ArrayList<>();
        try {
            conn = JdbcUtils.getConnection();
            String sql = "select * from t_user;";
            pstm = conn.prepareStatement(sql);
            rs = pstm.executeQuery();
            while (rs.next()) {
                String id = rs.getString("id");
                String username = rs.getString("username");
                double salary = rs.getDouble("salary");
                int age = rs.getInt("age");
                User user = new User(id, username, salary, age);
                list.add(user);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } finally {
            JdbcUtils.close(rs, pstm, conn);
        }
    }

    @Override
    public void insert(User user) {
        Connection conn = null;
        PreparedStatement pstm = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "insert t_user value(?,?,?,?)";
            pstm = conn.prepareStatement(sql);
            pstm.setString(1, user.getId());
            pstm.setString(2, user.getUsername());
            pstm.setDouble(3, user.getSalary());
            pstm.setInt(4, user.getAge());
            pstm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(pstm, null);
        }
    }

    @Override
    public void delete(String id) {
        Connection conn = null;
        PreparedStatement pstm = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "delete from t_user where id=?";
            pstm = conn.prepareStatement(sql);
            pstm.setString(1, id);
            pstm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(pstm, null);
        }
    }

    @Override
    public User selectById(String id) {
        ResultSet rs = null;
        PreparedStatement pstm = null;
        Connection conn = null;
        User user = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "select * from t_user where id=?;";
            pstm = conn.prepareStatement(sql);
            pstm.setString(1, id);
            rs = pstm.executeQuery();
            if (rs.next()) {
                String id2 = rs.getString("id");
                String username = rs.getString("username");
                double salary = rs.getDouble("salary");
                int age = rs.getInt("age");
                user = new User(id2, username, salary, age);
            }
            return user;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } finally {
            JdbcUtils.close(rs, pstm, conn);
        }
    }

    @Override
    public void update(User user) {
        PreparedStatement pstm = null;
        Connection conn = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "update t_user set  username=?,salary=?,age=? where id=?;";
            pstm = conn.prepareStatement(sql);
            pstm.setString(1, user.getUsername());
            pstm.setDouble(2, user.getSalary());
            pstm.setInt(3, user.getAge());
            pstm.setString(4, user.getId());
            System.out.println("Update+++" + user);
            pstm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } finally {
            JdbcUtils.close(pstm, null);
        }
    }
}

(3)UserDao接口
  • 员工功能:展示所有 、 添加 、 删除 、 修改
package com.tjcu.dao;

import com.tjcu.entity.User;

import java.util.List;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/27 18:56
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:员工功能:展示所有 、 添加 、 删除 、 修改
 */
public interface UserDao {
    /**
     * 展示所有
     * @return
     */
    public List<User> selectAll();

    /**
     *  添加
     * @param user
     */
    public void insert(User user);

    /**
     * 删除
     * @param id
     */
    public void delete(String id);

    /**
     * 回显
     * @param id
     * @return
     */
    public User selectById(String id);

    /**
     * 修改
     * @param user
     */
    public void update(User user);
}

(4)UserDao接口实现
package com.tjcu.dao.impl;

import com.tjcu.dao.AdminDao;
import com.tjcu.entity.Admin;
import com.tjcu.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/27 18:48
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class AdminDaoImpl implements AdminDao {
    @Override
    public void insert(Admin admin) {
        Connection conn = null;
        PreparedStatement pstm = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "insert t_admin value(?,?,?)";
            pstm = conn.prepareStatement(sql);
            pstm.setString(1, admin.getId());
            pstm.setString(2, admin.getName());
            pstm.setString(3, admin.getPassword());
            pstm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("注册异常");
        } finally {
            JdbcUtils.close(pstm, null);
        }
    }

    @Override
    public Admin selectByNameAndPassword(String name, String password) {
        Connection conn = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        Admin admin = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "select * from t_admin where name=? and password=?";
            pstm = conn.prepareStatement(sql);
            pstm.setString(1, name);
            pstm.setString(2, password);
            rs = pstm.executeQuery();
            if (rs.next()) {
                admin = new Admin();
                admin.setId(rs.getString(1));
                admin.setName(rs.getString(2));
                admin.setPassword(rs.getString(3));
            }
            return admin;

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("登录异常");
            throw new RuntimeException(e.getMessage());

        } finally {
            JdbcUtils.close(rs, pstm, conn);
        }
    }
}

3、service层[略,详情请参见文章末尾]

4、struts2实现Action层

(1)MyAction:管理员登录、注册 员工:增删改查
package com.tjcu.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/10 20:48
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class DownloadAction extends ActionSupport {
    //1接收用户要下载的文件名称

    private String fileName;

    //服务器上下载文件的存储文件夹

    private String filePath;

    //服务方法用于文件下载

    public InputStream getInputStream() throws Exception {
        //根据相对路径获取下载文件的绝对路径
        String realPath = ServletActionContext.getRequest().getSession().getServletContext().getRealPath(filePath);
        FileInputStream is = new FileInputStream(realPath + "\\" + fileName);
        System.out.println(is);
        //将读取的文件输入流直接返回到Client
        return is;
    }


    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}

(2)UploadAction:上传功能
package com.tjcu.action;
import com.opensymphony.xwork2.ActionSupport;
import com.tjcu.entity.Admin;
import com.tjcu.entity.User;
import com.tjcu.service.AdminService;
import com.tjcu.service.impl.AdminServiceImpl;
import com.tjcu.service.impl.UserServieImpl;
import org.apache.struts2.ServletActionContext;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/29 19:50
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class MyAction extends ActionSupport {
    private String password1;
    private String password2;
    private  String name;
    private Admin admin;
    private User user;
    private String[] isCheck;
    private String code;

    public String register(){
//        管理员注册
        if(password1.equals(password2)){
           Admin admin1= new Admin(null, name, password1);
            System.out.println(admin1);
            AdminService adminService = new AdminServiceImpl();
            adminService.register(admin1);
            return "registerOk";
        }else {
            return  "registerError";
        }


    }

    public String login() throws UnsupportedEncodingException {
//        管理员登录
        HttpServletRequest request = ServletActionContext.getRequest();
        request.setCharacterEncoding("utf-8");
        AdminService adminService = new AdminServiceImpl();
        Admin admin1 = adminService.login(admin.getName(), admin.getPassword());
        System.out.println(admin1);
        HttpSession session = request.getSession();
        String code1 = (String) session.getAttribute("code");
        if(code.equals(code1)){
            if(admin1!=null){

                System.out.println(admin1.getName());
                request.getSession().setAttribute("admin",admin.getName());
                return "loginOk";

            }else{
                return "loginError";
            }
        }else{
            return "loginError";
        }

    }

    public String userAdd(){
//        添加用户
        UserServieImpl userServie = new UserServieImpl();
        User user2 = new User(null,user.getUsername(),user.getSalary(),user.getAge());
        userServie.add(user2);
        return "useraddOk";
    }
    public String userDelete(){
//        删除用户
        UserServieImpl userServie = new UserServieImpl();
        userServie.drop(user.getId());
        System.out.println(user.getId());
        return "userDeleteOk";
    }
    public String deleteAll(){
//        批量删除用户
        UserServieImpl userServie = new UserServieImpl();
        for (String id : isCheck) {
                userServie.drop(id);
        }
        System.out.println(isCheck);
        return "dropAllOk";
    }
    public String userSelectById(){
//        根据id查用户
        UserServieImpl userServie = new UserServieImpl();
        User user1 = userServie.selectById(user.getId());
        System.out.println(user1);
        HttpServletRequest request = ServletActionContext.getRequest();
        request.setAttribute("user",user1);
        return  "userSelectOk";
    }
    public String userShow(){
//        展示用户
        HttpServletRequest request = ServletActionContext.getRequest();
        if(request.getSession().getAttribute("admin")!=null) {
            UserServieImpl userServie = new UserServieImpl();
            List<User> users = userServie.show();

            request.setAttribute("users", users);

            return "userShowOk";
        }else {
            return "userShowError";
        }
    }
    public String userUpdate(){
//        更新用户
        UserServieImpl userServie = new UserServieImpl();
        User user1 = new User(user.getId(),user.getUsername(),user.getSalary(),user.getAge());
        System.out.println("update"+user1);
        userServie.update(user1);
        return "userUpdateOk";
    }

    public String session(){
        HttpServletRequest request = ServletActionContext.getRequest();
        request.getSession().invalidate();
        return "sessionOk";
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Admin getAdmin() {
        return admin;
    }

    public void setAdmin(Admin admin) {
        this.admin = admin;
    }

    public String getPassword1() {
        return password1;
    }

    public void setPassword1(String password1) {
        this.password1 = password1;
    }

    public String getPassword2() {
        return password2;
    }

    public void setPassword2(String password2) {
        this.password2 = password2;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String[] getIsCheck() {
        return isCheck;
    }

    public void setIsCheck(String[] isCheck) {
        this.isCheck = isCheck;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

(3)DownloadAction:下载功能
package com.tjcu.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import java.io.File;
import java.io.IOException;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/10 20:27
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class UploadAction extends ActionSupport {
    //接收数据

    private File upload;

//    Struts2框架提供数据获取上传文件原名方式 成员变量 名字:上传文件+“FileName”

    private String uploadFileName;

//    获取当前上传文件类型 成员变量 名字:上传文件+ContentType MIMA类型 大类型/小类型

    private String uploadContentType;
    //Struts2的Action成员变量的作用
    //1、接收Client请求参数 2.替换Request作用域  3.可以通过Struts2配置文件为Action的成员变量赋值
//    可以通过Struts2配置文件为Action的成员变量赋值 String path

    private String filePath;

    @Override
    public String execute() throws Exception {
        System.out.println("文件名" + uploadFileName);
        System.out.println("文件类型" + uploadContentType);
        System.out.println(filePath);
//        可以通过相对路径获取绝对路径 ServletContetx.getRealPath("path") 通过相对路径获取绝对路径
        String realPath = ServletActionContext.getRequest().getSession().getServletContext().getRealPath(filePath);
        System.out.println(realPath);
        FileUtils.copyFile(upload, new File(realPath +"//"+ uploadFileName));
        //跳转页面
        return SUCCESS;
    }

    public File getUpload() {
        return upload;
    }

    public void setUpload(File upload) {
        this.upload = upload;
    }

    public String getUploadFileName() {
        return uploadFileName;
    }

    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

    public String getUploadContentType() {
        return uploadContentType;
    }

    public void setUploadContentType(String uploadContentTtpe) {
        this.uploadContentType = uploadContentTtpe;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
}

(4)ValidationCodeAction:验证码功能
package com.tjcu.action;
/**
 *  用于生成验证码图片  不提供返回页面
 * @author 86151
 */
public class ValidationCodeAction implements Action {
  private static final long serialVersionUID = 5126616339795936447L;

  private ConfigurableCaptchaService configurableCaptchaService = null;
  private ColorFactory colorFactory = null;
  private RandomFontFactory fontFactory = null;
  private RandomWordFactory wordFactory = null;
  private TextRenderer textRenderer = null;

  public void init() throws ServletException {
    configurableCaptchaService = new ConfigurableCaptchaService();

    // 颜色创建工厂,使用一定范围内的随机色
    colorFactory = new RandomColorFactory();
    configurableCaptchaService.setColorFactory(colorFactory);

    // 随机字体生成器
    fontFactory = new RandomFontFactory();
    fontFactory.setMaxSize(32);
    fontFactory.setMinSize(28);
    configurableCaptchaService.setFontFactory(fontFactory);

    // 随机字符生成器,去除掉容易混淆的字母和数字,如o和0等
    wordFactory = new RandomWordFactory();
    wordFactory.setCharacters("abcdefghkmnpqstwxyz23456789");
    wordFactory.setMaxLength(5);
    wordFactory.setMinLength(4);
    configurableCaptchaService.setWordFactory(wordFactory);

    // 自定义验证码图片背景
    MyCustomBackgroundFactory backgroundFactory = new MyCustomBackgroundFactory();
    configurableCaptchaService.setBackgroundFactory(backgroundFactory);

    // 图片滤镜设置
    ConfigurableFilterFactory filterFactory = new ConfigurableFilterFactory();

    List<BufferedImageOp> filters = new ArrayList<BufferedImageOp>();
    WobbleImageOp wobbleImageOp = new WobbleImageOp();
    wobbleImageOp.setEdgeMode(AbstractImageOp.EDGE_MIRROR);
    wobbleImageOp.setxAmplitude(2.0);
    wobbleImageOp.setyAmplitude(1.0);
    filters.add(wobbleImageOp);
    filterFactory.setFilters(filters);

    configurableCaptchaService.setFilterFactory(filterFactory);

    // 文字渲染器设置
    textRenderer = new BestFitTextRenderer();
    textRenderer.setBottomMargin(3);
    textRenderer.setTopMargin(3);
    configurableCaptchaService.setTextRenderer(textRenderer);

    // 验证码图片的大小
    configurableCaptchaService.setWidth(82);
    configurableCaptchaService.setHeight(32);
  }


  @Override
  public String execute() throws Exception {
    init();

    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();


    response.setContentType("image/png");
    response.setHeader("cache", "no-cache");

    HttpSession session = request.getSession(true);
    OutputStream outputStream = response.getOutputStream();

    // 得到验证码对象,有验证码图片和验证码字符串
    Captcha captcha = configurableCaptchaService.getCaptcha();
    // 取得验证码字符串放入Session
    String validationCode = captcha.getChallenge();
    session.setAttribute("code", validationCode);
    // 取得验证码图片并输出
    BufferedImage bufferedImage = captcha.getImage();
    ImageIO.write(bufferedImage, "png", outputStream);

    outputStream.flush();
    outputStream.close();

    destroy();

    return null;
  }


  public void destroy() {
    wordFactory = null;
    colorFactory = null;
    fontFactory = null;
    textRenderer = null;
    configurableCaptchaService = null;
  }

  /**
   * 自定义验证码图片背景,主要画一些噪点和干扰线
   */
  private class MyCustomBackgroundFactory implements BackgroundFactory {
    private Random random = new Random();

    @Override
    public void fillBackground(BufferedImage image) {
      Graphics graphics = image.getGraphics();

      // 验证码图片的宽高
      int imgWidth = image.getWidth();
      int imgHeight = image.getHeight();

      // 填充为白色背景
      graphics.setColor(Color.WHITE);
      graphics.fillRect(0, 0, imgWidth, imgHeight);

      // 画100个噪点(颜色及位置随机)
      for (int i = 0; i < 100; i++) {
        // 随机颜色
        int rInt = random.nextInt(255);
        int gInt = random.nextInt(255);
        int bInt = random.nextInt(255);

        graphics.setColor(new Color(rInt, gInt, bInt));

        // 随机位置
        int xInt = random.nextInt(imgWidth - 3);
        int yInt = random.nextInt(imgHeight - 2);

        // 随机旋转角度
        int sAngleInt = random.nextInt(360);
        int eAngleInt = random.nextInt(360);

        // 随机大小
        int wInt = random.nextInt(6);
        int hInt = random.nextInt(6);

        graphics.fillArc(xInt, yInt, wInt, hInt, sAngleInt, eAngleInt);

        // 画5条干扰线
        if (i % 20 == 0) {
          int xInt2 = random.nextInt(imgWidth);
          int yInt2 = random.nextInt(imgHeight);
          graphics.drawLine(xInt, yInt, xInt2, yInt2);
        }
      }
    }
  }
}

5、util层

  • 手动封装JDBCUtils工具类
package com.tjcu.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/11 12:38
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class JdbcUtils {
    //    静态的Properties集合,相当于属性

    private static Properties p = new Properties();
    //    静态的ThreadLocal输性  线程绑定对象

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


    static {
        InputStream is = JdbcUtils.class.getResourceAsStream("/com/tjcu/jdbc.properties");
        try {
            p.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        //从ThreadLocal中获取Connection
        Connection conn = t.get();
        try {
            if (conn == null) {
                Class.forName(p.getProperty("driver"));
                conn = DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password"));
                t.set(conn);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t.get();
    }

    public static void close(ResultSet rs, PreparedStatement pstm, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (pstm != null) {
            try {
                pstm.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
                t.remove();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }
    }
    public static void close(ResultSet rs, PreparedStatement pstm) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (pstm != null) {
            try {
                pstm.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }


    }

    public static void close(PreparedStatement pstm, Connection conn) {
        if (pstm != null) {
            try {
                pstm.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
                //关闭链接后切记使用remove方法,移除ThreadLocal中已关闭的链接对象
                t.remove();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }

    }

    //关闭资源  用于关闭连接
    public static void close(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
                //关闭链接后切记使用remove方法,移除ThreadLocal中已关闭的链接对象
                t.remove();
            } catch (Exception e) {
            }
        }
    }
}

6、config 配置文件:jdbc.properties

  • mysql-connector-java-8.0.16.jar之后com.mysql.cj.jdbc.Driver
driver=com.mysql.cj.jdbc.Driver
username=root
password=root
url=jdbc:mysql://localhost:3306/msc?useUnicode=true&characterEncoding=UTF-8  & useSSL=false & serverTimezone=Asia/Shanghai
源代码在githee仓库:

程序员小王Gitee: https://gitee.com/wanghengjie563135/EMS.git
文末
👉在此,鸣谢:刘浩老师讲解

📌 作者:王恒杰

📃 更新: 2021.10.18

❌ 勘误: 无

📜 声明: 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!
🍅 欢迎点赞 👍 收藏 ⭐留言 📝

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
基于struts网上书店 JSP+Access论坛 网络招标信息管理系统 sql2000网络教学平台 mySQL超市管理系统 超市管理系统 教学管理系统 基于网络环境的选课系统 学生信息管理系统 新闻系统 新闻文章发布系统 考试系统 网络教学系统 网上书店系统 问卷管理... www.yateshi.com/service/13519.html 21K 2009-4-8 - 百度快照 求职java方向的web开发! - 程序员/软件工程师 - 58.com 2.熟悉STRUTS结构、MVC的开发;熟练Hibernate数据库持久层的开发及Spring。 3.能熟练应用多种JAVA应用服务器(Tomcat ,...武汉星星超市管理系统(2007-10-2007-12) 项目描述:对超市的货物、员工、财务进行管理 职责:模块开发,系统设计,数据... bj.58.com/tech/35220795x.shtml 11K 2009-2-13 - 百度快照 源码下载列表 - 纽纶网 | Nulung.com 600G IT资料,文档,书籍,... 1568_fjswpic12人气:超市管理系统\\数据库脚本和数据库备份超市管理系统\\数据库脚本和数据库备份-Supermarket ...所属分类:发布日期:2008-10-13文件大小:3845697提供者:StrutsNETBOOK6人气:一款网上书店的J2EE代码,采用STRUTS技术 ... www.dssz.net/100304-size-asc/1249.html 15K 2009-4-21 - 百度快照 新东方一搏职业培训学校 开发基于桌面的J2SE应用系统;(...2、MVC模式、Struts框架 3、...系统分析师。主要研究方向为软件项目管理、软件产品生命...曾主持参与铁路系统多个大型项目设计与开发,如全国铁路货车大修财务清算系统、车号标签自动识别系统、货车检修成本管理... www.hrbrcw.com/job/1920.aspx?jid=5165 53K 2009-4-22 - 百度快照
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小王java

学习java的路上,加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值