package com.zjy.util; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class BaseDao2.BookDao 根据方法的不同,sql语句和参数也不同{ public List executeQuery( String sql,PageBean pagebean,CallBack callBack) throws Exception{ Connection con = null; PreparedStatement ps = null; ResultSet rs = null; if(pagebean!=null&&pagebean.isPagination()) { String countsql = getCountsql(sql); con = DBAccess.getConnection(); ps = con.prepareStatement(countsql); rs = ps.executeQuery(); if(rs.next()) { pagebean.setTotal(rs.getString("n")); } String pageSql= getpageSql(sql,pagebean); con = DBAccess.getConnection(); ps = con.prepareStatement(pageSql); rs = ps.executeQuery(); }else { con = DBAccess.getConnection(); ps = con.prepareStatement(sql); rs = ps.executeQuery(); } //查询不同的表必然要处理不同的结果集 return callBack.foreach(rs); } private String getpageSql(String sql, PageBean pagebean) { return sql +" limit "+pagebean.getStartIndex()+" , "+pagebean.getRows(); } private String getCountsql(String sql) { // TODO Auto-generated method stub return " select count(1) as n from ("+sql+") t"; } public int executeUpdate(String sql,T t,String[] strings) throws Exception { Connection con = DBAccess.getConnection(); PreparedStatement ps = con.prepareStatement(sql); //将t的某一个对应值加到ps对象中 for (int i = 0; i < strings.length; i++) { Field f = t.getClass().getDeclaredField(strings[i] ); f.setAccessible(true); f.get(t); ps.setObject(i+1, f.get(t));//下标从0开始 } return ps.executeUpdate(); } }
package com.zjy.dao; import java.util.ArrayList; import java.util.List; import com.zjy.entity.Book; import com.zjy.util.BaseDao; import com.zjy.util.PageBean; import com.zjy.util.StringUtils; public class BookDao extends BaseDao3、在BookAction中写好对应的方法 遵循先继承后实现的规则,分别调用父类和接口的方法{ public List list(Book book,PageBean pagebean) throws Exception{ String sql = "select * from t_mvc_book where 1 = 1"; String bname = book.getBname(); if(StringUtils.isNotBlank(bname)) { sql +=" and bname like'%"+bname+"%'"; } int bid = book.getBid(); if(bid !=0) { sql +=" and bid = "+bid; } //调用父类的查询方法 return super.executeQuery(sql, pagebean, rs->{ List list = new ArrayList<>(); try { while(rs.next()) { list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price"))); } } catch (Exception e) { e.printStackTrace(); } return list; }); } public int add(Book book) throws Exception { String sql = "insert into t_mvc_book values(?,?,?)"; return super.executeUpdate(sql, book, new String[] {"bid","bname","price"}); } public int delete(Book book) throws Exception { String sql = "delete from t_mvc_book where bid = ?"; return super.executeUpdate(sql, book, new String[] {"bid"}); } public int edit(Book book) throws Exception { String sql = "update t_mvc_book set bname=?,price=? where bid=?"; return super.executeUpdate(sql, book, new String[] {"bname","price","bid"}); } }
public class BookAction extends ActionSupport implements ModelDriven4、在Junit中测试{ private Book book = new Book(); private BookDao bd = new BookDao(); @Override public Book getModel() { // TODO Auto-generated method stub return null; } //增加 public String add(HttpServletRequest req, HttpServletResponse resp) { try { bd.add(book); } catch (Exception e) { e.printStackTrace(); } return "toList"; } //删除 public String delete(HttpServletRequest req, HttpServletResponse resp) { try { bd.delete(book); } catch (Exception e) { e.printStackTrace(); } return "toList"; } //修改 //增加 public String edit(HttpServletRequest req, HttpServletResponse resp) { try { bd.edit(book); } catch (Exception e) { e.printStackTrace(); } return "toList"; } public String list(HttpServletRequest req,HttpServletResponse resp) { try { PageBean pageBean=new PageBean(); pageBean.setRequest(req); List list=bd.list(book, pageBean); req.setAttribute("books", list); req.setAttribute("pageBean", pageBean); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return "list"; } public String toEdit(HttpServletRequest req,HttpServletResponse resp) { try { if(book.getBid()!=0) { List list=bd.list(book, null); req.setAttribute("b", list.get(0)); } } catch (Exception e) { e.printStackTrace(); } return "toEdit"; }
package com.zjy.dao;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import org.junit.jupiter.api.Test;
import com.zjy.entity.Book;
class BookDaoTest {
private BookDao bookDao=new BookDao();
@Test
public void testList() {
try {
List list = bookDao.list(new Book(), null);
for (Book book : list) {
System.out.println(book);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//增加
@Test
public void testAdd() {
Book book = new Book(123, "小朱", 9999);
try {
bookDao.add(book);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//修改
@Test
public void testEdit() {
Book book = new Book(123, "小朱爸爸", 9999);
try {
bookDao.edit(book);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//删除
@Test
public void testDelete() {
Book book = new Book(123, "小朱爸爸", 9999);
try {
bookDao.delete(book);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三、前端Jsp界面
1、主界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://jsp.zhujiayin.zjy" prefix="z"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>书籍列表
| 书籍ID | 书籍名 | 价格 | 操作 |
|---|---|---|---|
| ${b.bid } | ${b.bname } | ${b.price } | 修改 删除 |
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://jsp.zhujiayin.zjy" prefix="z"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>四、总结 1、使用自定义MVC的步骤:书籍新增/修改
1.1、导入自己导出的自定义MVC.jar包
1.2、做好框架的相应配置(导入之前MVC.jar包依赖的jar包)
1.3 、一切照旧 (jsp界面,bookaction、dao层、entity)
2、通用增删改查的区别与相同:
2.1共同点:增删改查最终都要跳回查询界面
2.2不同点:2.2.1:查询:bookList.jsp 返回值:list
2.2.2:增删改确定:book.action?methodName=list 返回值:toList
2.2.3增加修改跳转对应的界面:bookEdit.jsp 返回值是toEdit



