SSS项目实现登录、增删查和分页
由于day4中已经实现了框架的搭建和修改,所以今天主要实现了增删查和分页
1.登录
1.mapper.xml(用于写SQL语句)
<!-- 登录 -->
<select id="doLogin" parameterType="String" resultType="com.zhongruan.bean.UserInfo">
select * from tb_user where username = #{username}
</select>
2.dao层(数据库交互)
//登录
UserInfo doLogin(String username);
3.service层(处于controller和dao层之间,负责业务模块的逻辑应用设计)
UserInfoService.java
//登录
UserInfo doLogin(String username);
UserInfoServiceImpl.java
@Override
public UserInfo doLogin(String username){
return userdao.doLogin(username);
}
4.controller层(页面交互的逻辑处理)
@RequestMapping("/doLogin.do")
public String doLogin(String username, String password, HttpSession session){
UserInfo userInfo = userInfoService.doLogin(username);
if(userInfo != null){
if(userInfo.getPassword().equals(password)){
System.out.println("登录成功!");
session.setAttribute("userInfo",userInfo);
return "main";
}else{
System.out.println("密码错误,请重新登录!");
session.setAttribute("message","密码错误,请重新登录!");
return "../login";// 根目录../
}
}else{
System.out.println("用户不存在,请重新输入!");
session.setAttribute("message","用户不存在,请重新输入!");
return "../login";
}
}
2.增删查
1.mapper.xml(用于写SQL语句)
<!-- 添加用户 -->
<insert id="addUser" parameterType = "com.zhongruan.bean.UserInfo">
insert into tb_user(id,username,password) values (#{id},#{username},#{password})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType = "com.zhongruan.bean.UserInfo">
update tb_user set username=#{username},password=#{password} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="Integer">
delete from tb_user where id=#{id}
</delete>
<!-- 更新前查询 通过id找User -->
<select id="findUserById" parameterType="Integer" resultType = "com.zhongruan.bean.UserInfo">
select * from tb_user where id=#{id}
</select>
<!-- 模糊查询 -->
<select id="findUserByName" parameterType="String" resultType="com.zhongruan.bean.UserInfo">
select * from tb_user where username like '%' #{username} '%'
</select>
2.dao层(数据库交互)
//删除
void deleteUser(int id);
//增加
void addUser(UserInfo userInfo);
//模糊查询
List<UserInfo> findUserByName(String username);
3.service层(处于controller和dao层之间,负责业务模块的逻辑应用设计)
UserInfoService.java
//删除
void deleteUser(int id);
//增加
void addUser(UserInfo userInfo);
//模糊查询
List<UserInfo> findUserByName(String username);
UserInfoServiceImpl.java
@Override
public void deleteUser(int id){
userdao.deleteUser(id);
}
@Override
public void addUser(UserInfo userInfo){
userdao.addUser(userInfo);
}
@Override
public List<UserInfo> findUserByName(String username){
return userdao.findUserByName(username);
}
4.controller层(页面交互的逻辑处理)
@RequestMapping("/deleteUser.do")
public String deleteUser(int id){
userInfoService.deleteUser(id);
return "redirect:/user/findAll.do";
}
@RequestMapping("/addUser.do")
public String addUser(UserInfo userInfo){
userInfoService.addUser(userInfo);
return "redirect:/user/findAll.do";
}
@RequestMapping("/findUserByName.do")
public ModelAndView findUserByName(String username){
List<UserInfo> userInfoList = userInfoService.findUserByName(username);
ModelAndView mv = new ModelAndView();
mv.addObject("userInfoList ",userInfoList );
mv.setViewName("user-list");
return mv;
}
3.分页
1.在pom.xml文件中导入pagehelper的包
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
2.在applicationContext.xml文件中为sqlsessionfactroy加入以下配置。为下面的plugins的property
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 扫描bean包 使用别名 -->
<property name="typeAliasesPackage" value="com.suelta.bean"></property>
<!--配置加载映射文件 UserMapper.xml-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--设置用的哪个数据库-->
<prop key="helperDialect">mysql</prop>
<!--设置默认为可以处理页面异常-->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
3.在使用pagehelper进行分页之前,我们看看pagehelper的相关属性。这里主要关注size,pageNum,pages,list这几个参数
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//第一页
private int firstPage;
//前一页
private int prePage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
4.这一过程我们分三步,因为我们是通过前台传递的参数来确定是哪一页分页和每一页所展示的数据量。所以,(1)我们在Controller层使用page和size来接收前端传来的数据。Controller层调用service层,故将值往下传,(2)并在service层所调用的函数中,加入PageHelper.startPage(page,size);即可。(3)最后通过在Controller层使用PageInfo,对其初始化,并传给ModelAndView中即可
Controller层
//分页查询全部user
@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5") int size){
List<UserInfo> userInfoList = userInfoService.findAll(page,size);
PageInfo pageInfo = new PageInfo(userInfoList);
ModelAndView mv = new ModelAndView();
mv.addObject("pageInfo",pageInfo);
mv.setViewName("user-list");
return mv;
}
service层
@Override
public List<UserInfo> findAll(int page, int size){
PageHelper.startPage(page,size);//开始使用分页
return userdao.findAllUser();
}
5.下面为前端的页面代码。通过${pageContext.request.contextPath}/user/findAll.do?page=1&size=5来实现传值。
pageInfo.pages代表总页数;
pageInfo.pageNum代表当前页码;
<li><a href="${pageContext.request.contextPath}/user/findAll.do?page=1&size=5" aria-label="Previous">首页</a></li>
<li><a href="${pageContext.request.contextPath}/user/findAll.do?page=${pageInfo.pageNum-1}&size=5">上一页</a></li>
<c:forEach begin="1" end="${pageInfo.pages}" var="pagenum">
<li><a href="${pageContext.request.contextPath}/user/findAll.do?page=${pagenum}&size=5">${pagenum}</a> </li>
</c:forEach>
<li><a href="${pageContext.request.contextPath}/user/findAll.do?page=${pageInfo.pageNum+1}&size=5">下一页</a></li>
<li><a href="${pageContext.request.contextPath}/user/findAll.do?page=${pageInfo.pages}&size=5" aria-label="Next">尾页</a></li>
注意:模糊查询的显示是使用findAll这个函数对应的jsp进行显示的,当使用分页后,findAll进行了修改,所以查询模块需要进行相应的修改
dao层
//模糊查询
List<UserInfo> findUserByName(String username);
service层
@Override
public List<UserInfo> findUserByName(int page, int size, String username){
PageHelper.startPage(page,size);
return userdao.findUserByName(username);
}
controller层
@RequestMapping("/findUserByName.do")
public ModelAndView findUserByName(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5") int size,String username){
List<UserInfo> userInfoList = userInfoService.findUserByName(page,size,username);
PageInfo pageInfo = new PageInfo(userInfoList);
ModelAndView mv = new ModelAndView();
mv.addObject("pageInfo",pageInfo);
mv.setViewName("user-list");
return mv;
}
效果图
登录界面
登录成功
增
删
查询
分页