聲明
這只是一個基本springboot整合mybatis-plus3.0-beta的例子,包含springboot搭建、整合mybatis-plus3.0-beta,以及遇到的坑。
springboot
關於sprintboot的介紹太多了,用我的話概述就是快速構建項目,搭建常規SSM你可能需要30分鐘及以上,用springboot你只要5分鐘。
mybatis-plus作用
mybatis-plus3.0-beta可以提供通用dao層、通用service層、分頁功能,並提供代碼生成器。單表可以快速生成後臺mapper、service、serviceImpl、空的controller類。
搭建springboot項目
我用的是eclispe,也沒有裝插件,所以通用這個網址生成springboot項目。springboot嚮導。
點擊Switch back to the simple version.
勾選web,然後下載該項目。
下載完成後解壓,通過import-import-maven-exist maven projects導入
導入完成後目錄結構如下:
創建目錄,創建TestController,用於測試SpringMVC是否成功。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("test")
public String test() {
return "Hello springboot!";
}
}
啓動項目:打開ZyApplication.java類,右鍵Run as-java Application,出現Started ZyApplication in 3.508 seconds (JVM running for 3.964)表示成功。當然項目不一樣名稱就不一樣,不必糾結。
打開瀏覽器:http://localhost:8080/test,成功訪問。
這裏你會發現和以往訪問不一樣,因爲不用輸入項目名,怎麼使用http://ip:port/projectName方式訪問呢?
帶項目名訪問
將application.properties修改成application.yml,當然你用properties也可以,這裏我使用yml文件。內容如下:
server:
servlet:
context-path: /springboot
重啓,再次訪問:http://localhost:8080/springboot/test,訪問成功。
那麼問題來了,每次改重啓好麻煩,能熱部署嗎?能。
熱部署支持
打開pom.xml文件,添加熱部署支持
<!-- 熱部署支持. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
打開application.yml,添加熱部署配置
spring:
devtools:
restart:
enabled: true
再次重啓,重啓完你再修改java文件你會發現項目會自動部署而不用重啓。
使其支持jsp
打開pom.xml,添加相關jar包
打開application.yml,添加jsp相關配置,並創建相關目錄及test.jsp。
修改TestController爲如下內容,使其跳到對應的test.jsp,並在test.jsp中取出test的值顯示。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("test")
public String test(Model model) {
model.addAttribute("test", "jsp測試");
return "contest/test";
}
}
創建test.jsp,路徑如下方圖片所示。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
</head>
<body>
${test}
</body>
</html>
打開瀏覽器,訪問http://localhost:8080/springboot/test,成功顯示。(如果這裏提示404,請手動重新啓動即可)
加入mybatis
創建數據庫springboot,執行下面的sql語句
DROP TABLE IF EXISTS `sys_admin`;
CREATE TABLE `sys_admin` (
`id` varchar(64) NOT NULL COMMENT 'PK',
`username` varchar(50) NOT NULL COMMENT '用戶名',
`password` varchar(64) NOT NULL COMMENT '密碼',
`status` int(1) NOT NULL COMMENT '狀態',
`salt` varchar(64) NOT NULL COMMENT '加密字符',
`head_img` text COMMENT '頭像',
`create_time` datetime NOT NULL COMMENT '創建時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `sys_admin` */
insert into `sys_admin`(`id`,`username`,`password`,`status`,`salt`,`head_img`,`create_time`) values
('1','root','root',1,'1',NULL,'2018-07-17 15:18:56');
打開pom.xml,添加mybatis和mysql的jar包,如下內容
<!-- springboot mybatis -->
<!-- 該包是mybatis爲springboot提供的包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mysql -->
<!-- mysql這個包不用寫版本,springboot會自動查找 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
完整的pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.houpu</groupId>
<artifactId>zy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>zy</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- mvc支持. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- test. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 熱部署支持. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- tomcat的支持.-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- 支持jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- springboot mybatis -->
<!-- 該包是mybatis爲springboot提供的包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mysql -->
<!-- mysql這個包不用寫版本,springboot會自動查找 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
創建下面文件,各文件所在位置如下:
SysAdminMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.houpu.zy.module.contest.mapper.SysAdminMapper">
<resultMap id="BaseResultMap" type="com.houpu.zy.module.contest.entity.SysAdmin">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="password" property="password" />
<result column="status" property="status" />
<result column="salt" property="salt" />
<result column="head_img" property="headImg" />
<result column="create_time" property="createTime" />
</resultMap>
<select id="selectSysAdmin" resultMap="BaseResultMap">
select * from sys_admin
</select>
</mapper>
SysAdminMapper.java
package com.houpu.zy.module.contest.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.houpu.zy.module.contest.entity.SysAdmin;
@Mapper
public interface SysAdminMapper {
/**
* 查詢所有sysAdmin記錄
* @return
*/
List<SysAdmin> selectSysAdmin();
}
ISysAdminService.java
package com.houpu.zy.module.contest.service;
import java.util.List;
import com.houpu.zy.module.contest.entity.SysAdmin;
public interface ISysAdminService {
/**
* 查詢所有sysAdmin記錄
* @return
*/
List<SysAdmin> selectSysAdmin();
}
SysAdminServiceImpl.java
package com.houpu.zy.module.contest.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.houpu.zy.module.contest.entity.SysAdmin;
import com.houpu.zy.module.contest.mapper.SysAdminMapper;
import com.houpu.zy.module.contest.service.ISysAdminService;
@Service
public class SysAdminServiceImpl implements ISysAdminService {
@Autowired
private SysAdminMapper sysAdminMapper;
@Override
public List<SysAdmin> selectSysAdmin() {
return sysAdminMapper.selectSysAdmin();
}
}
SysAdmin.java
package com.houpu.zy.module.contest.entity;
import java.io.Serializable;
/**
*
* @author huahao
* @since 2018-07-17
*/
public class SysAdmin implements Serializable {
private static final long serialVersionUID = 1L;
/**
* PK
*/
private String id;
/**
* 用戶名
*/
private String username;
/**
* 密碼
*/
private String password;
/**
* 狀態
*/
private Integer status;
/**
* 加密字符
*/
private String salt;
/**
* 頭像
*/
private String headImg;
/**
* 創建時間
*/
private String createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public String getHeadImg() {
return headImg;
}
public void setHeadImg(String headImg) {
this.headImg = headImg;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "SysAdmin{" +
", id=" + id +
", username=" + username +
", password=" + password +
", status=" + status +
", salt=" + salt +
", headImg=" + headImg +
", createTime=" + createTime +
"}";
}
}
TestController.java
package com.houpu.zy.module.contest.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.houpu.zy.module.contest.entity.SysAdmin;
import com.houpu.zy.module.contest.service.ISysAdminService;
@Controller
public class TestController {
@Autowired
private ISysAdminService sysAdminService;
@RequestMapping("test")
public String test(Model model) {
model.addAttribute("test", "jsp測試");
return "contest/test";
}
@RequestMapping("user")
public String user(Model model) {
List<SysAdmin> SysAdminList = sysAdminService.selectSysAdmin();
model.addAttribute("SysAdminList", SysAdminList);
return "contest/user";
}
}
打開application.yml,添加數據庫配置:
datasource:
name: mydb
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/springboot
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
minIdle: 1
maxActive: 2
initialSize: 1
timeBetweenEvictionRunsMillis: 3000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 'ZTM' FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
mybatis:
typeAliasesPackage: com.houpu.zy.module.contest.entity
mapperLocations: classpath:mappers/**/*.xml
完整的application.yml如下
server:
servlet:
context-path: /springboot
spring:
devtools:
restart:
enabled: true
exclude: /views/**
mvc:
view:
prefix: /views/module/
suffix: .jsp
datasource:
name: mydb
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/springboot
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
minIdle: 1
maxActive: 2
initialSize: 1
timeBetweenEvictionRunsMillis: 3000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 'ZTM' FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
mybatis:
typeAliasesPackage: com.houpu.zy.module.contest.entity
mapperLocations: classpath:mappers/**/*.xml
user.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
</head>
<body>
<table>
<c:forEach items="${SysAdminList}" var="user">
<tr>
<td>${user.username }</td>
<td>${user.status }</td>
<td>${user.password }</td>
<td>${user.salt }</td>
<td>${user.headImg }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
至此已經集成mybatis,並編寫了一個例子。打開瀏覽器訪問:http://localhost:8080/springboot/user
結果如下:
以上項目代碼可從這裏下載:
鏈接: https://pan.baidu.com/s/10UBxUM-bufTUDwnhvApOmw 密碼: eg5d
使用mybatis-plus重構項目
- 刪除文件service、serviceImpl、mapper.java、mapper.xml、entity。
- 將pom中的mybatis包改成mybatis-plus的包
- 去掉application.yml文件中mybatis的配置(不去也不影響),加入mybatis-plus配置。
- 新增CodeGeneration.java(從mybatis-plus官網有這個類)
- 運行CodeGeneration.java並將生成的文件放入項目中
- 默認的dao層接口文件中並沒有@mapper註解,這裏有2種方式,第一種是在每個*mapper.java中加入@mapper註解,第二種是寫個config類來掃描mapper.java,上面集成mybatis時你們看到我使用的是第一種,這裏我推薦使用第二種,這裏生成的代碼不需要改動就能用了。
- 新增步驟6說的第二種配置類:MybatisPlusConfig.java
- 編寫controller代碼,測試通過。
step1、刪除文件service、serviceImpl、mapper.java、mapper.xml、entity等文件
這個沒啥好說的,跳過了。
step2、將pom中的mybatis包改成mybatis-plus的包
將原來的mybatis依賴的jar包刪除掉,即在pom.xml中刪掉下面內容
<!-- springboot mybatis -->
<!-- 該包是mybatis爲springboot提供的包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
在末尾加上
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0-beta</version>
</dependency>
step3、去掉application.yml文件中mybatis的配置(不去也不影響),加入mybatis-plus配置
在application.yml文件末尾加上以下內容:
#mybatis-plus
mybatis-plus:
mapper-locations: classpath:mappers/**/*.xml
#實體掃描,多個package用逗號或者分號分隔
typeAliasesPackage: com.houpu.zy.module.contest.entity
global-config:
db-config:
#刷新mapper 調試神器
#主鍵類型 0:"數據庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID";
id-type: 3
#字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
field-strategy: not_empty
#駝峯下劃線轉換
column-underline: true
#數據庫大寫下劃線轉換
#capital-mode: true
#邏輯刪除配置
logic-delete-value: 0
logic-not-delete-value: 1
db-type: mysql
#自定義填充策略接口實現
#meta-object-handler: com.baomidou.springboot.xxx
#自定義SQL注入器
#sql-injector: com.baomidou.springboot.xxx
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
##logging
logging:
level: debug
step4、新增CodeGeneration.java(從mybatis-plus官網有這個類)
下面生成的文件路徑請自行修改
package com.houpu.zy;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
public class CodeGeneration {
/**
*
* @Title: main
* @Description: 生成
* @param args
*/
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("C:\\Users\\huahao\\Desktop\\新建文件夾");
gc.setFileOverride(true);
gc.setActiveRecord(false);// 不需要ActiveRecord特性的請改爲false
gc.setEnableCache(false);// XML 二級緩存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(false);// XML columList
gc.setAuthor("huahao");// 作者
// 自定義文件命名,注意 %s 會自動填充表實體屬性!
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
mpg.setGlobalConfig(gc);
// 數據源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
dsc.setUrl("jdbc:mysql://127.0.0.1:3306/springboot");
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setTablePrefix(new String[] { "" });// 此處可以修改爲您的表前綴
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategy.setInclude(new String[] { "sys_admin" }); // 需要生成的表
strategy.setSuperServiceClass(null);
strategy.setSuperServiceImplClass(null);
strategy.setSuperMapperClass(null);
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.houpu.zy.module.contest");
pc.setController("web");
pc.setService("service");
pc.setServiceImpl("service.impl");
pc.setMapper("mapper");
pc.setEntity("entity");
pc.setXml("xml");
mpg.setPackageInfo(pc);
// 執行生成
mpg.execute();
}
}
step5、step6跳過不講,直接看step7生成的類
在com.houpu.zy.module.contest目錄下新建config目錄。
然後在config目錄下新建如下類:
package com.houpu.zy.module.contest.config;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
@Configuration
//@MapperScan("com.houpu.zy.module.*.mapper*")//這個註解,作用相當於下面的@Bean MapperScannerConfigurer,2者配置1份即可
public class MybatisPlusConfig {
/**
* mybatis-plus分頁插件<br>
* 文檔:http://mp.baomidou.com<br>
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* 相當於頂部的:
* {@code @MapperScan("com.houpu.springboot.module.*.mapper*")}
* 這裏可以擴展,比如使用配置文件來配置掃描Mapper的路徑
*/
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
scannerConfigurer.setBasePackage("com.houpu.zy.module.*.mapper*");
return scannerConfigurer;
}
}
step8、編寫controller代碼,測試通過。
修改SysAdminController.java內容如下:
package com.houpu.zy.module.contest.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.houpu.zy.module.contest.entity.SysAdmin;
import com.houpu.zy.module.contest.service.SysAdminService;
/**
* <p>
* 前端控制器
* </p>
*
* @author huahao
* @since 2018-07-18
*/
@Controller
@RequestMapping("/sysAdmin")
public class SysAdminController {
@Autowired
private SysAdminService sysAdminService;
@RequestMapping("user")
public String user(Model model) {
Wrapper<SysAdmin> wrapper = new QueryWrapper<SysAdmin>();
List<SysAdmin> SysAdminList = sysAdminService.selectList(wrapper);
model.addAttribute("SysAdminList", SysAdminList);
return "contest/user";
}
}
啓動項目,瀏覽器訪問:http://localhost:8080/springboot/sysAdmin/user,成功顯示。
至此,springboot集成mybatis-plus完成。
基於mybatis-plus的項目代碼在下方網盤
鏈接: https://pan.baidu.com/s/1MTrqZm-H30f1S6H5K9gdsg 密碼: ttw5
總結
全文共講述了3個階段的變化
- springboot
- springboot+mybatis
- springboot+mybatis-plus
其中,到第二階段已經是ssm框架都集成了.
第三階段中mybatis-plus已經包含mybatis的包,並擴展了通用dao、通用service、分頁、代碼生成器。
全文較長,但是是從第一步一點點增加上來的,大家可以看到每次新增的配置或代碼是做什麼用的,網上大多數教程都是貼代碼或者貼部分代碼,導致繞每多彎路,相信我這個教程還算是不錯的。
最後,我本人也是在學習springboot、springcloud中,畢竟早就已經到了分佈式時代了。
作者:默非默,QQ:3094759846