JdbcTemplate实操查询数据库表中所有记录信息(十六课)

简介: JdbcTemplate实操查询数据库表中所有记录信息(十六课)

JdbcTemplate的功能类似于SSM三层架构的查询数据库的信息页面(十六课)

实现的功能:查询整张表的数据信息并且完成一级联动的下拉表:

代码模块的展示

第一步 定义一个页面用于在Html中展示数据的所有信息 这个页面发出Ajax请求到服务器中去 利用Json解析数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>员工管理系统-员工信息列表</title>
    <style>
        * {
            font-size: 28px;
            font-family: 方正粗黑宋简体;
        }
        h1 {
            background-color: lightseagreen;
            color: white;
        }
        button {
            width: 90%;
        }
        #sea, .delete, .update {
            color: white;
            font-weight: bold;
            padding: 5px 10px;
            border-width: 0px;
            border-radius: 6px;
        }
        #sea {
            background-color: #aae5f2;
            width: 100px;
        }
        .update {
            background-color: lightseagreen;
            color: black;
        }
        .delete {
            background-color: white;
            color: black;
        }
        #sea:hover, .update:hover {
            background-color: green;
            opacity: 0.9;
            color: white;
            height: 40px;
        }
        .delete:hover {
            background-color: red;
            color: white;
            height: 40px;
        }
        table {
            width: 100%;
            background-color: lightseagreen;
            color: white;
            border-radius: 20px;
            text-align: center;
            padding: 4px;
        }
        td:hover {
            background-color: white;
            color: black;
            border-radius: 20px;
            height: 40px;
        }
        td {
            height: 20%;
        }
        input {
            border-radius: 8px;
            border: 2px solid black;
        }
        datalist:hover {
            background-color: black;
            color: red;
        }
    </style>
    <script src="js/jquery-3.6.js"></script>
    <script>
        $(function () {
            //当页面加载完成后,自动发出ajax请求
            $.ajax({
                url: "ListServlet",
                type: "POST",
                data: "",
                success: function (json) {
                },
                error: function () {
                    alert("连接失败");
                },
                dataType: "json"
            });
        });
        //定义方法,用于判断文本框中内容改变事件
        function change(obj) {
            //获得用户选择的部门名称
            var info= obj.value;
            //将部门名称通过ajax请求发送给服务器,要求服务器根据部门名称查询该部门下的员工的入职时间
            $.ajax({
                url:"ListServlet",
                type:"GET",
                data:"workClass="+info,
                success:function (json) {
                    //将原有的数据进行清空
                    $("#d3").empty();
                    //["","",""]
                    for (var i = 0; i <json.length ; i++) {
                        $("#d3").append("<option>"+json[i]+"</option>");
                    }
                },
                error:function () {
                    alert("链接失败");
                },
                dataType:"json"
            });
        }
    </script>
</head>
<body>
<div align="center">
    <h1>员工信息列表</h1>
    <p>
    <input type="search" list="d2" onchange="change(this)" name="workClass" placeholder="请选择部门">&nbsp;&nbsp;
    <datalist id="d2"></datalist>
    <input type="search" list="d3" name="openDate" placeholder="请选择入职时间">&nbsp;&nbsp;
    <datalist id="d3"></datalist>
    <input id="sea" type="button" onclick="search()" value="搜索">
    </p>
    <table id="tab">
        <tr>
            <th>员工编号</th>
            <th>员工姓名</th>
            <th>员工性别</th>
            <th>员工年龄</th>
            <th>入职时间</th>
            <th>所属部门</th>
            <th>修改</th>
            <th>删除</th>
        </tr>
    </table>
    <input type="search" list="d4" name="name" placeholder="请查看姓名">&nbsp;&nbsp;
    <datalist id="d4"></datalist>
    <input type="search" list="d5" name="age" placeholder="请查看年龄">&nbsp;&nbsp;
    <datalist id="d5"></datalist>
    <input type="search" list="d6" name="name" placeholder="请查看性别">&nbsp;&nbsp;
    <datalist id="d6"></datalist>
</div>
</body>
</html>

访问这个地址进入SSM中的控制层ListServlet

第二步:SSM三层的架构搭建

控制层   @WebServlet(urlPatterns = "/ListServlet")

package Com.Emp.Controller;
import Com.Emp.Service.EmpServiceImp;
import Com.Emp.Service.IEmpService;
import com.fasterxml.jackson.databind.ObjectMapper;
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;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet(urlPatterns = "/ListServlet")
public class ListServlet extends HttpServlet {
    IEmpService service = new EmpServiceImp();
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        //1.从数据库中查询所有部门名称
        List<String> workClass = service.getWorkClass();
        List<String> name = service.getName();
        List<String> age = service.getAge();
        List<String> sex = service.getSex();
        //2.从数据库中查询所有入职时间
        List<String> dates = service.getDates();
        //3.从数据库中查询所有员工信息  SELECT * FROM  emp
        List<Map<String, Object>> list = service.getList();
        //采用jso格式封装 将三部分的数据采用json格式进行封装 [][][]  map中调用list集合
        Map<String, Object> map = new HashMap<>();
        map.put("workClass", workClass);
        map.put("name", name);
        map.put("age", age);
        map.put("sex", sex);
        map.put("dates", dates);
        map.put("list", list);
    }

