1.首先引入相关的依赖,SpringBoot是2.7.0版本的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、首先封装一下mybatis查用的sql语句,方便使用
2.1AbstractDao 类时封装sql语句的
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zxh
*/
public abstract class AbstractDao extends SqlSessionDaoSupport {
protected static final String COUNT = "count";
protected static final String SELECT_ONE = "selectOne";
protected static final String INSERT = "insert";
protected static final String INSERT_LIST = "insertList";
protected static final String UPDATE = "update";
protected static final String UPDATE_BY_ENTITY = "updateByEntity";
protected static final String DELETE = "delete";
protected static final String SELECT_LIST = "selectList";
private static String getStatement(Class<?> clazz, String methodName) {
return clazz.getName() + "." + methodName;
}
private static String getStatement(String clazz, String methodName) {
return clazz + "." + methodName;
}
public Integer count(Object parameter) {
return (Integer) getSqlSession().selectOne(getStatement(parameter.getClass(), COUNT), parameter);
}
public Integer count(Class<?> statementClazz, String methodName, Object parameter) {
return (Integer) getSqlSession().selectOne(getStatement(statementClazz, methodName), parameter);
}
public Integer count(String namespace, String methodName, Object parameter) {
return (Integer) getSqlSession().selectOne(getStatement(namespace, methodName), parameter);
}
public <T> T selectOne(Object parameter) {
return (T) getSqlSession().selectOne(getStatement(parameter.getClass(), SELECT_ONE), parameter);
}
public <T> T selectOne(Class<?> statementClazz, String methodName, Object parameter) {
return (T) getSqlSession().selectOne(getStatement(statementClazz, methodName), parameter);
}
public <T> T selectOne(Class<?> statementClazz, String methodName) {
return (T) getSqlSession().selectOne(getStatement(statementClazz, methodName));
}
public <T> T selectById(Class<?> statementClazz, Object parameter) {
return (T) getSqlSession().selectOne(getStatement(statementClazz, "selectById"), parameter);
}
public int insert(Object parameter) {
return getSqlSession().insert(getStatement(parameter.getClass(), INSERT), parameter);
}
public int insert(Class<?> statementClazz, String methodName, Object parameter) {
return getSqlSession().insert(getStatement(statementClazz, methodName), parameter);
}
public int insert(String namespace, String methodName, Object parameter) {
return getSqlSession().insert(getStatement(namespace, methodName), parameter);
}
public int insert(List<? extends Object> list) {
return getSqlSession().insert(getStatement(list.get(0).getClass(), INSERT_LIST), list);
}
public int update(Object parameter) {
return getSqlSession().update(getStatement(parameter.getClass(), UPDATE), parameter);
}
public int update(Class<?> statementClazz, String methodName) {
return getSqlSession().update(getStatement(statementClazz, methodName));
}
public int update(String namespace, String methodName) {
return getSqlSession().update(getStatement(namespace, methodName));
}
public int update(Class<?> statementClazz, String methodName, Object parameter) {
return getSqlSession().update(getStatement(statementClazz, methodName), parameter);
}
public int update(String namespace, String methodName, Object parameter) {
return getSqlSession().update(getStatement(namespace, methodName), parameter);
}
public int update(Object setParameter, Object whereParameter) {
Map<String, Object> parameter = new HashMap<>();
parameter.put("s", setParameter);
parameter.put("w", whereParameter);
return getSqlSession().update(getStatement(setParameter.getClass(), UPDATE_BY_ENTITY), parameter);
}
public int delete(Object parameter) {
return getSqlSession().delete(getStatement(parameter.getClass(), DELETE), parameter);
}
public int delete(Class<?> statementClazz, String methodName, Object parameter) {
return getSqlSession().delete(getStatement(statementClazz, methodName), parameter);
}
public int deleteById(Class<?> statementClazz, Object parameter) {
return getSqlSession().delete(getStatement(statementClazz, "deleteById"), parameter);
}
public <E> List<E> selectList(Object parameter) {
return getSqlSession().selectList(getStatement(parameter.getClass(), SELECT_LIST), parameter);
}
public <E> List<E> selectList(Class<?> statementClazz, String methodName) {
return getSqlSession().selectList(getStatement(statementClazz, methodName));
}
public <E> List<E> selectList(Class<?> statementClazz, String methodName, Object parameter) {
return getSqlSession().selectList(getStatement(statementClazz, methodName), parameter);
}
public <E> List<E> selectList(String namespace, String methodName, Object parameter) {
return getSqlSession().selectList(getStatement(namespace, methodName), parameter);
}
public <E> List<E> selectPageList(Class<?> statementClazz, String methodName, Object parameter, int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize, false);
return getSqlSession().selectList(getStatement(statementClazz, methodName), parameter);
}
public <E> List<E> selectPageList(String namespace, String methodName, Object parameter, int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize, false);
return getSqlSession().selectList(getStatement(namespace, methodName), parameter);
}
public <T> PageInfo<T> selectPageListAndCount(Class<?> statementClazz, String methodName, Object parameter, int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
return new PageInfo<>(getSqlSession().selectList(getStatement(statementClazz, methodName), parameter));
}
public <T> PageInfo<T> selectPageListAndCount(Class<?> statementClazz, String methodName, Object parameter, int pageNum, int pageSize, String orderBy) {
PageHelper.startPage(pageNum, pageSize);
PageHelper.orderBy(orderBy);
return new PageInfo<>(getSqlSession().selectList(getStatement(statementClazz, methodName), parameter));
}
public <E> List<E> selectList(Class<?> statementClazz, String methodName, Object parameter, String orderBy) {
PageHelper.orderBy(orderBy);
return selectList(statementClazz, methodName, parameter);
}
public <E> List<E> selectPageList(Class<?> statementClazz, String methodName, Object parameter, int pageNum, int pageSize, String orderBy) {
PageHelper.startPage(pageNum, pageSize, false);
PageHelper.orderBy(orderBy);
return selectList(statementClazz, methodName, parameter);
}
}
2.2BaseDao是继承AbstractDao类,并且在后面会调用BaseDao类
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
/**
* @author zxh
*/
@Repository
public class BaseDao extends AbstractDao {
@Override
@Resource
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
}
2.3下面的内容我都返回的是Result类,所以把Result类也放到这里了
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Result<T> {
private String message;
private Integer code;
private T data;
public static <T> Result<T> success(T data) {
Result result = new Result<>();
result.setCode(200);
result.setMessage("success");
result.setData(data);
return result;
}
public static <T> Result<T> error(T data) {
Result result = new Result<>();
result.setCode(400);
result.setMessage("error");
result.setData(data);
return result;
}
}
3、先写service层
Result<PageInfo<User>> findByPage(Integer pageNum, Integer pageSize,String username);
4、写service层的实现类
@Autowired
private BaseDao baseDao;
@Override
public Result<PageInfo<User>> findByPage(Integer pageNum, Integer pageSize,String username) {
PageInfo<User> selectPage = baseDao.selectPageListAndCount(UserMapper.class, "findAll", username, pageNum, pageSize);
return Result.success(selectPage);
}
5、去写controller层
@Controller
@RequestMapping("/html")
public class UsersController {
@Autowired
private UserService userService;
@GetMapping("/selectUserByPage")
public String list(Model model, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "2") int pageSize,@RequestParam String username){
Result<PageInfo<User>> list = userService.findByPage(pageNum, pageSize,username);
model.addAttribute("username",username);
model.addAttribute("list",list);
return "user/list";
}
}
6、去写userMapper.xml文件,我的是在resources下的mappers文件下
<select id="findAll" resultType="com.buba.po.User" parameterType="string"> select * from user where username like concat('%',#{username},'%') </select>
6.1需要配置一下yml
mybatis: mapper-locations: classpath:mappers/*.xml
7、去写前端代码,我写在了templates文件下user文件里边
7.1配置一下yml
spring: thymeleaf: #配置html默认访问路径 prefix: classpath:/templates/
7.2前端代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>查询用户</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" ></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" ></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.min.js" ></script>
<style>
body{
background: #eff3f6;
}
.table{
text-align: center;
}
.u1{
margin: 0 auto;
width: 500px;
}
.modal{
color: black;
text-align: left;
}
</style>
</head>
<body>
<div style="margin: 10px 0px;">
<form class="form-inline my-2 my-lg-0 findForm" >
<input class="form-control mr-sm-2 findUsername" type="search" name="username" placeholder="根据用户名" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0 find" type="submit">查询</button>
</form>
</div>
<table class="table table-dark">
<thead>
<tr>
<th scope="col">用户id</th>
<th scope="col">用户名字</th>
<th scope="col">用户密码</th>
<th scope="col">用户邮箱</th>
<th scope="col">状态</th>
<th scope="col">操作</th>
</tr>
</thead>
<tbody th:each="user:${list}">
<tr th:each="user2:${user.data.list}">
<th scope="row" th:text="${user2.uId}" ></th>
<td th:text="${user2.username}"></td>
<td th:text="${user2.password}"></td>
<td th:text="${user2.email}"></td>
<td th:if="${user2.userStatus} == 0" style="color: green">可用</td>
<td th:if="${user2.userStatus} == 1" style="color: red">不可用</td>
<td>
<a th:href="'http://localhost:7004/user-server/html/updateStatus?id='+${user2.uId}" class="btn btn-primary">修改</a>
<a th:href="'http://localhost:7004/user-server/html/delUser?id='+${user2.uId}" class="btn btn-danger">删除</a>
</td>
</tr>
</tbody>
</table>
<nav aria-label="Page navigation example">
<ul class="pagination u1" >
<li class="page-item" >
<span class="page-link" th:text="'第'+${list.data.pageNum}+'页'"></span>
</li>
<li class="page-item" >
<span class="page-link" th:text="'共'+${list.data.pages}+'页'"></span>
</li>
<li class="page-item" >
<span class="page-link" th:text="'共'+${list.data.total}+'条'"></span>
</li>
<li class="page-item" >
<a class="page-link" th:href="'/user-server/html/selectUserByPage?pageNum='+${list.data.navigateFirstPage}+'&pageSize='+${list.data.pageSize}+'&username='+${username}" th:text="首页" ></a>
</li>
<li class="page-item" th:if="${!list.data.isFirstPage}">
<a class="page-link" th:href="'/user-server/html/selectUserByPage?pageNum='+${list.data.prePage}+'&pageSize='+${list.data.pageSize}+'&username='+${username}" th:text="上一页"></a>
</li>
<li class="page-item"th:if="${list.data.isFirstPage}">
<a class="page-link" th:text="上一页"></a>
</li>
<!-- 如果为true的话,就是最后一页了,然后反过来不让他执行-->
<li class="page-item" th:if="${!list.data.isLastPage}" >
<a class="page-link" th:href="'/user-server/html/selectUserByPage?pageNum='+${list.data.nextPage}+'&pageSize='+${list.data.pageSize}+'&username='+${username}" th:text="下一页"></a>
</li>
<li class="page-item" th:if="${list.data.isLastPage}" >
<a class="page-link" th:text="下一页"></a>
</li>
<li class="page-item" >
<a class="page-link" th:href="'/user-server/html/selectUserByPage?pageNum='+${list.data.navigateLastPage}+'&pageSize='+${list.data.pageSize}+'&username='+${username}" th:text="尾页"></a>
</li>
</ul>
</nav>
</body>
</html>
8、最后页面显示: