第一级目录:src包,web包,pro07-javaweb-begin.iml
pro07-javaweb-begin.iml
pro07-javaweb-begin.src.com.atguigu.fruit
pro07-javaweb-begin.src.com.atguigu.fruit.dao
pro07-javaweb-begin.src.com.atguigu.fruit.dao.base.BaseDAO.java
package com.atguigu.fruit.dao.base; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.sql.*; import java.util.ArrayList; import java.util.List; public abstract class BaseDAO{ public final String DRIVER = "com.mysql.jdbc.Driver" ; public final String URL = "jdbc:mysql://localhost:3306/fruitdb?useUnicode=true&characterEncoding=utf-8&useSSL=false"; public final String USER = "root"; public final String PWD = "123456" ; protected Connection conn ; protected PreparedStatement psmt ; protected ResultSet rs ; //T的Class对象 private Class entityClass ; public BaseDAO(){ //getClass() 获取Class对象,当前我们执行的是new FruitDAOImpl() , 创建的是FruitDAOImpl的实例 //那么子类构造方法内部首先会调用父类(BaseDAO)的无参构造方法 //因此此处的getClass()会被执行,但是getClass获取的是FruitDAOImpl的Class //所以getGenericSuperclass()获取到的是BaseDAO的Class Type genericType = getClass().getGenericSuperclass(); //ParameterizedType 参数化类型 Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments(); //获取到的 中的T的真实的类型 Type actualType = actualTypeArguments[0]; try { entityClass = Class.forName(actualType.getTypeName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } protected Connection getConn(){ try { //1.加载驱动 Class.forName(DRIVER); //2.通过驱动管理器获取连接对象 return DriverManager.getConnection(URL, USER, PWD); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } return null ; } protected void close(ResultSet rs , PreparedStatement psmt , Connection conn){ try { if (rs != null) { rs.close(); } if(psmt!=null){ psmt.close(); } if(conn!=null && !conn.isClosed()){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } //给预处理命令对象设置参数 private void setParams(PreparedStatement psmt , Object... params) throws SQLException { if(params!=null && params.length>0){ for (int i = 0; i < params.length; i++) { psmt.setObject(i+1,params[i]); } } } //执行更新,返回影响行数 protected int executeUpdate(String sql , Object... params){ boolean insertFlag = false ; insertFlag = sql.trim().toUpperCase().startsWith("INSERT"); try { conn = getConn(); if(insertFlag){ psmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); }else { psmt = conn.prepareStatement(sql); } setParams(psmt,params); int count = psmt.executeUpdate() ; rs = psmt.getGeneratedKeys(); if(rs.next()){ return ((Long)rs.getLong(1)).intValue(); } return count ; } catch (SQLException e) { e.printStackTrace(); }finally { close(rs,psmt,conn); } return 0; } //通过反射技术给obj对象的property属性赋propertyValue值 private void setValue(Object obj , String property , Object propertyValue){ Class clazz = obj.getClass(); try { //获取property这个字符串对应的属性名 , 比如 "fid" 去找 obj对象中的 fid 属性 Field field = clazz.getDeclaredField(property); if(field!=null){ field.setAccessible(true); field.set(obj,propertyValue); } } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } //执行复杂查询,返回例如统计结果 protected Object[] executeComplexQuery(String sql , Object... params){ try { conn = getConn() ; psmt = conn.prepareStatement(sql); setParams(psmt,params); rs = psmt.executeQuery(); //通过rs可以获取结果集的元数据 //元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等 ResultSetMetaData rsmd = rs.getMetaData(); //获取结果集的列数 int columnCount = rsmd.getColumnCount(); Object[] columnValueArr = new Object[columnCount]; //6.解析rs if(rs.next()){ for(int i = 0 ; i executeQuery(String sql , Object... params){ List list = new ArrayList<>(); try { conn = getConn() ; psmt = conn.prepareStatement(sql); setParams(psmt,params); rs = psmt.executeQuery(); //通过rs可以获取结果集的元数据 //元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等 ResultSetMetaData rsmd = rs.getMetaData(); //获取结果集的列数 int columnCount = rsmd.getColumnCount(); //6.解析rs while(rs.next()){ T entity = (T)entityClass.newInstance(); for(int i = 0 ; i pro07-javaweb-begin.src.com.atguigu.fruit.dao.impl
package com.atguigu.fruit.dao.impl; import com.atguigu.fruit.dao.FruitDAO; import com.atguigu.fruit.dao.base.BaseDAO; import com.atguigu.fruit.pojo.Fruit; import java.util.List; public class FruitDAOImpl extends BaseDAOimplements FruitDAO { @Override public List getFruitList() { return super.executeQuery("select * from t_fruit"); } @Override public boolean addFruit(Fruit fruit) { String sql = "insert into t_fruit values(null,?,?,?,?)"; int count = super.executeUpdate(sql,fruit.getFname(),fruit.getPrice(),fruit.getFcount(),fruit.getRemark()) ; //insert语句返回的是自增列的值,而不是影响行数 //System.out.println(count); return count>0; } @Override public boolean updateFruit(Fruit fruit) { String sql = "update t_fruit set fcount = ? where fid = ? " ; return super.executeUpdate(sql,fruit.getFcount(),fruit.getFid())>0; } @Override public Fruit getFruitByFname(String fname) { return super.load("select * from t_fruit where fname like ? ",fname); } @Override public boolean delFruit(String fname) { String sql = "delete from t_fruit where fname like ? " ; return super.executeUpdate(sql,fname)>0; } } pro07-javaweb-begin.src.com.atguigu.fruit.dao.FruitDAO.java
package com.atguigu.fruit.dao; import com.atguigu.fruit.pojo.Fruit; import java.util.List; public interface FruitDAO { //查询库存列表 ListgetFruitList(); //新增库存 boolean addFruit(Fruit fruit); //修改库存 boolean updateFruit(Fruit fruit); //根据名称查询特定库存 Fruit getFruitByFname(String fname); //删除特定库存记录 boolean delFruit(String fname); } pro07-javaweb-begin.src.com.atguigu.fruit.pojo.Fruit.java
package com.atguigu.fruit.pojo; public class Fruit { private Integer fid ; private String fname ; private Integer price ; private Integer fcount ; private String remark ; public Fruit(){} public Fruit(Integer fid, String fname, Integer price, Integer fcount, String remark) { this.fid = fid; this.fname = fname; this.price = price; this.fcount = fcount; this.remark = remark; } public Integer getFid() { return fid; } public void setFid(Integer fid) { this.fid = fid; } public String getFname() { return fname; } public void setFname(String fname) { this.fname = fname; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public Integer getFcount() { return fcount; } public void setFcount(Integer fcount) { this.fcount = fcount; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @Override public String toString() { return fid + "tt" + fname + "tt" + price +"tt" + fcount +"tt" + remark ; } }pro07-javaweb-begin.src.com.atguigu.servlets.AddServlet.java
package com.atguigu.servlets; import com.atguigu.fruit.dao.FruitDAO; import com.atguigu.fruit.dao.impl.FruitDAOImpl; import com.atguigu.fruit.pojo.Fruit; 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; @WebServlet(urlPatterns = "/Add") public class AddServlet extends HttpServlet { @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //post方式下,设置编码,防止中文乱码 //需要注意的是,设置编码这一句代码必须在所有的获取参数动作之前 request.setCharacterEncoding("UTF-8"); String fname = request.getParameter("fname"); String priceStr = request.getParameter("price"); Integer price = Integer.parseInt(priceStr); String fcountStr = request.getParameter("fcount"); Integer fcount = Integer.parseInt(fcountStr); String remark = request.getParameter("remark"); FruitDAO fruitDAO = new FruitDAOImpl(); boolean flag = fruitDAO.addFruit(new Fruit(0 , fname , price , fcount , remark)); System.out.println(flag ? "添加成功!" : "添加失败!"); } }pro07-javaweb-begin.web.add.html
Title
pro07-javaweb-begin.web.WEB-INF.web.xml