准备好jar包和工具类
1.记得导入jar包依赖
2.工具类(附带通用分页)
3.建模,处理多个结果码mvc.xml
通用增删改查
1.实体类
通用类增删改查方法(BaseDao)
package com.houzhihong.util;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.houzhihong.util.DBAccess;
import com.houzhihong.util.PageBean;
public class BaseBookDao<T> {
/**
* @param sql 可能不同的表 那么意味着sql是变化的 那么它是从子类处理好在传递到父类
* @param c 需要返回不同的对象集合
* @param pBean 可能要分页
* @return
* @throws Exception
*/
public List<T> sel(String sql,Class c,PageBean pBean) throws Exception{
List<T> l=new ArrayList<>();
Connection con=DBAccess.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
if(pBean !=null && pBean.isPagination()) {
//分页代码
/**
* 1.分页是与PageBean中的total 意味着需要查询数据库得到total赋值给PageBean
* 2.查询出符合条件的某一页的数据
*/
String countSql=getCountSql(sql);
ps=con.prepareStatement(countSql);
rs=ps.executeQuery();
if(rs.next()) {
pBean.setTotal(rs.getObject(1).toString());
}
String pagSql=getPagSql(sql,pBean);
ps=con.prepareStatement(pagSql);
rs=ps.executeQuery();
}else {
//不分页
ps=con.prepareStatement(sql);
rs=ps.executeQuery();
}
T t=null;
while (rs.next()) {
t=(T) c.newInstance();
Field [] fields = c.getDeclaredFields();
for (Field f : fields) { //给属性赋值
f.setAccessible(true);//打开权限
//对象的属性名
f.set(t, rs.getObject(f.getName()));
}
DBAccess.close(con, ps, rs);
l.add(t);
}
return l;
}
/*
* 分页查询语句
*/
private String getPagSql(String sql, PageBean pBean) {
return sql+" limit "+pBean.getStartIndex()+","+pBean.getRows();
}
/*
* 用来查询对应条件有多少条数据
*/
private String getCountSql(String sql) {
return "select count(1) from ("+sql+") t";
}
/**
*
* @param sql 增删改的sql语句
* @param attrs 代表了sql语句中的问号
* @param t 实体类(里面包含了参数值)
* @return
*/
public int executeUpdate(String sql,String[] attrs,T t) throws Exception{
Connection con=DBAccess.getConnection();
PreparedStatement ps=con.prepareStatement(sql);
Field fields = null;
for (int i = 1; i < attrs.length; i++) {
/**
* 通过属性名以反射的方法获取到对应的值
*/
fields = t.getClass().getDeclaredField(attrs[i]);
fields.setAccessible(true);//打开权限
ps.setObject(i, fields.get(t));
}
int num=ps.executeUpdate();
DBAccess.close(con, ps, null);
return ps.executeUpdate();
}
}
Dao层(BookDao继承通用BaseDao)
1.BookDao层
package com.houzhihong.dao;
import java.sql.SQLException;
import java.util.List;
import com.houzhihong.entity.Book;
import com.houzhihong.util.PageBean;
import com.houzhihong.util.StringUtils;
public class BookDao extends BaseBookDao<Book>{
/**
* 分页
*/
public List<Book> list(Book book,PageBean pBean) throws Exception{
String sql="select * from tb_book where true";
String bname=book.getBname();
int bid=book.getBid();
if(StringUtils.isNotBlank(bname)) {
sql+=" and bname like '%"+bname+"%'";
}
if(bid!=0) {
sql+=" and bid="+bid;
}
return super.sel(sql, Book.class, pBean);
}
/**
* 增加
* @throws Exception
*/
public int add(Book book) throws Exception {
String sql="insert into tb_book values(?,?,?)";
return super.executeUpdate(sql, new String[]{"bid","bname","price"}, book);
}
/**
* 修改
* @throws Exception
*/
public int edit(Book book) throws Exception {
String sql="update tb_book set bnama=?,price=? where bid=?";
return super.executeUpdate(sql, new String[]{"bname","price","bid"}, book);
}
/**
* 删除
* @throws Exception
*/
public int del(Book book) throws Exception {
String sql="delete from tb_book where bid=?";
return super.executeUpdate(sql, new String[] {"bid"}, book);
}
}
处理业务逻辑层
1.BookAction(web)层
package com.houzhihong.web;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.houzhihong.dao.BookDao;
import com.houzhihong.entity.Book;
import com.houzhihong.framework.ActionSupport;
import com.houzhihong.framework.ModelDriven;
import com.houzhihong.util.PageBean;
public class BookAction extends ActionSupport implements ModelDriven<Book>{
private Book book=new Book();
private BookDao bookDao=new BookDao();
/**
* 查询
* @param req
* @param resp
* @return
*/
public String list(HttpServletRequest req,HttpServletResponse resp) {
PageBean pageBean =new PageBean();
pageBean.setRequest(req);
try {
List<Book> list=this.bookDao.list(book, pageBean);
req.setAttribute("bookList", list);
req.setAttribute("pageBean", pageBean);
} catch (Exception e) {
e.printStackTrace();
}
return "list";
}
/**
* 跳转新增修改页面
* @param req
* @param resp
* @return
*/
public String preSav(HttpServletRequest req,HttpServletResponse resp) {
if(book.getBid()!=0) {
try {
//数据回显的数据
Book b=this.bookDao.list(book, null).get(0);
req.setAttribute("book", b);
} catch (Exception e) {
e.printStackTrace();
}
}
return "edit";
}
/**
* 增加
* @param req
* @param resp
* @return
* @throws Exception
*/
public String add(HttpServletRequest req,HttpServletResponse resp) throws Exception {
try {
this.bookDao.add(book);
} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
e.printStackTrace();
}
return "toList";
}
/**
* 修改
* @param req
* @param resp
* @return
* @throws Exception
*/
public String edit(HttpServletRequest req,HttpServletResponse resp) throws Exception {
try {
this.bookDao.edit(book);
} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
e.printStackTrace();
}
return "toList";
}
/**
* 删除
* @param req
* @param resp
* @return
* @throws Exception
*/
public String del(HttpServletRequest req,HttpServletResponse resp) throws Exception {
try {
this.bookDao.del(book);
} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
e.printStackTrace();
}
return "toList";
}
@Override
public Book getModel() {
return book;
}
}
2.mvc.xml文件 增删改一定要用重定向,查询时用转发
<?xml version="1.0" encoding="UTF-8"?>
<config>
<action path="/book" type="com.houzhihong.servlet.BookServlet">
<forward name="list" path="/bookList.jsp" redirect="false" />
<forward name="toAdd" path="/bookAdd.jsp" redirect="" />
<forward name="toEdit" path="/bookEdit.jsp" redirect="false" />
<forward name="toList" path="/book.action?methodName=list" redirect="" />
</action>
</config>
界面
1.jsp显示界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="h" uri="/houzhihong" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<title>Insert title here</title>
<style type="text/css">
.page-item input {
padding: 0;
width: 40px;
height: 100%;
text-align: center;
margin: 0 6px;
}
.page-item input,
.page-item b {
line-height: 38px;
float: left;
font-weight: 400;
}
.page-item.go-input {
margin: 0 10px;
}
</style>
</head>
<body>
<h2>小说目录</h2>
<br>
<form class="form-inline" action="${pageContext.request.contextPath}/book.action?methodName=list" method="post">
<div class="form-group mb-2">
书名:<input type="text" name="bname" placeholder="请输入书籍名称">
</div>
<button type="submit" class="btn btn-primary mb-2">查询</button>
<a href="bookAdd.jsp" class="btn btn-primary mb-2 ml-4">新增</a>
</form>
<table border="1" width="100%">
<tr>
<td>编号</td>
<td>名称</td>
<td>价格</td>
<td>操作</td>
</tr>
<c:forEach items="${bookList }" var="b">
<tr>
<td>${b.bid }</td>
<td>${b.bname }</td>
<td>${b.price }</td>
<td>
<a href="${pageContext.request.contextPath}/book.action?methodName=delete" class="btn btn-danger mb-2">删除</a>
<a href="${pageContext.request.contextPath}/book.action?methodName=toEdit" class="btn btn-success mb-2">修改</a>
</td>
</tr>
</c:forEach>
</table>
<h:page pageBean="${pageBean }"></h:page>
</body>
</html>
2.增加界面和修改差不多这里就直接增加界面了
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>书籍新增页面</title>
</head>
<body>
书籍新增
<form action="${pageContext.request.contextPath}/book.action?methodName=add" method="post">
<div class="form-group row">
<label for="bid" class="col-sm-2 col-form-label">书籍ID</label>
<div class="col-sm-10">
<input type="text" readonly class="form-control-plaintext" id="bid" name="bid" value="">
</div>
</div>
<div class="form-group row">
<label for="bname" class="col-sm-2 col-form-label">书籍名称</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="bname" name="bname">
</div>
</div>
<div class="form-group row">
<label for="price" class="col-sm-2 col-form-label">书籍价格</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="price" name="price">
</div>
</div>
<div class="form-group row">
<div class="col-sm-12">
<input type="submit" class="form-control"value="增加">
</div>
</div>
</form>
</body>
</html>
效果图
1.数据展示每页显示5条
2.新增页面