web+EL+mybatis 实现简单三层架构思想

Posted 追风林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web+EL+mybatis 实现简单三层架构思想相关的知识,希望对你有一定的参考价值。

1.查询所有数据

  1. 获取前端的请求参数 ,去数据库 查.查了返回查询结果.
  2. 将数据放在 request 的请求域中 ,然后将数据请求转发 到 页面中去.
  3. 页面 遍历数据,展示出来

1.1 dao 查询数据库

  /**
     * 查询所有品牌信息
     * @return
     */
    @Select("select * from tb_brand")
    List<Brand> selectAll();

1.2 service 处理查询结果

 /**
     * 查询所有品牌信息
     * @return
     */
    public List<Brand> selectAll()
        SqlSession sqlSession = factory.openSession();
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        List<Brand> list = brandMapper.selectAll();
        return list;
    

1.3controller 做出响应

 private BrandService brandService=new BrandService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        List<Brand> list = brandService.selectAll();
        request.setAttribute("brands",list);
        request.getRequestDispatcher("/brand.jsp").forward(request,response);

    

1.4 前端页面展示数据

 <c:forEach items="$brands" var="brand" varStatus="vs">
 <tr align="center">
     <td>$vs.count</td>
     <td>$brand.brandName</td>
     <td>$brand.companyName</td>
     <td>$brand.ordered</td>
     <td>$brand.description</td>
     <td>$brand.status==1?"启用":"禁用"</td>
     <td><a href="/day10-brand-demo/selectByIdServlet?id=$brand.id">修改</a> <a href="/day10-brand-demo/DeleteServlet?id=$brand.id">删除</a></td>
 </tr>
 </c:forEach>

2添加数据

  1. 前端页面 点击 增加 按钮时 ,页面跳转到添加页面。。进行一次跳转
  2. 添加页面 完成信息后 点击提交后,请求参数 发生送到后台 controller层 接收
  3. 调用service 层和dao层 完成添加方法
  4. 添加成功 需要 重定向到查询所有的页面

2.1 前端页面跳转到添加页面


<input type="button" value="新增" onclick="toAdd()"><br>



<script>
	 /*上面需要添加个 点击事件  */
   function toAdd() 
        /*跳转到添加页面*/
       location.href="/day10-brand-demo/addBrand.html"
   
</script>

2.2 添加页面 完成后 跳转到conrtroller层

/* 跳转到conrtroller层*/
<form action="/day10-brand-demo/addServlet" method="post">
    品牌名称:<input name="brandName"><br>
    企业名称:<input name="companyName"><br>
    排序:<input name="ordered"><br>
    描述信息:<textarea rows="5" cols="20" name="description"></textarea><br>
    状态:
        <input type="radio" name="status" value="0">禁用
        <input type="radio" name="status" value="1">启用<br>

    <input type="submit" value="提交">
</form>

2.3 conrtroller层业务 最后重定向到查询所有,可以展示新增的那条数据

 
    private BrandService brandService =new BrandService();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        //设置请求中文乱码问题
        request.setCharacterEncoding("utf-8");
        //2.获取请求参数  封装成brand对象
        Brand brand = new Brand();
        try 
            BeanUtils.populate(brand, request.getParameterMap());
         catch (Exception e) 
            e.printStackTrace();
        
        //3.调用services 的 add方法
        brandService.add(brand);
        //4.重定向到selectAll这个类.重新查询一下所有,刷新列表
        response.sendRedirect(request.getContextPath()+"/selectAllServlet");
    

2.4service 和dao 代码 略

3 修改数据


3.1 需要回显数据

  1. 点击修改 按钮后,会跳转到 修改页面 ,修改页面具有完整的数据信息.—>数据回显
  2. 根据id先去数据库查询. 查询后的结果封装的到request 域中共享.请求转发到前端 修改界面

3.2 修改数据

  1. 根据 id修改,在界面是看不到的.需要我们在前端界面,在如隐藏属性.
  2. 修改的值,要动态获取,采用EL表达式来操作.

1 点击跳转到修改页面

  <c:forEach items="$brands" var="brand" varStatus="vs">
    <tr align="center">
        <td>$vs.count</td>
        <td>$brand.brandName</td>
        <td>$brand.companyName</td>
        <td>$brand.ordered</td>
        <td>$brand.description</td>
        <td>$brand.status==1?"启用":"禁用"</td>
        <td><a href="/day10-brand-demo/selectByIdServlet?id=$brand.id">修改</a> <a href="/day10-brand-demo/DeleteServlet?id=$brand.id">删除</a></td>
    </tr>
    </c:forEach>

2 修改页面跳转到前端

