SpringBoot整合Mybatis-plus(基础)

什么是Mybatis-plus(简介)

  •     MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率.
  •    跟之前整合MyBatis相比,你会发现我们不需要在DAO接口中编写方法和SQL语句,只需要继承 BaseMapper接口即可,整体来说简化很多。
  • mybatis-plus的特性是:1. 无侵入:只做增强不做改变,不会对现有工程产生影响 2.  强大的 CRUD 操作:内置通用 Mapper ,少量配置即可实现单表 CRUD 操作 3. 支持 Lambda :编写查询条件无需担心字段写错 4. 支持主键自动生成5.  内置分页插件········
  •   关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网

关于Springboot整合Mybatis-plus 的案例

1.创建数据库mybatisplus_db

create table movie(
id INT(10) PRIMARY key auto_increment,
name varchar(32) not null,
author varchar(32) not null,
type varchar(32) not null ,
time date not null
);
insert into movie values(1,'封神','乌尔善','神话、动作','2023-7-22');
insert into movie values(2,'孤注一掷','申奥','剧情、犯罪','2023-08-08');
insert into movie values(3,'第八个嫌疑人','李子俊','悬疑、犯罪','2023-09-09);
insert into movie values(4,'学爸','苏亮','剧情、喜剧','2023-08-08');

2.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.15</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot_mybatis_plus_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_mybatis_plus_demo</name>
    <description>springboot_mybatis_plus_demo</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>

<!--        包含spirng Mvc ,tomcat的包包含requestMapping restController 等注解-->
        <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        mybatis-plus核心库-->
        <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-boot-starter</artifactId>
              <version>3.1.0</version>
        </dependency>
<!--        druid 依赖-->
        <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid</artifactId>
             <version>1.1.16</version>
       </dependency>
<!--        mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
<!--  jdbc升级版       除了基础的数据库连接功能,还额外提供了 CrudRepository-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
<!--   jdbc基础版     提供基础的 Spring 抽象类,包括 DataSource 等,帮助你在 Spring 框架下链接数据库。同时支持使用 JdbcTemplate 连接数据库、执行 SQL 语句。-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
<!--        lombok是开源的代码生成库,通过简单注解方式可以简化java中的模版化代码,是一款非常实用的小工具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.添加MP的相关配置信息

resources 默认生成的是 properties 配置文件,可以将其替换成 yml 文件,并在文件中配置数据库
连接的相关信息 : application.yml
spring:
   datasource:
         type: com.alibaba.druid.pool.DruidDataSource
         driver-class-name: com.mysql.cj.jdbc.Driver
         url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
         username: root
         password: 1234

4.根据数据库表创建实体类

@Data
@TableName("movie")
public class Movie {
    /**
     * 序号
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * 电影名称
     */
    @TableField(value = "name")
    private String name;
    /**
     * 导演
     */
    @TableField(value = "author")
    private String author;
    /**
     * 电影类型
     */
    @TableField(value = "type")
    private String type;
    /**
     * 上映时间
     */
    @TableField(value = "time")
    private Date time;

}

 关于Lombok的了解和学习

代码写到这,我们会发现DAO接口类的编写现在变成最简单的了,里面什么都不用写。 

看看模型类的编写都需要哪些内容:
  • 私有属性
  • setter...getter...方法
  • toString方法
  • 构造函数
虽然这些内容不难,同时也都是通过 IDEA 工具生成的,但是过程还是必须得走一遍,那么对于模型类 的编写有没有什么优化方法?就是的引入Lombok
Lombok的概念:

Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发。

Lombokd的使用:
  • 添加lombok依赖
  • 安装Lombok的插件
  • 模型类上添加注解
    @Data:是个组合注解,包含以下的注解的功能
    1. @Setter:为模型类的属性提供setter方法
    2. @Getter:为模型类的属性提供getter方法
    3. @ToString:为模型类的属性提供toString方法
    4. @EqualsAndHashCode:为模型类的属性提供equalshashcode方法
    @NoArgsConstructor: 提供一个无参构造函数
    @AllArgsConstructor: 提供一个包含所有参数的构造函数 (更多的使用就要再去查找资料了)
关于映射匹配兼容性的学习 
问题1:表字段与编码属性设计不同步:
当表的列名和模型类的属性名发生不一致,就会导致数据封装不到模型对象,这是需要其中一 方做出修改,但是如果前提是两边都不能改又该如何解决?
MP 给我们提供了一个注解 @TableField , 使用该注解可以实现模型类属性名和表的列名之间的映射关系
问题2:编码中添加了数据库中未定义的属性
当模型类中多了一个数据库表不存在的字段,就会导致生成的 sql 语句中在 select 的时候查询了数据
库不存在的字段,程序运行就会报错,错误信息为 :
Unknown column ' 多出来的字段名称 ' in 'field list'
使用@TableField 注解,它有一个属性叫 exist ,设置该字段是否在数据库表
中存在,如果设置为 false 则不存在,生成 sql 语句查询的时候,就不会再查询该字段了。
问题3:采用默认查询开放了更多的字段查看权限
查询表中所有的列的数据,就可能把一些敏感数据查询到返回给前端,这个时候我们就需要限制哪些 字段默认不要进行查询。
解决方案是@TableField注解的一个属性叫 select ,该属性设置默认是否需要查询该字段的值,true( 默认值 ) 表示默认查询该字段, false 表示默认不查询该字段
问题4:表名与编码开发设计不同步
该问题主要是表的名称和模型类的名称不一致,导致查询失败,这个时候通常会报如下错误信息
Table 'databaseName.tableNaem' doesn't exist , 翻译过来就是数据库中的表不存在。
解决方案是使用 MP 提供的另外一个注解 @TableName 来设置表与模型类之间的对应关系。
id生成策略控制的学习
  • 设置生成策略为AUTO (常用)AUTO的作用是使用数据库ID自增,在使用该策略的时候一定要确保对应的数据库表设置了ID主键自增,否则无效
  • NONE: 不设置id生成策略
  • INPUT:用户手工输入id
  • ASSIGN_ID:雪花算法生成id(可兼容数值型与字符串型)
  • ASSIGN_UUID:UUID生成算法作为id生成策略

5.编写Mybatis_plus_config

@Configuration
public class Mybatis_Plus_Config {
    /**
     * mybatis-plus SQL执行效率插件
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();

    }
    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

6.SpringBoot启动类

@SpringBootApplication
@MapperScan(basePackages = "com/example/springboot_mybatis_plus_demo/dao")
public class SpringbootMybatisPlusDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisPlusDemoApplication.class, args);
    }

}

7.dao层

@Mapper
public interface MovieDao extends BaseMapper<Movie> {
}

8.service层

public interface MovieDaoService extends IService<Movie> {
}

9.service实现类层 

@Service
public class MovieDaoServiceImpl extends ServiceImpl<MovieDao, Movie> implements MovieDaoService {
}

10.controller控制层 

@RestController
@RequestMapping("/movie")
public class MovieController {
    @Autowired
    private MovieDaoService movieDaoService;

    /**
     * 根据id获取用户信息
     *   default T getById(Serializable id) {
     *         return this.getBaseMapper().selectById(id);
     *     }
     * @RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
     * @param id
     * @return
     */
    @RequestMapping("/getInfo")
    public Movie getInfo(@RequestParam Integer id){
        Movie movie = movieDaoService.getById(id);
        return movie;
    }

    /**
     * 获取全部信息
     * default List<T> list() {
     *         return this.list(Wrappers.emptyWrapper());
     *     }
     * @return
     */
    @RequestMapping("/getList")
    public List<Movie> getList(){
        List<Movie> movieList=movieDaoService.list();
        return movieList;
    }

    /**
     * 分页查询全部数据
     *  default IPage<T> page(IPage<T> page) {
     *         return this.page(page, Wrappers.emptyWrapper());
     *     }
     * @return
     */
    @RequestMapping("/getInfoListPage")
    public IPage<Movie> getInfoListPage(){
        //需要在Config配置类中配置分页插件
        IPage<Movie> page = new Page<>();
        page.setCurrent(5); //当前页
        page.setSize(1);    //每页条数
        page = movieDaoService.page(page);
        return page;
    }

    /**
     * 根据指定字段查询信息集合
     *Collection<T> listByMap(Map<String, Object> columnMap);
     * @return
     */

    @RequestMapping("/getListMap")
    public Collection<Movie> getListMap(){
        Map<String,Object> map = new HashMap<>();
        //kay是字段名 value是字段值
        map.put("author","乌尔善");
        Collection<Movie> userInfoEntityList = movieDaoService.listByMap(map);
        return userInfoEntityList;
    }

    /**
     * 新增一个电影信息
     * boolean save(T entity);
     */
    @RequestMapping("/saveInfo")
    public void saveInfo(){
        Movie movie = new Movie();
        movie.setId(5);
        movie.setName("敢死队4");
        movie.setAuthor("斯沃特·沃");
        movie.setType("动作、冒险");
        movie.setTime(new Date(System.currentTimeMillis()));
        movieDaoService.save( movie);
    }

    /**
     * 批量添加电影信息
     * default boolean saveBatch(Collection<T> entityList) {
     *         return this.saveBatch(entityList, 1000);
     *     }
     */
    @RequestMapping("/saveInfoList")
    public void saveInfoList(){
        //创建对象
         Movie yk = new Movie();
         yk.setId(6);
        yk.setName("假面骑士");
        yk.setAuthor("骑士导演");
        yk.setType("奇幻、冒险");
        yk.setTime(new Date(System.currentTimeMillis()));
        Movie ty= new Movie();
        ty.setId(7);
        ty.setName("奥特曼");
        ty.setAuthor("圆古");
        ty.setType("外星、战斗");
        ty.setTime(new Date(System.currentTimeMillis()));
        //批量保存
        List<Movie> list =new ArrayList<>();
        list.add(yk);
        list.add(ty);
        movieDaoService.saveBatch(list);
    }
    /**
     * 更新用户信息
     * boolean updateById(T entity);
     */
    @RequestMapping("/updateInfo")
    public void updateInfo(){
        //根据实体中的ID去更新,其他字段如果值为null则不会更新该字段,参考yml配置文件
        Movie movie = new Movie();
        movie.setId(12);
        movie.setName("活佛济公");
       movie.setAuthor("大师");
       movie.setType("喜剧,搞笑");
       movie.setTime(new Date(System.currentTimeMillis()));
       movieDaoService.updateById(movie);
    }

    /**
     * 根据ID删除电影信息
     *  boolean removeById(Serializable id);
     */
    @RequestMapping("/deleteInfo")
    public void deleteInfo(Integer Id){
        movieDaoService.removeById(Id);
    }
 
    /**
     * 根据指定字段删除电影信息
     *  boolean removeByMap(Map<String, Object> columnMap);
     */
    @RequestMapping("/deleteInfoMap")
    public void deleteInfoMap(){
        //kay是字段名 value是字段值
        Map<String,Object> map = new HashMap<>();
        map.put("name","学爸");
        map.put("type","剧情、喜剧");
        movieDaoService.removeByMap(map);
    }

}

11.结果展示

1.根据id获取电影信息

2.获取全部信息

3.根据指定字段查询信息集合

4.分页查询全部数据

5. 新增一个电影信息

 

 6.批量添加电影信息

7. 更新电影信息

 8.删除一条电影信息

 

 

 结语:

今天就到这,关于分页查询和条件查询构建,了解Mybatis-plus的代码生成器就在下一个补充吧

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值