业务逻辑层

package Com.Emp.Service;
import java.util.List;
import java.util.Map;
public interface IEmpService {
//查询的是一个字段 然后是多个部门信息所以在java中用的类型是
    //list<String>的类型的方式
    List<String> getWorkClass();
    List<String> getName();
    List<String> getSex();
    List<String> getAge();
    int add(Map<String, String[]> map);
    List<String> getDates();
    List<Map<String, Object>> getList();
    //根据部门名称查询该部门下的入职时间
    List<String> getDateByWorkClass(String workClass);
    List<Map<String, Object>> getlist(String woClass,String openDate);
}
package Com.Emp.Service;
import Com.Emp.Dao.EmpDaoImp;
import Com.Emp.Dao.IEmpDao;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class EmpServiceImp implements IEmpService {
    IEmpDao dao = new EmpDaoImp();
    @Override
    public List<String> getWorkClass() {
        return dao.getWorkClass();
    }
    @Override
    public List<String> getName() {
        return dao.getName();
    }
    @Override
    public List<String> getSex() {
        return dao.getSex();
    }
    @Override
    public List<String> getAge() {
        return dao.getAge();
    }
    @Override
    public List<String> getDates() {
        return dao.getDates();
    }
    @Override
    public List<Map<String, Object>> getList() {
        return dao.getList();
    }
    @Override
    public List<String> getDateByWorkClass(String workClass) {
        //判断部门信息是否是空的,如果不为空,则将部门信息作为查询条件
        //select openDate from emp where workClass=? order by openDate
        //如果为空,查询整张表的入职时间
        //select openDate from emp  order by openDate
        //以上两种情况可以通过模糊查询解决
        workClass=(workClass!=null)?"%"+workClass+"%":"%%";
        return dao.getDateByWorkClass(workClass);
    }
    @Override
    public List<Map<String, Object>> getlist(String woClass, String openDate) {
        //用户选择部门 no 时间
//        woClass=(woClass!=null,openDate=null);
        //用户选择时间  no 部门
        //        woClass=(woClass=null,openDate!=null);
        //用户 选择 部门  选择时间
        //        woClass=(woClass!=null,openDate=null);
        //啥也不想干
//        workClass = (workClass != null) ? "%" + workClass + "%" : "%%";
        woClass = (woClass != null) ? "%" + woClass + "%" : "%%";
        openDate = (openDate != null) ? "%" + openDate + "%" : "%%";
        return dao.getlist(woClass, openDate);
    }
}

数据访问层

package Com.Emp.Dao;
import java.util.List;
import java.util.Map;
public interface IEmpDao {
    List<String> getWorkClass();
    /*select distinct name from emp
    select distinct sex from emp
    select distinct age from emp*/
    List<String> getName();
    List<String> getSex();
    List<String> getAge();
    int add(Map<String, Object> map);
    //获取入职时间
    List<String> getDates();
    List<Map<String, Object>> getList();
    //根据部门名称查询该部门下的入职时间
    List<String> getDateByWorkClass(String workClass);
    //重载
    List<Map<String, Object>> getlist(String woClass,String openDate);
}
package Com.Emp.Dao;
import Com.Emp.Utils.DBUtil;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
public class EmpDaoImp implements IEmpDao {
    /*一级联动*/
    @Override
    public List<String> getWorkClass() {
        /*在*/
        return DBUtil.jt.query("select distinct workClass from emp",
                new MyRowMapper("workClass"));
    }
    @Override
    public List<String> getName() {
        return DBUtil.jt.query("select distinct name from emp",
                new MyRowMapper("name"));
    }
    @Override
    public List<String> getSex() {
        return DBUtil.jt.query("select distinct sex from emp",
                new MyRowMapper("sex"));
    }
    @Override
    public List<String> getAge() {
        return DBUtil.jt.query("select distinct age from emp",
                new MyRowMapper("age"));
    }
    /**
     * 增加
     * @param map
     * @return
     */
    @Override
    public int add(Map<String, Object> map) {
        return DBUtil.jt.update("insert into emp values(?,?,?,?,?,?)",
                new Object[]{0, map.get("name"),
                        map.get("sex"), map.get("age"),
                        map.get("openDate"), map.get("workClass")});
    }
    @Override
    public List<String> getDates() {
        //SELECT DISTINCT openDate FROM emp ORDER BY openDate
        return DBUtil.jt.query("SELECT DISTINCT openDate FROM emp ORDER BY openDate", new MyRowMapper("openDate"));
    }
    @Override
    public List<Map<String, Object>> getList() {
        return DBUtil.jt.queryForList("SELECT * FROM  emp");
    }
    @Override
    public List<String> getDateByWorkClass(String workClass) {
        return DBUtil.jt.query("select distinct openDate from emp where workClass like ? order by openDate",
                new Object[]{workClass},
                new MyRowMapper("openDate"));
    }
    @Override
    public List<Map<String, Object>> getlist(String woClass, String openDate) {
        return DBUtil.jt.queryForList("select * from emp where workClass like ?and operDate like ?", new Object[]{woClass, openDate});
    }
    /*自己定义*/
    class MyRowMapper implements RowMapper<String> {
        String str = "";
        public MyRowMapper(String str) {
            this.str = str;
        }
        @Override
        public String mapRow(ResultSet resultSet, int i) throws SQLException {
            return resultSet.getString(str);
        }
    }
}

