pojo层 层 层 层 层 层 层 层 层 层 层 层 层 层 层//@AllArgsConstructor //增加基于全副属性构建的构造函数//@NoArgsConstructor //增加无参构造函数@ToString@Getter@Setter//@Data //增加此注解会在Goods类中主动增加set,get,toString等办法public class Goods {//Goods.class    private Long id;//id bigint primary key auto_increment    private String name;//name varchar(100) not null    private String remark;//remark text    private Date createdTime;//createdTime datetime}//lombok底层基于字节码技术为类增加相干办法或属性
dao层 层 层 层 层 层 层 层 层 层 层 层 层 层@Mapperpublic interface GoodsDao {//这个接口在运行时零碎底层会产生其实现类,但没有源码(只有字节码).     @Update("update tb_goods set name=#{name},remark=#{remark} where id=#{id} ")     int updateGoods(Goods goods);     @Insert("insert into tb_goods(name,remark,createdTime) values (#{name},#{remark},#{createdTime})")     int insertGoods(Goods goods);     @Select("select id,name,remark,createdTime from tb_goods where id=#{id}")     Goods findById(Integer id);     @Select("select id,name,remark,createdTime from tb_goods")     List<Goods> findGoods();     @Delete("delete from tb_goods where id=#{id}")     int deleteById(Integer id);}
service 层 层 层 层 层 层 层 层 层 层 层 层/** *  商品模块业务接口: *  负责: * 1)外围业务 * 2)拓展业务(记录日志,缓存,事务管制,权限管制,...) */public interface GoodsService {      Goods findById(Integer id);      int updateGoods(Goods goods);      int saveGoods(Goods goods);      /** *     查问所有商品信息 * @return */      List<Goods> findGoods();      int deleteById(Integer id);}
service imp实现层 实现层 实现层 实现层 实现层@Slf4j@Servicepublic class GoodsServiceImpl implements GoodsService {    @Autowired    private GoodsDao goodsDao;    //private static final Logger log=LoggerFactory.getLogger(GoodsServiceImpl.class);    @Override    public List<Goods> findGoods() {        long t1=System.currentTimeMillis();        List<Goods> list=goodsDao.findGoods();        long t2=System.currentTimeMillis();        log.info("findGoods().time:{}",(t2-t1));        return list;    }    @Override    public Goods findById(Integer id) {        return goodsDao.findById(id);    }    @Override    public int updateGoods(Goods goods) {        // TODO Auto-generated method stub        return goodsDao.updateGoods(goods);    }    @Override    public int saveGoods(Goods goods) {        // TODO Auto-generated method stub        goods.setCreatedTime(new java.util.Date());        return goodsDao.insertGoods(goods);    }    @Override    public int deleteById(Integer id) {        try{Thread.sleep(5000);}catch(Exception e) {}        return goodsDao.deleteById(id);    }}
Controller 层 层 层 层 层 层 层 层 层@Controller@RequestMapping("/goods/")public class GoodsController {     @Autowired     private GoodsService goodsService;     @RequestMapping("doGoodsAddUI")     public String doGoodsAddUI() {         return "goods-add";     }     @RequestMapping("doFindById/{id}")     public String doFindById(@PathVariable Integer id,Model model) {         Goods goods=goodsService.findById(id);         model.addAttribute("goods",goods);         return "goods-update";//此view由谁解析?ViewResolver(ThymeleafViewResolver)         //这里的ThymeleafViewResolver做了什么?         //1)在viewname的根底上增加前缀和后缀(/templates/pages/goods-update.html),并找到对应的view(真正的页面对象)         //2)将model中的数据取出,而后填充到view上(/templates/pages/goods-update.html)         //3)将view交给DispatcherServlet     }     @RequestMapping("doUpdateGoods")     public String doUpdateGoods(Goods goods) {         goodsService.updateGoods(goods);         return "redirect:/goods/doGoodsUI";     }     @RequestMapping("doSaveGoods")     public String doSaveGoods(Goods goods) {         goodsService.saveGoods(goods);         return "redirect:/goods/doGoodsUI";     }     @RequestMapping("doDeleteById/{id}")     public String doDeleteById(@PathVariable Integer id) {         goodsService.deleteById(id);         return "redirect:/goods/doGoodsUI";     }     @RequestMapping("doGoodsUI")     public String doFindGoods(Model model)throws Exception {         //Thread.sleep(7000);         List<Goods> list=goodsService.findGoods();         model.addAttribute("list", list);         return "goods";     }}
goods 层 层 层 层 层 层<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head><meta charset="UTF-8"><title>Insert title here</title></head><body> <h1>The Goods Page</h1> <a th:href="@{/goods/doGoodsAddUI}">增加商品</a> <table>    <thead>       <tr>          <th>id</th>          <th>name</th>          <th>remark</th>          <th>createdTime</th>          <th colspan="2">operation</th>       </tr>    </thead>    <tbody>        <tr th:each="g:${list}">            <td th:text="${g.id}">1</td>            <td th:text="${g.name}">AAA</td>            <td th:text="${g.remark}">AAAAA</td>            <td th:text="${#dates.format(g.createdTime,'yyyy/MM/dd HH:mm')}">2020/09/01</td>            <td><a th:href="@{/goods/doDeleteById/{id}(id=${g.id})}">delete</a></td>            <td><a th:href="@{/goods/doFindById/{id}(id=${g.id})}">update</a></td>        </tr>    </tbody> </table></body></html>
goods-add 增加代码<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><style type="text/css">   ul li {list-style-type: none}</style></head><body>  <h1>The Goods Add Page</h1>  <form th:action="@{/goods/doSaveGoods}" method="post">     <ul>        <li>name:        <li><input type="text" name="name">        <li>remark:        <li><textarea cols="30" rows="5" name="remark"></textarea>        <li><input type="submit" value="Save Goods">     </ul>  </form></body></html>
goods-update 批改代码<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><style type="text/css">   ul li {list-style-type: none}</style></head><body>  <h1>The Goods Update Page</h1>  <form th:action="@{/goods/doUpdateGoods}" method="post">     <input type="hidden" name="id" th:value="${goods.id}">     <ul>        <li>name:        <li><input type="text" name="name" th:value="${goods.name}">        <li>remark:        <li><textarea cols="30" rows="5" name="remark" th:text="${goods.remark}"></textarea>        <li><input type="submit" value="Update Goods">     </ul>  </form></body></html>
配置文件...# serverserver.port=80server.servlet.context-path=/spring.main.banner-mode=console# spring datasourcespring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=root#spring mybatismybatis.mapper-locations=classpath:/mapper/*/*.xml#spring thymeleafspring.thymeleaf.cache=falsespring.thymeleaf.prefix=classpath:/templates/pages/spring.thymeleaf.suffix=.html#spring actuatormanagement.endpoints.web.exposure.include=*#Spring loglogging.level.com.cy=debug