<form action="/day10-brand-demo/updateServlet" method="post">
    <%--id 隐藏域   加上el 的动态获取数据--%>
    <input type="hidden" name="id" value="$brand.id">
    品牌名称:<input name="brandName" value="$brand.brandName"><br>
    企业名称:<input name="companyName" value="$brand.companyName"><br>
    排序:<input name="ordered" value="$brand.ordered" ><br>
    描述信息:<textarea rows="5" cols="20" name="description">
    $brand.description
    </textarea><br>
    状态:
    <input type="radio" name="status" value="0" $brand.status==0?"checked":"">禁用
    <input type="radio" name="status" value="1" $brand.status==1?"checked":"">启用<br>

    <input type="submit" value="提交">
</form>

3.根据id查询 请求转发到更新页面

 private BrandService brandService=new BrandService();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        int id = Integer.parseInt(request.getParameter("id"));
        Brand brand = brandService.selectById(id );
        request.setAttribute("brand",brand);
        request.getRequestDispatcher("/update.jsp").forward(request,response);
    

4 更新完成 重定向到 查询所有方法 展示所有数据

    private  BrandService brandService=new BrandService();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        request.setCharacterEncoding("utf-8");
        //2.获取请求参数  封装成brand对象
        Brand brand = new Brand();
        try 
            BeanUtils.populate(brand, request.getParameterMap());
         catch (Exception e) 
            e.printStackTrace();
        
        //3.调用services 的 add方法
        brandService.update(brand);
        //4.请求转发到selectAll这个类.重新查询一下所有,刷新列表
        request.getRequestDispatcher("/selectAllServlet").forward(request,response);
    

4 .删除 同增加

学习MyBatis必知必会~准备工作:了解框架三层架构ORM思想


一、框架:

1、框架,什么是框架,为什么要使用框架?

■ 框架:是一些列jar包,本质是对jdk功能的扩展。

框架是一组程序的集合,包含一系列的最佳实践,作用是为了解决某个领域的问题。


  • 回顾一下java程序的运行机制:java文件(源文件) ---[编译]--》 字节码文件(class文件) ---[运行]--》 jvm
  • jar包:多份java字节码文件(class文件-运行要用到的文件)---[压缩打包]--》jar(java归档文件,类似于rar)
■ 使用框架第一步:拷贝jar包.



二、三层架构:

(图片来源叩丁狼)



三、对象映射关系 ORM(Object Relational Mapping)

---为了解决面向对象与关系数据库存在的互相不匹配的问题。 [主要是:对象的属性名和表的列名不匹配的问题]


1、回顾之前jdbc封装的dao层的模板类jdbcTemplate:

//增删改操作模板: public static update(String sql, Object...params)
//查询操作模板:public static <T> T query(String sql, IResultSetHandler rsh, Object...params)

//---------------------------------------------------------------------------------------------
//还封装了BeanHandler、BeanListHandler
  BeanHandler 处理结果类[结果集只有一行数据,把一行结果集数据封装成一个对象]
  BeanListHandler 处理结果类[结果集有多行数据,把每一行结果集数据封装成一个对象,存储到List集合中]   
  • 使用BeanHandler和BeanListHandler要注意,对象的属性名和表中的列名需要相同,不同报错。

■ jdbc--->jdbc模板(通用结果集处理器[需要保证类的属性名和表名相同])----》ORM框架(MyBatis框架)



2、ORM思想:

面向对象概念----(映射配置)-----面向关系概念

​ 类 ----------------------------------------------表

对象----------------------------------------表的行(记录)

属性---------------------------------------表的列(字段)



3、Mapping:使用注解/xml:

❀ 属性名和列名是不同的,将两者对应起来需要使用还能某种规则【注解/xml

  • 使用xml:

(图片来源叩丁狼)



4、ORM 框架:

遵循ORM思想实现的技术,解决持久层问题[和数据库连接,进行CRUD]。

(图片来源叩丁狼)


✿ 一个设计良好的持久层,应该保证:当持久层的实现技术发生改变时,不会影响到上一层层的代码(service层)。



■ 常见 ORM 框架:

  • JPA:本身是一种 ORM 规范,不是 ORM 框架。由各大 ORM 框架提供实现。
  • Hibernate:以前最流行的 ORM 框架。设计灵巧,性能优秀,文档丰富。
  • MyBatis: 目前最受欢迎的持久层解决方案。

以上是关于web+EL+mybatis 实现简单三层架构思想的主要内容,如果未能解决你的问题,请参考以下文章

springboot+mybatis plus学习记录+三层架构理解

Spring——第一个Spring-Web项目(三层架构实现前后端数据交互)

EL JSTL和简单MVC 还有三层架构(这次我先鸽了)的学习

抽象工厂————三层架构

Mybatis

Mybatis