junit和spring
对dao层、service进行单元测试!
applicationContext-dao.xml容器上下文
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 加载数据库连接的属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置dbcp2的数据源 数据库连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.cj.jdbc.Driver"
p:url="${jdbc.url}"
p:username="root"
p:password="123456"/>
<!--SqlSessionFactory的配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--配置mybatis的配置文件 -->
<property name="configLocation" value="classpath:mybatis.xml"/>
</bean>
<!--mapper的扫描器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 自动生成com.mhy.mapper下所有接口的实现类对象 -->
<property name="basePackage" value="com.iflytek.onlinepro.mapper"/>
</bean>
</beans>
Springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启springmvc的注解驱动 -->
<mvc:annotation-driven />
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.iflytek.onlinepro"/>
<!-- 添加MVC 加载静态文件 css、图片等-->
<mvc:default-servlet-handler/>
<mvc:resources location="/static/js/" mapping="/js/**"/>
<mvc:resources location="/static/" mapping="/jquery-3.6.0.js"/>
<mvc:resources location="/static/" mapping="/jquery-3.6.0.min.js"/>
<mvc:resources location="/static/image/" mapping="/image/**"/>
<mvc:resources location="/static/images/" mapping="/images/**"/>
<mvc:resources location="/static/bootstrap-4.6.1-dist/css" mapping="/css/**" />
<mvc:resources location="/static/bootstrap-4.6.1-dist/js" mapping="/js/**" />
<!-- springmvc的全局异常处理 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 默认的异常处理页面 -->
<property name="defaultErrorView" value="error.jsp"/>
</bean>
<!-- 配置上传的视图解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置允许上传的最大的文件的大小 : 最大1M-->
<property name="maxUploadSize">
<value>1048576</value>
</property>
</bean>
</beans>
逻辑分页与物理分页
逻辑分页:依赖于代码。先查询除所有的数据,在根据代码块的所需筛选出合适的数据进行分页。
物理分页:依赖于数据库。MYSQL数据库提供的关键字limit,程序猿只需要编写带有关键字的sql语句,数据库返回的数据就是分页结果。
RowBound属于逻辑分页(内存分页),pageHelper属于物理分页。
- 添加依赖
<!-- 分页依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.0</version>
</dependency>
- 配置pagehelper
可以在Spring的配置xml中,也可以配置在mybatis的配置中,因为它相当于一个插件。
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- reasonable:分页合理化参数,默认值为false。
当该参数设置为 true 时,pageNum<=0 时会查询第一页,
pageNum>pages(超过总页数时),会查询最后一页。默认false 时,
直接根据参数进行查询。 -->
<!-- 通俗的讲就是在最后一页如果点击下一页(或者说是切换到下一页)
就会回到首页 -->
<property name="reasonable" value="true"/>
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍,可以不写参数-->
<!-- 这个是参数演示,不填参数需要删除-->
<!-- <property name="param1" value="value1"/> -->
</plugin>
</plugins>
- 直接用
//查询所有人员
@RequestMapping("/findAllUserAndRole.do")
public @ResponseBody PageInfo<User> findAllUsers(@RequestParam(required = true,defaultValue = "1") Integer page) throws Exception{
PageHelper.startPage(page, 8);
List<User> users = userService.findAllUsers();
PageInfo<User> pageinfo = new PageInfo<User>(users);
return pageinfo;
}
<!-- 底部- begin -->
<div style="margin-top:25px;">
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
<li class="page-item"><a class="page-link" href="javascript:gotoFirstPage()">首页</a></li>
<li class="page-item"><a class="page-link" href="javascript:gotoPrePage()">上一页</a></li>
<li class="page-item">
<a class="page-link" href="javascript:;">
<span id="curpage"></span>
/
<span id="tpage"></span>
</a>
</li>
<li class="page-item"><a class="page-link" href="javascript:gotoNextPage()">下一页</a></li>
<li class="page-item"><a class="page-link" href="javascript:gotoLastPage()">末页</a></li>
</ul>
</nav>
</div>
//分页函数
//首页
function gotoFirstPage(){
findAllUser(1);
}
//下一页
function gotoNextPage(){
var nextpage = parseInt($("#curpage").text()) + 1
findAllUser(nextpage);
}
//上一页
function gotoPrePage(){
var prepage = parseInt($("#curpage").text()) - 1
findAllUser(prepage);
}
//末页
function gotoLastPage(){
var maxpage = $("#tpage").text()
findAllUser(maxpage);
}
function findAllUser(page){
document.getElementById("userdata").innerHTML = "";
//页面加载完成,完成ajax的异步交互,请求findAllProject.do,将数据渲染到页面中
$.ajax({
url:"findAllUserAndRole.do",
type:"post",
data:{"page":page},
success:function(pageinfo){
//获取后台返回的集合数据
var users = pageinfo.list;
//获取当前页
var curpage = pageinfo.pageNum;
//获取总页数
var tpage = pageinfo.pages;
$("#curpage").text(curpage);
$("#tpage").text(tpage);
for(var i = 0;i< users.length;i++){
var user = users[i] ;
//将user转换成json字符串
var userstr = JSON.stringify(user)
if(user.role.rid == 1){
//创建tr对象
var trobj = "<tr style='color: #ffc107'><td>"+ user.uid + "</td><td>"+user.uaccount+"</td><td>" +user.uname + "</td><td>"+user.role.rname+"</td><td>" +
user.email +"</td> <td> <button class='btn btn-warning btn-sm' οnclick='updateUser("+userstr+")' >修改</button> "+
" <button class='btn btn-danger btn-sm' οnclick='deleteUser("+ user.uid+")'>删除</button></td></tr> ";
}
else{
//创建tr对象
var trobj = "<tr><td>"+ user.uid + "</td><td>"+user.uaccount+"</td><td>" +user.uname + "</td><td>"+user.role.rname+"</td><td>" +
user.email +"</td> <td> <button class='btn btn-warning btn-sm' οnclick='updateUser("+userstr+")' >修改</button> "+
" <button class='btn btn-danger btn-sm' οnclick='deleteUser("+ user.uid+")'>删除</button></td></tr> ";
}
//将tr对象添加tbody中
$("#userdata").append(trobj);
}
},
error:function(){
alert("服务器端错误,请检查!");
}
});
}