SSM实现分页模糊查询
一、准备工作
1、pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!--逆向生成带分页的-->
<dependency>
<groupId>com.itfsw</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--MyBatis整合spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!--pojo转换成 json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
2、web.xml
<!--配置全局通过监听器加载spring配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--解决post方法中request请求的乱码-->
<filter>
<filter-name>ce</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--是否支持异步-->
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ce</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置mvc-servlet-->
<servlet>
<servlet-name>ds</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc/SpringMvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ds</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3、srping.xml
<!--1、开启Spring注解驱动-->
<context:component-scan base-package="com.k9503.service"/>
<!--2、加载db.properties配置文件-->
<context:property-placeholder location="classpath:mybatis/properties/db.properties"/>
<!--3、配置c3p0连接池-->
<bean id="dateSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--4、配置事务管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dateSource"/>
</bean>
<!--5、开启事务管理注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--6、管理MyBatis核心配置文件-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dateSource"/>
<property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/>
</bean>
<!--7、管理MyBatis中的映射文件和接口的关系-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.k9503.mapper"/>
<property name="sqlSessionFactoryBeanName" value="factory"/>
</bean>
4、springMvc.xml
<!--开启controller层的注解-->
<context:component-scan base-package="com.k9503.controller"/>
<!--开启mvc特有的注解-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="utf-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!--配置默认的servlet-->
<mvc:default-servlet-handler/>
<!--处理jsp页面的后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
5、MyBatis逆向生成/gener.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 生成配置文件 -->
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--分页插件-->
<plugin type="com.itfsw.mybatis.generator.plugins.LimitPlugin"/>
<commentGenerator>
<!-- 是否去除注释,true表示是,false否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 1.连接数据库信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/k9503?characterEncoding=UTF-8"
userId="root"
password="171009">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 2.pojo类的生成配置 targetPackage表示目标文件夹
targetProject表示当前目标文件夹所放置的目标地址
-->
<javaModelGenerator targetPackage="com.k9503.pojo" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 3.sql映射文件生成配置 -->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources\mybatis">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 4.mapper接口配置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.k9503.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 5.数据库表和实体类映射 -->
<table tableName="emp" domainObjectName="Emp">
</table>
<table tableName="dept" domainObjectName="Dept">
</table>
</context>
</generatorConfiguration>
6、mybatis.xml
<configuration>
<settings>
<!-- 可以在控制台输出日志信息:sql语句和参数 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 2.表示类型别名 -->
<typeAliases>
<!-- 2.1每一个类型的别名 type属性表示别名对应的类型地址 alias表示起的别名-->
<typeAlias type="java.util.List" alias="list"/>
<!-- package表示包,利用包的形式进行扫描包之下的所有的类,别名就是当前类名 -->
<package name="com.k9503.pojo"/>
</typeAliases>
</configuration>
二、展示页面
1.1、展示
<!--条件查询-->
<form action="/emp/show" method="post" id="fm" style="text-align: center">
<h2 style="text-align: center">员工管理</h2>
姓名:<input type="text" name="name" value="${page.name}"/>
生日:<input type="date" name="startBirth" value="<fmt:formatDate value='${page.startBirth}' pattern='yyyy-MM-dd'/>" >-
<input type="date" name="endBirth" value="<fmt:formatDate value='${page.endBirth}' pattern='yyyy-MM-dd'/>" >
部门:<select name="deptId">
<option value="0">--请选择--</option>
<c:forEach var="dept" items="${depts}">
<option value="${dept.id}"<c:if test="${dept.id==page.deptId}">
selected=true</c:if>>${dept.dname}</option>
</c:forEach>
</select>
<input type="hidden" id="curr" name="currPage" value="1" >
<input type="submit" value="搜索">
</form>
<!--展示-->
<table align="center" cellpadding="15" cellspacing="0" border="1" bgcolor="#add8e6">
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>工资</td>
<td>津贴</td>
<td>生日</td>
<td>入职时间</td>
<td>上级</td>
<td>部门</td>
<td>操作| <input type="button" onclick="location.href='/emp/add'" value="新增"></td>
</tr>
<c:if test="${not empty list}">
<c:forEach var="emp" items="${list}" varStatus="vs">
<tr <c:if test="${vs.count%2==1}"> bgcolor="#7fffd4" </c:if>>
<td>${emp.id}</td>
<td>${emp.name}</td>
<td>${emp.age}</td>
<td>${emp.sex}</td>
<td>${emp.salary}</td>
<td>${emp.bonus}</td>
<td><fmt:formatDate value="${emp.birth}" pattern="yyyy-MM-dd"/></td>
<td><fmt:formatDate value="${emp.hiredate}" pattern="yyyy-MM-dd"/></td>
<td>${emp.leader}</td>
<td>${emp.dept.dname}</td>
<td>
<a onclick="return confirm('确认删除吗?')" href="/emp/deleteById/${emp.id}" id="del">删除</a>|
<a href="/emp/selectById/${emp.id}">修改</a></td>
</tr>
</c:forEach>
</c:if>
</table>
<!--分页-->
<table align="center" cellpadding="10" cellspacing="10">
<tr>
<td><a href="javascript:toPage(1)">首页</a></td>
<td><a href="javascript:toPage(${page.currPage-1})">上一页</a></td>
<c:forEach var="i" begin="1" end="${page.totalPage}">
<td><a href="javascript:toPage(${i})">${i}</a></td>
</c:forEach>
<td><a href="javascript:toPage(${page.currPage+1})">下一页</a></td>
<td><a href="javascript:goPage()">跳转</a>到第<input size="2" type="text" value="${page.currPage}" id="go">页</td>
<td><a href="javascript:toPage(${page.totalPage})">尾页</a></td>
</tr>
</table>
1.2、service层
//查询所有
@Override
public List<Emp> selectAll(PageBean page) {
EmpExample example = new EmpExample();
EmpExample.Criteria criteria = example.createCriteria();
if (page.getName()!=null&&!page.getName().trim().equals("")){
criteria.andNameLike("%"+page.getName()+"%");
}
if (page.getStartBirth()!=null){
criteria.andBirthGreaterThanOrEqualTo(page.getStartBirth());
}
if (page.getEndBirth()!=null){
criteria.andBirthLessThanOrEqualTo(page.getEndBirth());
}
if (page.getDeptId()!=null&&page.getDeptId()!=0){
criteria.andDeptidEqualTo(page.getDeptId());
}
//查询总记录数
int count = (int) empMapper.countByExample(example);
int size=page.getSize();
int totalPage=(count%size==0)?(count/size):(count/size+1);
page.setCount(count);
page.setTotalPage(totalPage);
//分页
int startRow=(page.getCurrPage()-1)*size;
example.limit(startRow,size);
List<Emp> list = empMapper.selectByExample(example);
for (Emp emp:list){
Dept dept = deptMapper.selectByPrimaryKey(emp.getDeptid());
emp.setDept(dept);
}
return list;
}
1.3、controller层
@Autowired
private IEmpService service;
@RequestMapping("/show")
public ModelAndView show(PageBean page, ModelAndView mav){
List<Emp> list=service.selectAll(page);
List<Dept> depts=service.selectDepts();
mav.addObject("list",list);
mav.addObject("depts",depts);
mav.addObject("page",page);
mav.setViewName("show");
return mav;
}
三、新增
1.1、新增页面
<form action="/emp/addEmp" method="post" style="text-align: center" id="add">
<h2 style="text-align: center">添加信息</h2>
<input type="hidden" name="id" value="">
姓名:<input type="text" name="name" value=""/><br><br>
年龄:<input type="text" name="age" value=""/><br><br>
性别:
<input type="radio" name="sex" value=""/>男
<input type="radio" name="sex" value=""/>女<br><br>
工资:<input type="text" name="salary" value=""/><br><br>
津贴:<input type="text" name="bonus" value=""/><br><br>
生日: <input type="date" name="birth"
value="<fmt:formatDate value='${emp.birth}' pattern='yyyy-MM-dd'/>"/><br><br>
入职时间: <input type="date" name="hiredate"
value="<fmt:formatDate value='${emp.hiredate}' pattern='yyyy-MM-dd'/>"/><br><br>
上级:<input type="text" name="leader" value=""/><br><br>
部门: <select name="deptid">
<option value="0">--请选择--</option>
<c:forEach var="dept" items="${depts}">
<option value="${dept.id}" <c:if test="${dept.id==emp.deptid}" >selected='true'</c:if> >
${dept.dname}
</option>
</c:forEach>
</select><br><br>
<input type="submit" value="提交">
<input type="reset" value="取消">
</form>
1.2、service层
@Override
public int addEmp(Emp emp) {
return empMapper.insertSelective(emp);
}
1.3、controller层
//实现新增
@RequestMapping("/addEmp")
public String addEmp(Emp emp){
int i=service.addEmp(emp);
return "redirect:/emp/show";
}
//新增成功跳转
@RequestMapping("/add")
public String add(Model model){
List<Dept> depts = service.selectDepts();
model.addAttribute("depts",depts);
return "add";
}
四、修改、删除
1.1、修改页面
<form action="/emp/update" method="post" style="text-align: center">
<h2 style="text-align: center">修改信息</h2>
<input type="hidden" name="id" value="${emp.id}">
姓名:<input type="text" name="name" value="${emp.name}"/><br><br>
年龄:<input type="text" name="age" value="${emp.age}"/><br><br>
性别:
<input type="radio" name="sex" value="${emp.sex}"<c:if test="${emp.sex=='男'}">checked='true'</c:if>/>男
<input type="radio" name="sex" value="${emp.sex}"<c:if test="${emp.sex=='女'}">checked='true'</c:if>/>女<br><br>
工资:<input type="text" name="salary" value="${emp.salary}"/><br><br>
津贴:<input type="text" name="bonus" value="${emp.bonus}"/><br><br>
生日: <input type="date" name="birth"
value="<fmt:formatDate value='${emp.birth}' pattern='yyyy-MM-dd'/>" /><br><br>
入职时间: <input type="date" name="hiredate"
value="<fmt:formatDate value='${emp.hiredate}' pattern='yyyy-MM-dd'/>"/><br><br>
上级:<input type="text" name="leader" value="${emp.leader}"/><br><br>
部门: <select name="deptid">
<option value="0">--请选择--</option>
<c:forEach var="dept" items="${depts}">
<option value="${dept.id}" <c:if test="${dept.id==emp.deptid}" >selected='true'</c:if> >
${dept.dname}
</option>
</c:forEach>
</select><br><br>
<input type="submit" value="提交">
<input type="reset" value="取消">
</form>
1.2、service层
@Override//删除
public int deleteById(int id) {
return empMapper.deleteByPrimaryKey(id);
}
@Override//查询单条
public Emp selectById(int id) {
return empMapper.selectByPrimaryKey(id);
}
@Override//修改
public int updateById(Emp emp) {
return empMapper.updateByPrimaryKeySelective(emp);
}
1.3、controller层
//删除
@RequestMapping("/deleteById/{id}")
public String delete(@PathVariable String id) {
int i = service.deleteById(Integer.parseInt(id));
return "redirect:/emp/show";
}
//执行修改
@RequestMapping("/update")
public String updateById(Emp emp){
int i=service.updateById(emp);
return "redirect:/emp/show";
}
//查询单条
@RequestMapping("/selectById/{id}")
public String selectById(@PathVariable String id, Model model){
Emp emp = service.selectById(Integer.parseInt(id));
model.addAttribute("emp",emp);
List<Dept> depts = service.selectDepts();
model.addAttribute("depts",depts);
return "update";
}