第一步:模块创建
①创建springboot项目,勾选spring Web模板+MySQL Driver驱动
②在pom.xml文件中手动添加MyBatis-Plus 、Druid (插件的左边可以去官网查询)、lombok(具体左右在下文会介绍)
<!-- 手动添加mybatis-plus-->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!--手动添加德鲁伊-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!--手动加入Lombook-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
③将application.properties文件修改为 application.yml文件
第二步:书写代码
①application.yml配置文件:
#第二种方法:Druid专用配置 推荐
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/user_db?serverTimezone=GMT
username: root
password: admin
#开启MP运行日志
mybatis-plus:
configuration:
# 标准输出 打印到控制台上 以后我们就不用sout输出了, 这个东西会帮我们输出
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
②实体类:
其中@Data的注释来源于lombok,一个java的类库,提供了一组注解,简化了POJO实体类开发
但是需要在配置文件中导入坐标
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
//@Getter所有的get方法
//@Setter所有的set方法
//@NoArgsConstructor 无参构造
//@AllArgsConstructor//全部的构造
@Data //get+set+toString+hashcode+equals 但是没有构造方法
@TableName(value = "t_book")
public class Book {
// 这里的属性名 要和数据库表中的属性名一致,要不然最终的查询结果是null
// 将数据库中的结果对此变量名进行注入
@TableId(value="id",type = IdType.AUTO) //代表自增算法
@TableField(value = "id")
private int id;
@TableField(value = "bookName")
private String bookName;
@TableField(value = "statue")
private String statue;
}
③数据库SQL映射需添加@Mapper被容器识别
定义数据层接口与映射配置
@Mapper
public interface BookDao extends BaseMapper<Book> {//指定泛型才能知道操作谁
}
④定义拦截器 (在下文的代码中会使用到),可以在一个类中加入多个拦截器,我们这里加入的是分页的拦截器,只有加入分页的拦截器之后,我们的分页才能最终成功
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//拦截器
@Configuration //第一步:配置类 交给Spring管理 确保在启动类的包或子包下,才能被扫描到
public class NPCConfig {
// 第二步:做对应Bean
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
// 第三步:创建拦截器(这只是一个壳子)
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 第四步:添加内部拦截器 (分页的)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
// 可以添加多个内部拦截器
return interceptor;
}
}
⑤测试代码:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.company.dao.BookDao;
import com.company.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.management.Query;
@SpringBootTest
class Springboot08SsmpApplicationTests {
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
// System.out.println(bookDao.selectById(10086));
bookDao.selectById(10086);//这个能在控制台输出是因为我们开启了MP运行日志
}
@Test
void testSave(){
Book book = new Book();
// 这里采用的是主键自增,我们不用手动给主键赋值(数据库默认的是雪花算法)
// book.setId(10092);
book.setBookName("信息技术");
book.setStatue("优秀");
bookDao.insert(book);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(10086);
book.setBookName("zhanghangzhang");
bookDao.updateById(book);
}
@Test
void testDelete(){
bookDao.deleteById(10093);//通过id删除
}
@Test
void testGetAll(){
System.out.println( bookDao.selectList(null)); //给null查全部
}
@Test //分页 单纯运行这个是不行的,需要写一个配置类(拦截器)
void testGetPage(){
// 接口不能new 只能new实现类
IPage page = new Page(1,5); //获取第一页的数据,显示五条
// IPage对象中封装了分页操作中的所有数据:
// 数据/当前页码值/每页数据总量/最大页码值/数据总量
// IPage page = new Page(2,5); 获取第二页的数据,显示五条
bookDao.selectPage(page,null);
}
@Test //按条件查询
void testGetBy(){
QueryWrapper<Book> qw = new QueryWrapper<>();//如果不传泛型,它会自己从查询的那个地方取
qw.like("bookName","zhang"); //模糊查询 对bookName进行模糊查询 %zhang%
bookDao.selectList(qw);
}
@Test
void testGetBy2(){
String val="zhangzhang";
//上面testGetBy()方法中,查询的字段名很容易写错,但是我们采用lambda表达式之后,如果写错了就会报错(有语法检查)
LambdaQueryWrapper<Book> qw = new LambdaQueryWrapper<>();
qw.like(val!=null,Book::getBookName,val); //我们要判定val不是空,才能进行查询,要不回来查询的结果和我们要的结果不一致
// 在like方法中就可以判断,加个参数 val!=null 就不用写if了
bookDao.selectList(qw);
}
}