通过单元测试添加数据
在该目录下,建立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}条记录。
<%--首页--%>
<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后,启动。看到如下页面: