src_dao_impl_EmployeeDaoImpl
package com.dao.impl;import com.dao.EmployeeDao;
import com.util.DruidUtil;
import com.vo.Employee;import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;/*** 定义EmployeeDao接口的实现类型*/
public class EmployeeDaoImpl implements EmployeeDao {@Overridepublic void addEmployee(Employee employee) {Connection conn = null;try{conn = DruidUtil.getConnection();//获取预编译语句对象String sql = "insert into emp values (?,?,?,?,?,?,?,?)";PreparedStatement prep = conn.prepareStatement(sql);//给问号赋值prep.setInt(1, employee.getEmpno());prep.setString(2, employee.getEname());prep.setString(3, employee.getJob());prep.setInt(4, employee.getMgr());prep.setDate(5, employee.getHiredate());prep.setDouble(6, employee.getSal());prep.setDouble(7, employee.getComm());prep.setInt(8, employee.getDeptno());//再次发送数据到DBMS里,进行执行prep.executeUpdate();}catch (Exception e){e.printStackTrace();}finally {DruidUtil.closeConnection(conn);}}@Overridepublic void deleteEmployee(int empno) {Connection conn = null;try{conn = DruidUtil.getConnection();//获取预编译语句对象String sql = "delete from emp where empno=?";PreparedStatement prep = conn.prepareStatement(sql);//给问号赋值prep.setInt(1, empno);//再次发送数据到DBMS里,进行执行prep.executeUpdate();}catch (Exception e){e.printStackTrace();}finally {DruidUtil.closeConnection(conn);}}@Overridepublic void updateEmployee(Employee employee) {Connection conn = null;try{conn = DruidUtil.getConnection();//获取预编译语句对象String sql = "update emp set ename=?,job=?,mgr=?,hiredate=?,sal=?,comm=?,deptno=? where empno=?";PreparedStatement prep = conn.prepareStatement(sql);//给问号赋值prep.setString(1, employee.getEname());prep.setString(2, employee.getJob());prep.setInt(3, employee.getMgr());prep.setDate(4, employee.getHiredate());prep.setDouble(5, employee.getSal());prep.setDouble(6, employee.getComm());prep.setInt(7, employee.getDeptno());prep.setInt(8, employee.getEmpno());//再次发送数据到DBMS里,进行执行prep.executeUpdate();}catch (Exception e){e.printStackTrace();}finally {DruidUtil.closeConnection(conn);}}@Overridepublic Employee findEmployeeById(int empno) {Employee employee = null;Connection conn = null;try{conn = DruidUtil.getConnection();//获取预编译语句对象String sql = "select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where empno=?";PreparedStatement prep = conn.prepareStatement(sql);//给问号赋值prep.setInt(1, empno);ResultSet set = prep.executeQuery();if (set.next()){String ename = set.getString("ename");String job = set.getString("job");int mgr = set.getInt("mgr");Date hiredate = set.getDate("hiredate");double sal = set.getDouble("sal");double comm = set.getDouble("comm");int deptno = set.getInt("deptno");employee = new Employee(empno, ename, job, mgr, hiredate, sal, comm, deptno);}}catch (Exception e){e.printStackTrace();}finally {DruidUtil.closeConnection(conn);}return employee;}@Overridepublic List<Employee> findAll() {//创建一个集合容器,用于存储多个员工对象List<Employee> list = new ArrayList<>();Connection conn = null;try{conn = DruidUtil.getConnection();//获取预编译语句对象String sql = "select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";PreparedStatement prep = conn.prepareStatement(sql);//给问号赋值ResultSet set = prep.executeQuery();while (set.next()){int empno = set.getInt("empno");String ename = set.getString("ename");String job = set.getString("job");int mgr = set.getInt("mgr");Date hiredate = set.getDate("hiredate");double sal = set.getDouble("sal");double comm = set.getDouble("comm");int deptno = set.getInt("deptno");Employee employee = new Employee(empno, ename, job, mgr, hiredate, sal, comm, deptno);list.add(employee);}}catch (Exception e){e.printStackTrace();}finally {DruidUtil.closeConnection(conn);}return list;}@Overridepublic List<Employee> findByPage(int page, int pageSize) {//创建一个集合容器,用于存储多个员工对象List<Employee> list = new ArrayList<>();Connection conn = null;try{conn = DruidUtil.getConnection();//获取预编译语句对象String sql = "select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by deptno limit ?,?";PreparedStatement prep = conn.prepareStatement(sql);//给问号赋值prep.setInt(1, (page-1)*pageSize);prep.setInt(2, pageSize);//再次执行查询ResultSet set = prep.executeQuery();while (set.next()){int empno = set.getInt("empno");String ename = set.getString("ename");String job = set.getString("job");int mgr = set.getInt("mgr");Date hiredate = set.getDate("hiredate");double sal = set.getDouble("sal");double comm = set.getDouble("comm");int deptno = set.getInt("deptno");Employee employee = new Employee(empno, ename, job, mgr, hiredate, sal, comm, deptno);list.add(employee);}}catch (Exception e){e.printStackTrace();}finally {DruidUtil.closeConnection(conn);}return list;}
}
src_dao_EmployeeDao
package com.dao;import com.vo.Employee;import java.util.List;/*** 根据实体类Employee 和 数据库中的emp表,来设计DAO层的接口类型* 该接口里实际上就是封装了一些与数据库进行交互的方法:* 增,删,改,查。*/
public interface EmployeeDao {/*** 从java的面向对象思想来考虑,前端提供了一个员工的所有的零散信息* 传入服务端后,应该封装到实体类的具体实例里。然后在DAO层,我们* 将具体实例保存到数据库中,所以,方法带实体类参数* @param employee*/void addEmployee(Employee employee);/*** 删除某一个员工,一定是前端传入了一个代表该员工的唯一标识。即主键字段** 因此该方法也应该带参数。* @param empno*/void deleteEmployee(int empno);/*** 修改一个员工的信息, 在前端的员工信息的文本框中,不一定是修改了什么信息* 因此,后端就应该考虑全面。认为全都可能被修改了,所以重新封装成对象,* 传入方法。** 注意:形参已经是修改后的数据了。* @param employee*/void updateEmployee(Employee employee);/*** 通过唯一标识,查询某一个员工的所有信息,结果封装成实体类对象* @param empno* @return*/Employee findEmployeeById(int empno);/*** 查询表中的所有记录,不需要形参,因为select * from 表名;* 每一条记录都应该封装成实体类对象。* 多个对象,应该存储到集合容器中,所以返回值应该是一个集合* @return*/List<Employee> findAll();/*** 分页查询:* select ..... from emp* order by ... limit (page-1)*pageSize,pageSize;*/List<Employee> findByPage(int page,int pageSize);
}
src_util_DaoFactory
package com.util;import com.dao.EmployeeDao;
import com.dao.impl.EmployeeDaoImpl;/*** 定义一个持久层的工厂类型,* 在该类型中提供一些静态工具方法,用于获取每个实体类对应的DAO接口实例*/
public class DaoFactory {private static EmployeeDao employeDao;//private static DeptDao deptDao;//私有化构造器,访问在外部直接new对象private DaoFactory(){}//提供一个共有的静态方法,来返回接口的实例对象public static EmployeeDao getEmployeeDaoInstance(){if(employeDao == null){employeDao = new EmployeeDaoImpl();}return employeDao;}
}
src_util_DruidUtil
package com.util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;public class DruidUtil {//定义一个静态变量:关于Druid的连接池的private static DataSource ds;static{try {//先自己读取配置文件,封装到Properties对象里InputStream io = DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");Properties properties = new Properties();properties.load(io);//Druid提供了一个工厂类,里面提供了一个createDataSource(Properties prop)方法// 会自动解析prop里的各种键值对,进行赋值ds = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {throw new RuntimeException(e);}}public static Connection getConnection() {Connection conn = null;try{conn = ds.getConnection();return conn;}catch (Exception e){e.printStackTrace();}return null;}public static void closeConnection(Connection conn) {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}public static void main(String[] args) {Connection conn = getConnection();System.out.println(conn);closeConnection(conn);}
}
src_vo_Employee
package com.vo;import java.sql.Date;
import java.util.Objects;/*** 根据ORM对象关系映射,为数据库中的emp表设计一个实体类Employee* 1. 表的字段 ---> 类的属性* 2. 表的每一行记录--->类的具体实例** 建议:数据库数值类型,在java中映射成对应的包装类型*/
public class Employee {private Integer empno;private String ename;private String job;private Integer mgr;private Date hiredate;private Double sal;private Double comm;private Integer deptno;private Employee(){}public Employee(Integer empno, String ename, String job, Integer mgr, Date hiredate, Double sal, Double comm, Integer deptno) {this.empno = empno;this.ename = ename;this.job = job;this.mgr = mgr;this.hiredate = hiredate;this.sal = sal;this.comm = comm;this.deptno = deptno;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Employee employee = (Employee) o;return Objects.equals(empno, employee.empno) && Objects.equals(ename, employee.ename) && Objects.equals(job, employee.job) && Objects.equals(mgr, employee.mgr) && Objects.equals(hiredate, employee.hiredate) && Objects.equals(sal, employee.sal) && Objects.equals(comm, employee.comm) && Objects.equals(deptno, employee.deptno);}@Overridepublic int hashCode() {return Objects.hash(empno, ename, job, mgr, hiredate, sal, comm, deptno);}public Integer getEmpno() {return empno;}public void setEmpno(Integer empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Integer getMgr() {return mgr;}public void setMgr(Integer mgr) {this.mgr = mgr;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public Double getSal() {return sal;}public void setSal(Double sal) {this.sal = sal;}public Double getComm() {return comm;}public void setComm(Double comm) {this.comm = comm;}public Integer getDeptno() {return deptno;}public void setDeptno(Integer deptno) {this.deptno = deptno;}@Overridepublic String toString() {return "Employee{" +"empno=" + empno +", ename='" + ename + '\'' +", job='" + job + '\'' +", mgr=" + mgr +", hiredate=" + hiredate +", sal=" + sal +", comm=" + comm +", deptno=" + deptno +'}';}
}
src_web_FindAllServlet01
package com.web;import com.dao.EmployeeDao;
import com.util.DaoFactory;
import com.vo.Employee;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;@WebServlet("/findAll")
public class FindAllServlet01 extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//处理以下中文乱码情况request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//调用DAOEmployeeDao employeeDao = DaoFactory.getEmployeeDaoInstance();//调用DAO里相关的查询方法,查出所有员工信息List<Employee> emps = employeeDao.findAll();//将要处理的数据绑定到域对象request上,request.setAttribute("aaa", emps);//使用转发功能,将数据转发到另外一个servlet组件中,进行处理// 第一步:获取转发器, 同时指定要转发的目的地
// RequestDispatcher rq = request.getRequestDispatcher("/findAll2");// 第二步:调用相关方法forward,进行转发,带上数据
// rq.forward(request, response);request.getRequestDispatcher("emplist.jsp").forward(request,response);}
}
src_web_FindAllServlet02
package com.web;import com.vo.Employee;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;@WebServlet("/findAll2")
public class FindAllServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//处理以下中文乱码情况request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");// 从域对象request身上获取集合List<Employee> emps = (List<Employee>)request.getAttribute("aaa");PrintWriter pw = response.getWriter();pw.println("</html>");pw.println("<body>");pw.println("<table border='1' cellpadding='0' cellspacing='0' width='80%' align='center'>");pw.println("<tr>" +"<td>员工编号</td>" +"<td>员工姓名</td>" +"<td>职位</td>" +"<td>领导编号</td>" +"<td>入职日期</td>" +"<td>工资</td>" +"<td>奖金</td>" +"<td>部门编号</td>" +"<td>操作</td>" +"</tr>");for(Employee emp : emps){pw.println("<tr>" +"<td>"+emp.getEmpno()+"</td>" +"<td>"+emp.getEname()+"</td>" +"<td>"+emp.getJob()+"</td>" +"<td>"+emp.getMgr()+"</td>" +"<td>"+emp.getHiredate()+"</td>" +"<td>"+emp.getSal()+"</td>" +"<td>"+emp.getComm()+"</td>" +"<td>"+emp.getDeptno()+"</td>" +"<td><a href='delEmp.emp?empno="+emp.getEmpno()+"'>删除</a><a href='toUpdateEmp.emp?empno="+ emp.getEmpno()+"'>修改</a></td>" +"</tr>");}pw.println("</table>");pw.println("<a href='index.jsp'>返回主页面</a>");pw.println("</body>");pw.println("</html>");}
}
src_druid.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&useTimezone=true
username=root
password=111111
maxActive=20
minIdle=3
initialSize=5
maxWait=60000
web_01_grammar.jsp
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>JSP的语法演示</title>
</head>
<body><%--纯注释: ctrl+/- JSP里面,可以写大量的HTML、css、js代码,少量的java代码- java代码分三类:-- java表达式-- java脚本-- java声明--%><hr/><h1>java表达式: 就是带有返回值的java代码,可以是方法,可以是计算式</h1>两个数的和: <%=1+1%> <br>π的值: <%=Math.PI%> <br>时间: <%=new Date()%> <br>随机数: <%=Math.random()%> <br>调用getInfo方法:<%= getInfo() %> <br><h1>java小脚本:就是java代码片段,千万不要书写等号</h1><%int a = 10;int b = 20;int c = a * b;double d = (int)(Math.random()*6)+5;System.out.println(d*c);out.println("aaa");%>c和d的乘积:<%= c*d%><h1>java声明: 可以定义变量,定义方法, 翻译成java文件时,翻译到了类体中,不会翻译到方法体中</h1><%!private String name;private int age;public String getInfo(){return this.name+"---"+this.age;}%><h1> JSP指令: 一般写在JSP文件最上面,常用指令有page,include,taglib</h1><%@include file="02_testinclude.jsp"%></body>
</html>
web_02_testinclude.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<p>我是一个段落</p >
web_03_scope.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>JSPd的四大作用域对象</title>
</head>
<body><%--page作用域:对应的变量名为pageContext, service方法的局部变量 pageContext类型request作用域:对应的变量名为request, service方法的形参request HttpServletRequest类型session作用域:对应的变量名为session, service方法内部的局部变量 HttpSession类型application作用域:对应的变量名为application, service方法内部的局部参数 ServletContext类型--%><%pageContext.setAttribute("name1","zhangsan");request.setAttribute("name2","lisi");session.setAttribute("name3","wangwu");application.setAttribute("name4","zhaoliu");%><%-- 从作用域里获得数据 --%>name1:<%= pageContext.getAttribute("name1")%>name2:<%= request.getAttribute("name2")%>name3:<%= session.getAttribute("name3")%>name4:<%= application.getAttribute("name4")%></body>
</html>
web_04_getScopeValue.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>从四大作用域获取信息</title>
</head>
<body><%-- 从作用域里获得数据 --%>name1:<%= pageContext.getAttribute("name1")%>name2:<%= request.getAttribute("name2")%>name3:<%= session.getAttribute("name3")%>name4:<%= application.getAttribute("name4")%><jsp:forward page="04_getScopeValue.jsp"></jsp:forward></body>
</html>
web_emplist.jsp
<%@ page import="com.vo.Employee" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>emplist</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><link rel="stylesheet" type="text/css" href="css/style.css" /><style></style>
</head>
<body>
<div id="wrap"><div id="top_content"><div id="header"><div id="rightheader"><p>2009/11/20<br /></p></div><div id="topheader"><h1 id="title"><a href="#">main</a></h1></div><div id="navigation"></div></div><div id="content"><p id="whereami"></p><h1>Welcome!</h1><table class="table"><tr class="table_header"><td>员工编号</td><td>员工姓名</td><td>职位</td><td>领导编号</td><td>操作</td></tr><%List<Employee> list = (List<Employee>)request.getAttribute("aaa");for (Employee emp : list) { %><tr class="row1"><td><%=emp.getEmpno() %></td><td><%=emp.getEname() %></td><td><%=emp.getJob() %></td><td><%=emp.getMgr() %></td><td><a href="emplist.html">delete emp</a> <a href="updateEmp.html">update emp</a></td></tr><%}%></table><p><input type="button" class="button" value="Add Employee" onclick="location='addEmp.html'"/></p></div></div><div id="footer"><div id="footer_bg">ABC@126.com</div></div>
</div>
</body>
</html>
web_index.jsp
<%--Created by IntelliJ IDEA.User: 何zhuoqiangDate: 2024/9/13Time: 9:16To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body>$END$</body>
</html>