package cn.edu.hrbeu.smsys.emps.entity;
import java.sql.Date;
//员工类
//特征一:公有的类
public class Employee {
//特征二:私有的属性
private String empFirst;
private Integer empSecond;
private String empDept;
private String empSex;
private Date entryDate;
public Date getEntryDate() {
return entryDate;
}
public void setEntryDate(Date entryDate) {
this.entryDate = entryDate;
}
//特征三,定义一个空参的公有的构造方法
public Employee() {}
//特征四,为每一个属性提供一组getter和setter方法
public String getEmpFirst() {
return empFirst;
}
public void setEmpFirst(String empFirst) {
this.empFirst = empFirst;
}
public Integer getEmpSecond() {
return empSecond;
}
public void setEmpSecond(Integer empSecond) {
this.empSecond = empSecond;
}
public String getEmpDept() {
return empDept;
}
public void setEmpDept(String empDept) {
this.empDept = empDept;
}
public String getEmpSex() {
return empSex;
}
public void setEmpSex(String empSex) {
this.empSex = empSex;
}
}
特征一:公有的类
特征二:私有的属性
特征三,定义一个空参的公有的构造方法
特征四,为每一个属性提供一组getter和setter方法
对特定四的解释:因为属性是私有的,所以只能通过这种函数形式对其调用;
2.dao层
dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查。
它需要提供接口供server层使用
其中一个java类写具体的方法,另一个接口文件声明java类中的文件。
其中可以先声明函数,然后软件会自动创建出对应的函数
package cn.edu.hrbeu.smsys.emps.dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import java.util.List;
import com.mysql.jdbc.Connection;
import com.sun.corba.se.spi.orbutil.fsm.Guard.Result;
import com.sun.crypto.provider.RSACipher;
import cn.edu.hebeu.smsys.jdbc.DButils;
import cn.edu.hrbeu.smsys.emps.entity.Employee;
//实现接口使用implements
//实现接口就需要实现其中的抽象方法
public class EmpDaoImpl implements IEmpDao {
@Override
public int insertEmp(Employee emp) {
// TODO Auto-generated method stub
try {
Connection conn=(Connection) DButils.getConnection();
String sql="insert into text values(?,?,?,?,?)";
PreparedStatement pst=conn.prepareStatement(sql);
pst.setString(1, emp.getEmpFirst());
pst.setInt(2,emp.getEmpSecond());
pst.setString(3, emp.getEmpSex());
pst.setString(4, emp.getEmpDept());
pst.setDate(5, emp.getEntryDate());
if(pst.executeUpdate()==1) {
return 1;
}
}catch (Exception e) {
return 0;
}
return 1;
}
@Override
public List selectEmpList(String keyword) {
List emplist=new LinkedList<>();
String sql="select * from text";
// TODO Auto-generated method stub
if(keyword!=null&&!"".equals(keyword.trim())) {
sql+=" where first=?or second=?";//根据判断添加查询语句,也是一种string的特殊拼接方法
}
try {
Connection conn=(Connection) DButils.getConnection();
PreparedStatement pStatement=conn.prepareStatement(sql);
//根据判断决定是否需要绑定动态参数
if(keyword!=null&&!"".equals(keyword.trim())) {
pStatement.setString(1, keyword);
pStatement.setString(2, keyword);
}
ResultSet resultSet=pStatement.executeQuery();
while(resultSet.next()) {
Employee emp=new Employee();
emp.setEmpFirst(resultSet.getString("First"));
emp.setEmpSecond(resultSet.getInt("Second"));
emp.setEmpSex(resultSet.getString("Sex"));
emp.setEmpDept(resultSet.getString("Dept"));
emp.setEntryDate(resultSet.getDate("Date"));
emplist.add(emp);
}
}catch (Exception e) {
e.printStackTrace();
}
return emplist;
}
@Override
public int deleteEmployeeByNo(String eno) {
// TODO Auto-generated method stub
String sql="delete from text where First=?";
try {
Connection conn=(Connection) DButils.getConnection();
PreparedStatement pst=conn.prepareStatement(sql);
pst.setString(1, eno);
return pst.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}
以上三个函数主要实现了对表的查询,删除,插入功能
下面写下三个函数的实现思路
以设计技术较多的查询功能的实现为例
第一步,设计函数
首先要对表的属性进行查询,能想到的方法就是使用列表list,string数组应该也可以实现
第二步,判断
keyword是输入的数据,设计上是可以通过id或名字进行查询,是字符串形式,如果字符串为空就查询所有
public List selectEmpList(String keyword) {
List emplist=new LinkedList<>();
String sql="select * from text";
// TODO Auto-generated method stub
if(keyword!=null&&!"".equals(keyword.trim())) {
sql+=" where first=?or second=?";//根据判断添加查询语句,也是一种string的特殊拼接方法
}
第三步 数据库连接
getConnection函数是封装在jdbc包中的,用于数据库连接
在经过判断后,若不为空,则使用前面学习到的动态statement,并对判断条件进行赋值
第四步,执行sql语句
由于若查询条件为空,即select*时会产生多条数据,所以要用循环输出
判断条件是resultSet函数,之前提过它是list中常用的下一步的函数,可以进行使用
第五步,返回参数
在循环中查询出需要的语句后,定义一个新的成员变量,然后对其赋值,最后把它们都放到列表中
第六步,返回链表值,供服务端使用
try {
Connection conn=(Connection) DButils.getConnection();
PreparedStatement pStatement=conn.prepareStatement(sql);
//根据判断决定是否需要绑定动态参数
if(keyword!=null&&!"".equals(keyword.trim())) {
pStatement.setString(1, keyword);
pStatement.setString(2, keyword);
}
ResultSet resultSet=pStatement.executeQuery();
while(resultSet.next()) {
Employee emp=new Employee();
emp.setEmpFirst(resultSet.getString("First"));
emp.setEmpSecond(resultSet.getInt("Second"));
emp.setEmpSex(resultSet.getString("Sex"));
emp.setEmpDept(resultSet.getString("Dept"));
emp.setEntryDate(resultSet.getDate("Date"));
emplist.add(emp);
}
}catch (Exception e) {
e.printStackTrace();
}
return emplist;
}
再以删除功能为例
这个功能就简单多了,首先确认好这个函数的作用,它是用来删除的,不需要输出信息,所以我们只要返回0或1就可以了,所以用int类型,需要从外部读取eno编号(我为了省事统一用了string,实际上用int的话,从网页端输入栏的时候要integer转化为int类型)
然后定义sql语句,连接数据库,动态变量敲定最终的sql语句,实施语句,返回实施是否成功的结果
public int deleteEmployeeByNo(String eno) {
// TODO Auto-generated method stub
String sql="delete from text where First=?";
try {
Connection conn=(Connection) DButils.getConnection();
PreparedStatement pst=conn.prepareStatement(sql);
pst.setString(1, eno);
return pst.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
return 0;
}
}
所以总结一下可以发现,dao层的作用:从外部(服务端)接受数据,进行相应功能的处理,在返回数据到服务端,工具人层石锤。
它需要注意的几个点:
1.通过函数功能确定好函数的定义,你要的是返回数据还是只是为了功能(插入删除等
2.对sql语句的动态处理,确定最终要实现的sql语句
3.连接数据库,实施该sql语句
4.通过定义新的成员变量存储数据,并返回到服务端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String m=request.getParameter("m");
if("select".equals(m))
select(request, response);
if("delete".equals(m))
delete(request, response);
if("update".equals(m))
update(request, response);
}
其中m是网页中的属性,对应写法如下:
----查询员工----
@WebServlet("/emp.action")这行代码用于servlet中的选择响应时间
然后可以发现 name=m,value用于赋值,由此进入不同的函数
查询函数代码:
IEmpDao empDao=new EmpDaoImpl();//连接接口
protected void select(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
String keyword=request.getParameter("keyword");//接受上面的keyword
List empList=empDao.selectEmpList(keyword);//调用dao层的接口,并取出list数据
request.setAttribute("list", empList);
request.getRequestDispatcher("emp-admin.jsp").forward(request, response);
}
setAribute函数,前者为名称,后者为赋值,即创建一个名称为list的新变量并把后者赋值进去
下面函数的格式:
Request.getRequestDispatcher(url).forward(request,response)
所实现的功能:url为你正在用的jsp网页,会将服务器中要传输的请求数据,在request.setAttribute(“name”, 参数)放在request中,并在请求转发时候的forword(request,response)时候,把setAttribute方法中设置的参数传递到请求页面,属于动态的(服务器内部跳转)。
用于接受它的代码:
${emp.empFirst}
${emp.empSecond}
${emp.empDept}
${emp.empSex}
${emp.entryDate}
删除
可以看到它的格式,其中td里的内容emp.后的变量必须是entity里面的属性名
那么删除功能怎么实现的呢?连接方法就是超链接中的格式:
删除
这是一个连写的写法,先声明调用的是emp.action 然后m赋值成delete,由此可以在server层中调用delete方法,最后给eno赋值
内部server层的写法:
protected void delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
String eno=request.getParameter("eno");
if(empDao.deleteEmployeeByNo(eno)==1) {
response.getWriter().write("删除成功回到管理页");
}
else
response.getWriter().write("删除失败回到管理页");
}
可以看出它的格式,,提取到前台传来的数据后,连接dao接口再进行判断,最后输出
值得一提的是在输出时使用了: response.setContentType(“text/html;charset=utf-8”);
这是因为输出时可能会产生中文乱码问题
总结
写项目的时候注意层次划分,server层提供服务并接受传输前端信息,是中枢层,dao层提供接口连接底层结构,是功能实现的主体,entity层是要操作对象的属性,数据在几个层之间传递不能搞混,今天学的内容很多,回头好好学了学才搞明白,所以温故而知新