查询功能

通过单元测试添加数据

在该目录下,建立MapperTest.java文件。

代码:

//是junit的注解。指定spring junit来运行单元测试。
@RunWith(SpringJUnit4ClassRunner.class)
//指定要加载的spring配置文件的位置
@ContextConfiguration("classpath:spring.xml")
public class MapperTest {

    @Autowired
    private SqlSession sqlSession;

    @Test
    public void batchTest() {
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        for (int i = 0; i < 100; i++) {
            // 用UUID生成用户名
            String uuid = UUID.randomUUID().toString().substring(0, 5);
            Emp emp = new Emp();
            emp.setName(uuid);
            emp.setGender("F");
            emp.setEmail(uuid + "@qq.com");
            emp.setDeptId(2L);
            empMapper.insertSelective(emp);
        }
        System.out.println("done...");
    }
}

使用默认查询的问题

如果直接使用select * from t_emp 会出现如下结果。

没有dept_name(部门名称)。 所以,需要使用t_emp表的dept_id关联到t_dept表的id。 改为左连接查询。

select
    e.id,e.name ,
    e.gender,
    e.email,
    e.dept_id,
    d.name dept_name
from t_emp e left join t_dept d on e.dept_id = d.id
order by e.id desc

如何修改默认查询

org.yun.ssm.dao包下,创建EmpExtMapper.java文件。 代码:

public interface EmpExtMapper {
    List<Emp> selectByWithDept();
    Emp selectByPrimaryKeyWithDept(Long id);
}

对应的EmpExtMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.yun.ssm.dao.EmpExtMapper">

    <sql id="baseSql">
        select
            e.id,e.name ,
            e.gender,
            e.email,
            e.dept_id,
            d.id "dept.id", <!-- 注意 -->
            d.name "dept.name" <!-- 注意 -->
        from t_emp e left join t_dept d on e.dept_id = d.id
    </sql>

    <select id="selectWithDept" resultType="Emp">
        <include refid="baseSql"/>
        order by e.id desc
    </select>

    <select id="selectByPrimaryKeyWithDept" resultType="Emp">
        <include refid="baseSql"/>
        where e.id = #{id}
    </select>

</mapper>

注意: d.id "dept.id"d.name "dept.name" 直接映射大dept的id和name属性。

修改Emp.java

public class Emp  {
    ...
    
    //关联Dept
    private Dept dept;
    //getter and setter
}

单元测试:

@Autowired
private EmpExtMapper empExtMapper;

@Test
public void test() {
    Emp emp = empExtMapper.selectByPrimaryKeyWithDept(1L);
	System.out.println(emp.getDept().getName());
}

编写控制器

@Controller  
public class EmpController {

}
  • @Controller表示这是一个可被SpringMVC识别的控制器注解。

具体的分页列表方法:

    @RequestMapping("/emps")
    public String list(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, Model model) {
        //1.设置分页参数
        PageHelper.startPage(pageNum, PAGE_SIZE);
        //2.查询结果集
        List<Emp> emps = empService.getAll();
        //3.设置分页信息
        PageInfo<Emp> page = new PageInfo(emps, PAGE_SIZE); //设置分页条
        model.addAttribute("page", page);
        return "list";
    }
  • @RequestMapping("/emps") 表示映射请求/emps
  • PageHelper.startPage(pageNum, PAGE_SIZE); 设置分页。 其中,pageNum表示当前是第几页。PAGE_SIZE 是自定义的常量,表示每页显示几条记录。
  • empService.getAll() 条用Service层的方法,查询t_emp表的记录。
@Service
public class EmpService {
    @Autowired
    private EmpExtMapper empExtMapper;
    public List<Emp> getAll() {
        return empExtMapper.selectWithDept();
    }
}
  • PageInfo<Emp> page = new PageInfo(emps, PAGE_SIZE) 创建分页对象。

PageInfo的构造器:
第1个参数:放置要显示的结果集。通常是一个List集合。
第2个参数:分页导航条要显示的条目数。
如:

说明,该分页导航条的条目数是5。

编写视图

  • index.jsp 就一行代码:<jsp:forward page="/emps"/>
    目的:用来跳转到/emps 请求处理。
    然后,经过list()方法后,跳转到list.jsp页面。
  • list.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<html>
<head>
    <title>SSM_CRUD_SIMPLE</title>
</head>
<body>

<h1>SSM_CRUD_SIMPLE</h1>

<a href="${ctx}/emp" target="_blank">新增</a>
<a href="javascript:void(0);" id="batchDel">批量刪除</a>

<table width="50%">
    <tr>
        <td><input type="checkbox" id="checkAll"/></td>
        <td>ID</td>
        <td>姓名</td>
        <td>性别</td>
        <td>邮箱</td>
        <td>部门</td>
        <td>操作</td>
    </tr>
    <c:forEach var="emp" items="${page.list}">
        <tr>
            <td><input type="checkbox" class="checkItem" value="${emp.id}"/></td>
            <td>${emp.id}</td>
            <td>${emp.name}</td>
            <td>${emp.gender=='M'?'男':'女'}</td>
            <td>${emp.email}</td>
            <td>${emp.dept.name}</td>
            <td>
                <a href="${ctx}/emp/${emp.id}" target="_blank">编辑</a>
                <a href="javascript:void(0);" class="delete">删除</a>
            </td>
        </tr>
    </c:forEach>
</table>

<br/>

<%--分页条--%>
<div id="pageInfo">

    当前第${page.pageNum}页,总${page.pages}页,总${page.total}条记录。
    
    &nbsp;&nbsp;
    
    <%--首页--%>
    <a href="${ctx}/emps?pageNum=1">首页</a>

    <%--上一页--%>
    <c:if test="${page.hasPreviousPage}">
        <a href="${ctx}/emps?pageNum=${page.pageNum-1}">上一页</a>
    </c:if>
    
    <%--分页导航条目--%>
    <c:forEach var="pageNum" items="${page.navigatepageNums}">
        <a href="${ctx}/emps?pageNum=${pageNum}">${pageNum}</a>
    </c:forEach>

     <%--下一页--%>
    <c:if test="${page.hasNextPage}">
        <a href="${ctx}/emps?pageNum=${page.pageNum+1}">下一页</a>
    </c:if>

     <%--尾页--%>
    <a href="${ctx}/emps?pageNum=${page.pages}">尾页</a>
</div>
</body>
</html>
  • <c:set var="ctx" value="${pageContext.request.contextPath}"/> 用来设置web的根路径
  • 因为在控制器中,实现了分页的设置,并加入到Model中。
PageInfo<Emp> page = new PageInfo(emps, PAGE_SIZE); //设置分页条
model.addAttribute("page", page);

所以,页面就可以用,形如${page.list}这样的方式,取得page里面的属性。而这里的属性都是mybatis分页插件Pagehelper封装好的。

  • 项目部署到Tomcat后,启动。看到如下页面:

转载于:https://my.oschina.net/mondayer/blog/3033759

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值