前言:学习过程中了解到MyBatis-Plus 功能非常强大,于是乎学了起来,结合已有框架进行整合,但是发现好多博客都是与SpringBoot进行整合的。所以总结一个与spring+SpringMVC整合详细笔记供大家参考。后续也会总结一个与springBoot的整合,毕竟SpringBoot更为主流。
第一步:搭建Maven架构、完善项目结构。
第二步:在文件中导入所需要的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0" xmlns:xsi="http:///2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.">
<modelVersion>4.0.0</modelVersion>
<groupId></groupId>
<artifactId>ssmp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<>UTF-8</>
</properties>
<dependencies>
<!-- Apache工具组件 -->
<dependency>
<groupId></groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId></groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.2</version>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--spring-->
<dependency>
<groupId></groupId>
<artifactId>spring-context</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.</version>
</dependency>
<!--数据连接池-->
<dependency>
<groupId></groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--测试/配合spring-test进行测试类的测试(junit版本不能低于4.5)-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-test</artifactId>
<version>5.2.</version>
<scope>test</scope>
</dependency>
<!--spring-->
<dependency>
<groupId></groupId>
<artifactId>spring-context</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-web</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-core</artifactId>
<version>5.2.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-test</artifactId>
<version>5.2.</version>
<scope>test</scope>
</dependency>
<!--文件上传组件-->
<dependency>
<groupId></groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!--JSTL jsp页面使用的标签-->
<dependency>
<groupId></groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
</project>
第三步:准备一张表,并生成对应的实体类。
- @TableName:映射表名
- @TableId(type = ):映射主键自增
- @TableField(“user_account”):映射字段名
@TableName("oa_user")
public class OaUser {
// 主键自增
@TableId(type = IdType.AUTO)
private Long userId;
@TableField("user_account")
private String userAccount;
private String userPassword;
private String userPhone;
private Integer userGender;
// get()/set()方法......
}
第四步:修改配置文件
- 数据源配置文件:
url=jdbc:mysql://localhost:3306/oa_zan?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull
driver=
user=root
password=root
- spring的配置文件: 如果需要用到分页,需要添加分页插件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="http:///2001/XMLSchema-instance"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans
/schema/beans/
/schema/context
/schema/context/">
<!--扫描dao和service层的注解-->
<context:component-scan base-package=""/>
<!--引入文件、配置数据源连接-->
<context:property-placeholder location="classpath:"/>
<bean id="dataSource" class="">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!--创建sqlSessionFactory对象-->
<bean id="sqlSessionFactory" class="">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value=""/>
<property name="configuration">
<bean class="">
<property name="autoMappingBehavior" value="FULL"/>
<property name="mapUnderscoreToCamelCase" value="true"/>
</bean>
</property>
<!--分页插件-->
<property name="plugins">
<array>
<bean class="">
<property name="dbType" value="MYSQL"/>
</bean>
</array>
</property>
</bean>
<!--递归扫描dao成接口,进行动态映射-->
<bean class="">
<property name="basePackage" value=""/>
</bean>
</beans>
- SpringMVC的配置文件: (SpringMVC的配置文件不需要修改)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="http:///2001/XMLSchema-instance"
xmlns:context="/schema/context"
xmlns:mvc="/schema/mvc"
xsi:schemaLocation="/schema/beans /schema/beans/ /schema/context /schema/context/ /schema/mvc /schema/mvc/">
<!--扫描controller层的注解-->
<context:component-scan base-package=""/>
<!--注解驱动控制器-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json</value>
</list>
</property>
<property name="features">
<list>
<!--日期转换格式-->
<value>WriteDateUseDateFormat</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--配置视图解析器-->
<bean class="">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--引入静态资源-->
<mvc:resources mapping="/**" location="/"/>
<!--配置文件上传-->
<bean class="">
<!--配置文件上传大小限制和文件编码-->
<property name="maxUploadSize" value="5000000"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
</beans>
-
的配置文件可有可无。
-
的配置文件(不需要修改)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="/xml/ns/javaee"
xmlns:xsi="http:///2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:</param-value>
</context-param>
<listener>
<listener-class></listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class></servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--字符编码过滤器-->
<filter>
<filter-name>characterEncodingFile</filter-name>
<filter-class></filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFile</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
第五步:写Dao接口、继承 BaseMapper<T>
- 泛型T指定所要操作的实体类(实体类跟数据表又进行了映射)
public interface OaUserDao extends BaseMapper<OaUser> {
}
第六步:写service层调用MyBatis-Plus封装好的方法、实现具体的业务
- service 层接口的实现类,对一些常用方法进行举例。
@Service
public class OaUserServiceImpl implements OaUserService {
@Autowired
private OaUserDao oaUserDao;
/**
* 根据条件查询,条件可以为空,条件为空则为查询全部
* @return
*/
public List<OaUser> selectList(OaUser oaUser) {
if (oaUser == null) {
return oaUserDao.selectList(null);
}
QueryWrapper<OaUser> wrapper = new QueryWrapper<>();
wrapper.eq("user_account" , oaUser.getUserAccount());
return oaUserDao.selectList(wrapper);
}
/**
* 根据ID查询指定用户
* @param userId
* @return
*/
public OaUser selectOne(Integer userId){
return oaUserDao.selectById(userId);
}
/**
* 根据条件进行分页查询,条件可以为空
* @param page 当前页码
* @param rows 每页数据量
* @return
*/
@Override
public List<OaUser> selectByPage(Integer page, Integer rows) {
// 创建分页对象,包装分页数据
IPage<OaUser> oaUserPage = new Page<>(page, rows);
IPage<OaUser> oaUserIPage = oaUserDao.selectPage(oaUserPage, null);
List<OaUser> records = oaUserIPage.getRecords();
return records;
}
/**
* 按条件查询,把条件封装到map中
* @param map key:数据库字段,value:前端接收的值
* @return
*/
@Override
public List<OaUser> selectByMap(Map map) {
return oaUserDao.selectByMap(map);
}
/**
* 批量查询
* @param list
* @return
*/
@Override
public List<OaUser> selectByBatchId(List<Integer> list) {
return oaUserDao.selectBatchIds(list);
}
/**
* 根据ID删除
* @param userId
* @return
*/
@Override
public int deleteById(Integer userId) {
return oaUserDao.deleteById(userId);
}
/**
* 根据ID批量删除
* @param list
* @return
*/
@Override
public int deleteBatchIds(List<Integer> list) {
return oaUserDao.deleteBatchIds(list);
}
/**
* 通过指定条件删除,把条件封装的map中
* @param map key:数据库的字段。value:值
* @return
*/
@Override
public int deleteMap(Map map) {
return oaUserDao.deleteByMap(map);
}
}
- 测试示例
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:")
public class TestMyBatisPlus {
@Test
public void test(){
Map<String, String> map = new HashMap<>();
map.put("user_account" , "aaa");
map.put("user_password" , "aaa");
oaUserService.selectByMap(map).forEach(System.out::println);
}
}
第七步:实现controller层,进行页面交互
@Controller
@RequestMapping("/user")
public class OaUserController {
@Autowired
private OaUserService oaUserService;
@RequestMapping("/query")
public String getAll(OaUser oaUser , Model model){
List<OaUser> userList = oaUserService.selectList(oaUser);
model.addAttribute("userList" , userList);
return "index";
}
@RequestMapping("/getOne")
public String selectById(Integer userId , Model model){
OaUser oaUser = oaUserService.selectOne(userId);
model.addAttribute("oaUser" , oaUser);
return "details";
}
}
最后一步:jsp页面数据展示
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="/jsp/jstl/core" %>
<html>
<title>首页</title>
<style type="text/css">
#customers {
text-align: center;
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
}
#customers th {
height: 50px;
font-size: 1.1em;
text-align: center;
padding-top: 5px;
padding-bottom: 4px;
background-color: #A7C942;
color: #ffffff;
}
#customers td {
height: 50px;
}
</style>
</head>
<body>
<div style="width: 100%;text-align: center">
<h1>用户查询查询</h1>
</div>
<table id="customers">
<tr>
<th>用户账户</th>
<th>用户电话</th>
<th>用户性别</th>
<th>创建时间</th>
<th>操作</th>
</tr>
<c:forEach items="${userList}" var="userList" varStatus="i">
<tr style="background-color: powderblue">
<td>${}</td>
<td>${}</td>
<c:choose>
<c:when test="${ == 1}">
<td>男</td>
</c:when>
<c:when test="${ == 0}">
<td>女</td>
</c:when>
</c:choose>
<td>${}</td>
<td><a href="#">查询</a></td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>
条件构造器(重要)
有些复杂的SQL我们需要用到 官方网址
常用词解释:
- where WHERE 语句,拼接 + WHERE 条件
- and AND 语句,拼接 + AND 字段=值
- andNew AND 语句,拼接 + AND (字段=值) (新的括号)
- or OR 语句,拼接 + OR 字段=值
- orNew OR 语句,拼接 + OR (字段=值)
- eq 等于=
- allEq 基于 map 内容等于=
- ne 不等于<>
- gt 大于>
- ge 大于等于>=
- lt 小于<
- le 小于等于<=
- like 模糊查询 LIKE
- notLike 模糊查询 NOT LIKE
- in IN 查询
- notIn NOT IN 查询
- isNull NULL 值查询
- isNotNull IS NOT NULL
- groupBy 分组 GROUP BY
- having HAVING 关键词
- orderBy 排序 ORDER BY
- orderAsc ASC 排序 ORDER BY
- orderDesc DESC 排序 ORDER BY
- exists EXISTS 条件语句
- notExists NOT EXISTS 条件语句
- between BETWEEN 条件语句
- notBetween NOT BETWEEN 条件语句
- addFilter *拼接 SQL
- last 拼接在最后,例如:last(“LIMIT 1”)
示例:
- service的实现类:
@Override
public List<OaUser> getByList(Wrapper wrapper) {
return oaUserDao.selectList(wrapper);
}
@Override
public List<OaUser> getByListName(Wrapper wrapper) {
return oaUserDao.selectList(wrapper);
}
- 测试类
@Test
public void test01() {
// 查询user_account不为空的用户,并且密码不为空的用户,性别为男的
QueryWrapper<OaUser> wrapper = new QueryWrapper<>();
wrapper.isNotNull("user_account")
.isNotNull("user_password")
.eq("user_gender", 1);
oaUserService.getByList(wrapper).forEach(System.out::println);
}
@Test
public void test02(){
// 查询名字
QueryWrapper<OaUser> wrapper = new QueryWrapper<>();
wrapper.eq("user_account","aaa");
// 查询一个数据,出现多个结果使用List 或者 Map
List<OaUser> byListName = oaUserService.getByListName(wrapper);
System.out.println(byListName);
}