目录
二、SpringBoot整合MyBatis-Plus售书小铺项目
2.1.2.1 打开数据库连接并新建数据库market_tab
2.1.2.3 新建表2: book_publisher_tab
2.5 新建application.yml文件并配置jdbc和mybatis-plus
一、MyBatis-Plus
1.1 官网
1.2 简介
1.2.1 基本概念
Mybatis-Plus(简称MP)是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。MyBatis 增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。
1.2.2 框架结构
【示意图:mybatis-plus框架结构】
【注】本图片转载自官网,建议大家多看看官网
1.3 Mybatis-Plus添加依赖
【示例:官网添加依赖方法】
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
<!-- 官网当前最新版本 -->
</dependency>
</dependencies>
二、SpringBoot整合MyBatis-Plus售书小铺项目
2.1 数据库新建表
2.1.1 新建表准备
【示意图:网上电商销售图书需要信息】
【示意图:书籍信息】
- 本项目为网上电商销售图书项目,可参考当当网上购书商城,暂时先新建三张表,分别为书籍信息表、出版社表和书籍类型表,具体设计表信息如下所示:
2.1.2 新建表
2.1.2.1 打开数据库连接并新建数据库market_tab
【示意图】
2.1.2.2 新建表1: book_tab
【表1:book_tab】
2.1.2.3 新建表2: book_publisher_tab
【表2:book_publisher_tab】
2.1.2.4 新建表3: book_type_tab
【表3:book_type_tab】
2.2 创建新的Maven项目
【示意图】
2.3 在pom.xml文件中导入依赖
2.3.1 导入依赖
【示例: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.wnhz.market</groupId>
<artifactId>woniu-market</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- <packaging>jar</packaging> 默认是jar-->
<!-- 第三方引入包的版本说明 -->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--<project.druid.version>1.2.18</project.druid.version>-->
</properties>
<!-- 起步依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.14</version>
</parent>
<!-- 项目依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--排除某些配置
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>-->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<!--<version>${project.druid.version}</version>-->
<version>1.2.18</version>
</dependency>
<!-- mybatis-plus组件 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!--spring的单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 项目打包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.3.2 补充:为什么有的没有版本号?
【问】为什么有的没有版本号?
【答】因为在我们的起步依赖parent中自带有定义的版本号,可以通过ctrl点击进去看到
2.4 新建项目架构(包)
- 在com.wnhz.market下新建App.java文件,之后添加注解@SpringBootApplication,写入main方法,添加SpringApplication.run(App.class);
【示例:项目架构App】
package com.wnhz.market;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
}
}
2.5 新建application.yml文件并配置jdbc和mybatis-plus
- 在resources文件夹下新建config文件夹,之后新建application.yml文件,并添加配置
【示例:application.yml配置jdbc和mybatis-plus】
spring:
datasource:
druid:
url: jdbc:mysql://192.168.41.128:3306/market_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123
driver-class-name: com.mysql.cj.jdbc.Driver
# 注意192.168.41.128是自己的finalshell左上角地址,数据库名market_db及用户名和密码也要记得改
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.6 项目分层新建文件夹
【示意图:项目分层】
- 在项目文件夹com.wnhz.market下分层,新建entity,dao,service,controller文件夹
2.7 新建实体类entity
2.7.1 @TableName
- @TableName
- 描述:表名注解,标识实体类对应的表
- 使用位置:实体类
属性 |
类型 |
必须指定 |
默认值 |
描述 |
value |
String |
否 |
"" |
表名 |
schema |
String |
否 |
"" |
schema |
keepGlobalPrefix |
boolean |
否 |
false |
是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时) |
resultMap |
String |
否 |
"" |
xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定) |
autoResultMap |
boolean |
否 |
false |
是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入) |
excludeProperty |
String[] |
否 |
{} |
需要排除的属性名 @since 3.3.1 |
2.7.2 @TableId
- @TableId
- 描述:主键注解
- 使用位置:实体类主键字段
- IdType.AUTO,与mysql一致主键自增长
属性 |
类型 |
必须指定 |
默认值 |
描述 |
value |
String |
否 |
"" |
主键字段名 |
type |
Enum |
否 |
IdType.NONE |
指定主键类型 |
- dType
值 |
描述 |
AUTO |
数据库 ID 自增 |
NONE |
无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT |
insert 前自行 set 主键值 |
ASSIGN_ID |
分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) |
ASSIGN_UUID |
分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法) |
|
分布式全局唯一 ID 长整型类型(please use ASSIGN_ID) |
|
32 位 UUID 字符串(please use ASSIGN_UUID) |
|
分布式全局唯一 ID 字符串类型(please use ASSIGN_ID) |
2.7.3 @TableField
- @TableField
- 描述:字段注解(非主键)
2.7.4 示例建立实体类Book
- 根据[2.1.2]中新建的数据库market_db中的表book_tab在[2.6]建立的文件夹entity下新建相应的实体类Book
【示例:Book】
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Date;
@Data // set,get方法
@NoArgsConstructor // 无参构造方法
@AllArgsConstructor // 有参构造方法
@TableName("book_tab")
public class Book {
@TableId(value = "book_id", type = IdType.AUTO)
private Long id;
@TableField("book_title")
private String title;
@TableField("book_author")
private String author;
@TableField("book_isbn")
private String isbn;
@TableField("book_price")
private BigDecimal price;
@TableField("book_publication")
private Date publication;
@TableField("book_pages")
private Long pages;
@TableField("book_version")
private Integer version;
@TableField("book_image_url")
private String imageUrl;
@TableField("book_introduction")
private String introduction;
@TableField("book_store")
private Integer store;
@TableField("book_publisher")
private Long publisher;
@TableField("book_type")
private Long type;
@TableField("book_comment")
private String comment;
@TableField("book_create_time")
private Date createTime;
@TableField("book_update_time")
private Date updateTime;
@TableField("book_update_by")
private String updateBy;
}
2.7.5 补充
- @Data
- set,get方法
- @NoArgsConstructor
- 无参构造方法
- @AllArgsConstructor
- 有参构造方法
2.8 dao持久层定义CRUD接口
- Mapper CRUD 接口说明
- 通用 CRUD 封装BaseMapper接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器
- 泛型 T 为任意实体对象
- 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
- 对象 Wrapper 为 条件构造器
【示例:IBookDao】
package com.wnhz.market.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wnhz.market.entity.Book;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface IBookDao extends BaseMapper<Book> {
}
2.9 service业务层
2.9.1 service接口
【示例:IBookService添加方法】
package com.wnhz.market.service;
import com.wnhz.market.entity.Book;
public interface IBookService {
/**
* 添加
*
* @param book
*/
void addBook(Book book);
}
2.9.2 service接口实现
- 在IBookService文件中,鼠标放在public interface IBookService上面,按快捷键alt+enter,选择Implement Interface自动生成接口实现文件,注意是否要改名和文件存放位置
【示例:BookServiceImpl】
- 注意添加注解@Service
package com.wnhz.market.service.impl;
import com.wnhz.market.dao.IBookDao;
import com.wnhz.market.entity.Book;
import com.wnhz.market.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl implements IBookService {
@Autowired
IBookDao bookDao;
@Override
public void addBook(Book book) {
bookDao.insert(book);
}
}
2.10 单元测试-junit
- 在BookServiceImpl使用快捷键alt+insert,再选择test,注意选择JUnit4自动生成单元测试文件,注意添加注解@SpringBootTest、@RunWith(SpringJUnit4ClassRunner.class)、@Test
【示例:BookServiceImplTest】
package com.wnhz.market.service.impl;
import com.wnhz.market.entity.Book;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.math.BigDecimal;
import java.util.Date;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class BookServiceImplTest {
@Autowired
BookServiceImpl bookService;
@Test
public void addBook() {
Book book = new Book();
book.setTitle("普罗米修斯");
book.setAuthor("东野圭吾");
book.setIsbn("1806348888");
book.setPrice(new BigDecimal(33.8));
book.setPublication(new Date());
book.setImageUrl("封面图片地址");
book.setComment("受益颇多");
book.setIntroduction("小说经典之作");
book.setPages(new Long(188));
book.setStore(999);
book.setCreateTime(new Date());
book.setUpdateTime(new Date());
book.setUpdateBy("作者");
book.setType(new Long(1));
book.setVersion(3);
book.setPublisher(new Long(1));
bookService.addBook(book);
}
}