返回控制层

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        //1.从数据库中查询所有部门名称
        List<String> workClass = service.getWorkClass();
        List<String> name = service.getName();
        List<String> age = service.getAge();
        List<String> sex = service.getSex();
        //2.从数据库中查询所有入职时间
        List<String> dates = service.getDates();
        //3.从数据库中查询所有员工信息  SELECT * FROM  emp
        List<Map<String, Object>> list = service.getList();
        //采用jso格式封装 将三部分的数据采用json格式进行封装 [][][]  map中调用list集合
        Map<String, Object> map = new HashMap<>();
        map.put("workClass", workClass);
        map.put("name", name);
        map.put("age", age);
        map.put("sex", sex);
        map.put("dates", dates);
        map.put("list", list);
        //{workclass:[],dates:[],listMap:[]}
        //{} Map集合 自定义 实体类
        //数组 list集合 set集合
        //{workclass:["","",""] ,dates:["","",""],list[{"id":1,"name":"李四"}],{},{}}
        new ObjectMapper().writeValue(response.getWriter(), map);
    }

运行结果展示:

 

 

 

下篇博客的内容介绍

SsmAjaxJson分页效果的操作(第十七课)_星辰镜的博客-CSDN博客

相关文章
|
6天前
|
存储 关系型数据库 MySQL
如何优化数据库查询?
如何优化数据库查询?
18 1
|
11天前
|
SQL 数据库 Java
HQL vs SQL:谁将统治数据库查询的未来?揭秘Hibernate的神秘力量!
【8月更文挑战第31天】Hibernate查询语言(HQL)是一种面向对象的查询语言,它模仿了SQL的语法,但操作对象为持久化类及其属性,而非数据库表和列。HQL具有类型安全、易于维护等优点,支持面向对象的高级特性,内置大量函数,可灵活处理查询结果。下面通过示例对比HQL与SQL,展示HQL在实际应用中的优势。例如,HQL查询“从员工表中筛选年龄大于30岁的员工”只需简单地表示为 `FROM Employee e WHERE e.age &gt; 30`,而在SQL中则需明确指定表名和列名。此外,HQL在处理关联查询时也更为直观易懂。然而,对于某些复杂的数据库操作,SQL仍有其独特优势。
21 0
|
11天前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
19 0
|
11天前
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
35 0
|
11天前
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
23 0
|
11天前
|
SQL 关系型数据库 MySQL
|
11天前
|
存储 SQL 数据库
自连接:数据库查询中的镜像技术
【8月更文挑战第31天】
8 0
|
11天前
|
存储 缓存 数据库连接
Entity Framework Core 跨数据库查询超厉害!多数据库连接最佳实践,让你的开发更高效!
【8月更文挑战第31天】在现代软件开发中,跨数据库查询是常见需求。Entity Framework Core(EF Core)作为强大的ORM框架,支持多种方法实现这一功能。本文介绍了在EF Core中进行跨数据库查询的最佳实践,包括:理解数据库上下文、使用多个上下文进行查询、处理数据库连接与事务,以及性能优化策略。通过创建独立的数据库上下文如`UserContext`和`OrderContext`,并在业务逻辑中同时使用它们,可以轻松实现跨库查询。此外,利用`TransactionScope`可确保事务一致性,从而提高系统的可靠性和效率。
20 0
|
11天前
|
SQL 关系型数据库 MySQL
SQL性能调优的神奇之处:如何用优化技巧让你的数据库查询飞起来,实现秒级响应?
【8月更文挑战第31天】在现代软件开发中,数据库性能至关重要。本文通过一个实战案例,展示了从慢查询到秒级响应的全过程。通过对查询的详细分析与优化,包括创建索引、改进查询语句及数据类型选择等措施,最终显著提升了性能。文章还提供了示例代码及最佳实践建议,帮助读者掌握SQL性能调优的核心技巧。
28 0
|
11天前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
21 0