IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Mybatis系列之——整合Mybatis-Plus -> 正文阅读

[Java知识库]Mybatis系列之——整合Mybatis-Plus

Mybatis-Plus

1、了解Mybatis-Plus

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

  • 官网:https://mybatis.plus/ 或 https://mp.baomidou.com/
  • 文档地址:https://mybatis.plus/guide/源码地址:https://github.com/baomidou/mybatis-plus

1.1、特性

  1. 无侵入:制作增强不做改变,引入它不会对现有工程产生影响。
  2. 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作。
  3. 强大的CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。
  4. 支持Lambda形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错。
  5. 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库。
  6. 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一ID生成器-Sequence),可自由配置,完美解决主键问题。
  7. 支持XML热加载:Mapper对应的XML支持热加载,对于简单的CRUD操作,甚至可以无XML启动。
  8. 支持ActiveRecord模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作。
  9. 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )。
  10. 支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词。
  11. 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用。
  12. 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List查询。
  13. 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
  14. 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作。
  15. 内置Sql注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击。

2、快速开始

对于Mybatis整合MP有常常有三种用法:

  • Mybatis+MP
  • Spring+Mybatis+MP
  • Spring Boot+Mybatis+MP

2.1、准备工作

(1)创建数据库以及表

-- 创建数据库mp
DROP database IF EXISTS `mp`;
create database `mp` character set utf8 collate utf8_general_ci;
-- 创建测试表 
CREATE TABLE `tb_user` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `user_name` varchar(20) NOT NULL COMMENT '用户名', 
    `password` varchar(20) NOT NULL COMMENT '密码',
    `name` varchar(30) DEFAULT NULL COMMENT '姓名',
    `age` int(11) DEFAULT NULL COMMENT '年龄',
    `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- 插入测试数据 
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('1', 'zhangsan', '123456', '张三', '18', 'test1@itcast.cn'); 
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('2', 'lisi', '123456', '李四', '20', 'test2@itcast.cn'); 
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('3', 'wangwu', '123456', '王五', '28', 'test3@itcast.cn'); 
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('4', 'zhaoliu', '123456', '赵六', '21', 'test4@itcast.cn'); 
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('5', 'sunqi', '123456', '孙七', '24', 'test5@itcast.cn');

(2)创建工程,导入依赖

<!-- mybatis-plus插件依赖 --> 
<dependency> 
    <groupId>com.baomidou</groupId> 
    <artifactId>mybatis-plus</artifactId> 
    <version>3.1.1</version> 
</dependency>
<!-- MySql -->
<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>8.0.23</version>
</dependency>
<!-- 连接池 --> 
<dependency> 
    <groupId>com.alibaba</groupId> 
    <artifactId>druid</artifactId> 
    <version>1.0.11</version> 
</dependency> 
<!--lombok--> 
<dependency> 
    <groupId>org.projectlombok</groupId> 
    <artifactId>lombok</artifactId> 
    <optional>true</optional> 
    <version>1.18.4</version> 
</dependency> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.12</version> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.6.4</version> 
</dependency>

2.2、Mybatis+MP

(1)创建子Module

(2)编写User实体对象

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@TableName("tb_user") //指定数据库表名
public class User {
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;
}

(3)编写UserMapper接口,继承BaseMapper

public interface UserMapper extends BaseMapper<User>{
    
}

(4)使用MP中的MybatisSqlSessionFactoryBuilder进程构建

public class TestMybatisPlus { 
    @Test public void testUserList() throws Exception{ 
        String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); 
        //这里使用的是MP中的MybatisSqlSessionFactoryBuilder 
        SqlSessionFactory sqlSessionFactory = new MybatisSqlSessionFactoryBuilder().build(inputStream); 
        SqlSession sqlSession = sqlSessionFactory.openSession(); 
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
        // 可以调用BaseMapper中定义的方法 
        List<User> list = userMapper.selectList(null);
        for (User user : list) { 
            System.out.println(user);
        } 
    }

2.3、Spring + Mybatis + MP

引入了Spring框架,数据源、构建等工作就交给了Spring管理。

(1)创建子Module

<dependencies> 
    <dependency> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-webmvc</artifactId> 
        <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-jdbc</artifactId> 
        <version>${spring.version}</version> 
    </dependency> 
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId> 
        <version>${spring.version}</version>
    </dependency> 
</dependencies>
jdbc.driver=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false 
jdbc.username=root 
jdbc.password=admin

(2)编写applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    <context:property-placeholder location="classpath:*.properties"/> 
    <!-- 定义数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> 
        <property name="url" value="${jdbc.url}"/> 
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="maxActive" value="10"/> 
        <property name="minIdle" value="5"/> 
    </bean> 
    
    <!--这里使用MP提供的sqlSessionFactory,完成了Spring与MP的整合--> 
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/> 
    </bean>
    
    <!--扫描mapper接口,使用的依然是Mybatis原生的扫描器-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
        <property name="basePackage" value="com.spongebob.mp.simple.mapper"/> 
    </bean>
</beans>

(3)编写User对象以及UserMapper接口

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@TableName("tb_user") //指定数据库表名
public class User {
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;
}
public interface UserMapper extends BaseMapper<User>{
    
}

(4)测试

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:applicationContext.xml") 
public class TestSpringMP {
    
    @Autowired 
    private UserMapper userMapper; 
    
    @Test 
    public void testSelectList(){ 
        List<User> users = this.userMapper.selectList(null);
        for (User user : users) {
            System.out.println(user);
        } 
    }
}

2.4、SpringBoot + Mybatis + MP

使用SpringBoot将进一步的简化MP的整合,需要注意的是,由于使用SpringBoot需要继承parent,所以需要重新创建工程,并不是创建子Module。

(1)创建工程

(2)导入依赖

<dependency> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions> 
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId> 
        </exclusion> 
    </exclusions> 
</dependency> 
<dependency>
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope> 
</dependency>

<!--简化代码的工具包--> 
<dependency> 
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId> 
    <optional>true</optional>
</dependency>
<!--mybatis-plus的springboot支持-->
<dependency> 
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId> 
    <version>3.1.1</version>
</dependency>
<!--mysql驱动--> 
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.47</version>
</dependency>
<dependency> 
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>

编写application.properties

spring.application.name = itcast-mp-springboot 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

pojo

@Data 
@NoArgsConstructor
@AllArgsConstructor 
@TableName("tb_user") 
public class User {
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;
}

mapper

public interface UserMapper extends BaseMapper<User> {

}

启动类

@MapperScan("com.spongebob.mp.mapper") 
//设置mapper接口的扫描包 
@SpringBootApplication 
public class MyApplication {
    public static void main(String[] args) { 
        SpringApplication.run(MyApplication.class, args); 
    }
}

测试

@RunWith(SpringRunner.class) 
@SpringBootTest
public class UserMapperTest {
    
    @Autowired 
    private UserMapper userMapper;
    
    @Test
    public void testSelect() {
        List<User> userList = userMapper.selectList(null);
        for (User user : userList) {
            System.out.println(user);
        }
    } 
}

3、数据层开发

3.1、分页功能

1 . 使用IPage封装分页数据

2 . 分页操作依赖MyBatisPlus分页拦截器实现功能

3 . 借助MyBatisPlus日志查阅执行SQL语句

@Test
void testGetPage(){
    IPage page = new Page(1,5);
    bookDao.selectPage(page,null);
    
}
  • IPage对象中封装了分页操作中的所有数据

    • 数据
    • 当前页码值
    • 每页数据总量
    • 最大页码值
    • 数据总量
  • 分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现。

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor() {
        //1.定义Mp拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2.添加具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor; 
    } 
}
  • 为方便调试可以开启MyBatisPlus的日志
# 使用配置方式开启日志,设置日志输出方式为标准输出
mybatis-plus:
	configuration:
		log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.2、条件查询功能

1 . 使用QueryWrapper对象封装查询条件

2 . 推荐使用LambdaQueryWrapper对象

3 . 所有查询操作封装成方法调用

4 . 查询条件支持动态条件拼装

  • 使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用
@Test
void testGetByCondition(){
    IPage page = new Page(1,10);
    LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();
    lqw.like(Book::getName,"Spring");
    bookDao.selectPage(page,lqw);
}
@Test
void testGetByCondition(){
    QueryWrapper<Book> qw = new QueryWrapper<Book>();
    qw.like("name","Spring");
    bookDao.selectList(qw);
}
  • 支持动态拼写查询条件
@Test
void testGetByCondition(){
    String name = "Spring";
    IPage page = new Page(1,10);
    LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();
    lqw.like(Strings.isNotEmpty(name),Book::getName,"Spring");
    bookDao.selectPage(page,lqw);
}

4、业务层开发

4.1、自定义service接口

  • Service层接口定义与数据层接口定义具有较大区别,不要混用

    • selectByUserNameAndPassword(String username,String password); //数据层接口对应的名称
    • login(String username,String password); //业务层接口对应的名称
  • 接口定义

public interface BookService {
    boolean save(Book book);
    boolean delete(Integer id);
    boolean update(Book book);
    Book getById(Integer id);
    List<Book> getAll();
    IPage<Book> getByPage(int currentPage,int pageSize);
}
  • 实现类定义
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    
    public Boolean save(Book book) {
    	return bookDao.insert(book) > 0; 
    }
    
    public Boolean delete(Integer id) {
    	return bookDao.deleteById(id) > 0; 
    }
    
    public Boolean update(Book book) {
    	return bookDao.updateById(book) > 0; 
    } 
    
    public Book getById(Integer id) {
    	return bookDao.selectById(id);
    }
    
    public List<Book> getAll() {
    	return bookDao.selectList(null);
    }
    
    public IPage<Book> getByPage(int currentPage, int pageSize) {
    	IPage page = new Page<Book>(currentPage,pageSize);
    	return bookDao.selectPage(page,null);
    }
}
  • 测试类定义
@SpringBootTest
public class BookServiceTest {
    @Autowired
    private BookService bookService;
    
    @Test
    void testGetById(){
    	bookService.getById(9);
    }
    
    @Test
    void testGetAll(){
    	bookService.getAll();
    }
    
    @Test
    void testGetByPage(){
    	bookService.getByPage(1,5);
    }

}

4.2、通用Service接口

1 . 使用通用接口(ISerivce<T>)快速开发Service

2 . 使用通用实现类(ServiceImpl<M,T>)快速开发ServiceImpl

3 . 可以在通用接口基础上做功能重载或功能追加

4 . 注意重载时不要覆盖原始操作,避免原始提供的功能丢失

  • 快速开发方案

    • 使用MyBatisPlus提供有业务层通用接口(ISerivce<T>)与业务层通用实现类(ServiceImpl<M,T>

    • 在通用类基础上做功能重载或功能追加

    • 注意重载时不要覆盖原始操作,避免原始提供的功能丢失

在这里插入图片描述在这里插入图片描述

  • 接口定义

在这里插入图片描述

  • 实现类
@Service
public class BookServiceImpl2 extends ServiceImpl<BookDao,Book> implements IBookService { 

}
  • 实现类追加功能
@Service
public class BookServiceImpl2 extends ServiceImpl<BookDao,Book> implements IBookService {
    @Autowired
    private BookDao bookDao;
    
    public Boolean insert(Book book) {
    	return bookDao.insert(book) > 0; 
    }
    public Boolean modify(Book book) {
    	return bookDao.updateById(book) > 0; 
    }
    public Boolean delete(Integer id) {
    	return bookDao.deleteById(id) > 0; 
    }
    public Book get(Integer id) {
    	return bookDao.selectById(id);
    } 
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:37:37  更:2021-11-17 12:38:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:42:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码