栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis系列之——整合Mybatis-Plus

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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)创建工程,导入依赖
 
 
    com.baomidou 
    mybatis-plus 
    3.1.1 


 
    mysql 
    mysql-connector-java 
    8.0.23

 
 
    com.alibaba 
    druid 
    1.0.11 
 
 
 
    org.projectlombok 
    lombok 
    true 
    1.18.4 
 
 
    junit 
    junit 
    4.12 
 
 
    org.slf4j 
    slf4j-log4j12 
    1.6.4 

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{
    
}
(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 list = userMapper.selectList(null);
        for (User user : list) { 
            System.out.println(user);
        } 
    }
2.3、Spring + Mybatis + MP

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

(1)创建子Module
 
     
        org.springframework 
        spring-webmvc 
        ${spring.version} 
     
     
        org.springframework 
        spring-jdbc 
        ${spring.version} 
     
    
        org.springframework
        spring-test 
        ${spring.version}
     

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
 

    
     
    
     
         
        
        
        
         
         
     
    
     
    
         
    
    
    
     
         
    

(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{
    
}
(4)测试
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:applicationContext.xml") 
public class TestSpringMP {
    
    @Autowired 
    private UserMapper userMapper; 
    
    @Test 
    public void testSelectList(){ 
        List 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)导入依赖
 
    org.springframework.boot
    spring-boot-starter
     
        
            org.springframework.boot
            spring-boot-starter-logging 
         
     
 

    org.springframework.boot 
    spring-boot-starter-test
    test 


 
 
    org.projectlombok
    lombok 
    true


 
    com.baomidou
    mybatis-plus-boot-starter 
    3.1.1

 

    mysql
    mysql-connector-java 
    5.1.47

 
    org.slf4j
    slf4j-log4j12

编写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 {

}

启动类

@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 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 lqw = new LambdaQueryWrapper();
    lqw.like(Book::getName,"Spring");
    bookDao.selectPage(page,lqw);
}
@Test
void testGetByCondition(){
    QueryWrapper qw = new QueryWrapper();
    qw.like("name","Spring");
    bookDao.selectList(qw);
}
  • 支持动态拼写查询条件
@Test
void testGetByCondition(){
    String name = "Spring";
    IPage page = new Page(1,10);
    LambdaQueryWrapper lqw = new LambdaQueryWrapper();
    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 getAll();
    IPage 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 getAll() {
    	return bookDao.selectList(null);
    }
    
    public IPage getByPage(int currentPage, int pageSize) {
    	IPage page = new Page(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)快速开发Service

2 . 使用通用实现类(ServiceImpl)快速开发ServiceImpl

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

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

  • 快速开发方案

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

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

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

  • 接口定义

  • 实现类
@Service
public class BookServiceImpl2 extends ServiceImpl implements IBookService { 

}
  • 实现类追加功能
@Service
public class BookServiceImpl2 extends ServiceImpl 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);
    } 
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531384.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号