zoukankan      html  css  js  c++  java
  • Mybatisplus入门教程

    环境搭建

    SpringBoot+Mybatis-Plus

    1. 引入pom依赖
    <?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">
        <parent>
            <artifactId>lagou-study</artifactId>
            <groupId>com.mmc</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>mybatis-plus</artifactId>
    
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>2.1.2.RELEASE</version>
                <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>
                <version>2.1.2.RELEASE</version>
                <scope>test</scope>
            </dependency>
    
            <!--简化代码的⼯具包-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.22</version>
            </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>8.0.13</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>2.0.0-alpha0</version>
            </dependency>
    
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.1.2.RELEASE</version>
                </plugin>
            </plugins>
        </build>
    </project>
    
    1. application.properties文件
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=0490218292
    
    1. log4j.properties
    log4j.rootLogger=DEBUG,A1
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n
    
    1. 编写实体类
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @TableName("user")
    public class User {
    
        private Integer id;
    
        private String name;
    }
    
    1. 编写Mapper
    public interface UserMapper extends BaseMapper<User> {
    }
    
    1. 测试
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class UserMapperTest {
    
        @Autowired
        private UserMapper userMapper;
    
    
        @Test
        public void testSelect(){
            List<User> users = userMapper.selectList(null);
            System.out.println(users);
        }
    }
    

    基本使用

    下面会根据如下要点讲解mybatis-plus的基本功能

    • 实体类注解
    • 分页
    • 基本配置
    • 性能分析插件、乐观锁等插件
    • 自动填充属性值
    • SQL注入器
    • 逻辑删除
    • MybatisX插件

    实体类注解

    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @TableName("user")
    public class User {
    
        //id类型子增长
        @TableId(type = IdType.AUTO)
        private Integer id;
    
        @TableField(value = "name")
        private String userName;
    
        private Integer age;
    
        //不查询该字段
        @TableField(select = false)
        private Date createTime;
    }
    

    分页插件

    配置:

    @Configuration
    @MapperScan("com.mmc.mybatisPlus.mapper") //设置mapper接⼝的扫描包
    public class MybatisPlusConfig {
    /**
    * 分⻚插件
    */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
    }
    

    测试代码:

     @Test
        public void testPage(){
            Page<User> page=new Page<>(1,3);
            IPage<User> userIPage = userMapper.selectPage(page,null);
            System.err.println(userIPage.getRecords());
        }
    

    基本配置

    #指定配置文件位置
    mybatis-plus.config-location = classpath:mybatis-config.xml
    #指定mapper的文件位置
    mybatis-plus.mapper-locations = classpath*:mybatis/*.xml
    #指定别名包扫描路径,配置后可直接使用类名,而不用全类名
    mybatis-plus.type-aliases-package = com.mmc.mybatisPlus.bean
    #关闭⾃动驼峰映射,该参数不能和mybatis-plus.config-location同时存在
    mybatis-plus.configuration.map-underscore-to-camel-case=false
    #全局地开启或关闭配置⽂件中的所有映射器已经配置的任何缓存,默认为 true。
    mybatis-plus.configuration.cache-enabled=false
    
    #全局配置表名前缀
    mybatis-plus.global-config.db-config.table-prefix=tb_
    

    插件使用

    1. 基础使用
    @Component
    @Intercepts({
            @Signature(
                    type= Executor.class,
                    method = "query",
                    args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
            )})
    public class MyInterceptor implements Interceptor {
    
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            System.out.println("拦截excecutor");
            //拦截方法,具体业务逻辑编写的位置
            return invocation.proceed();
        }
    
        @Override
        public Object plugin(Object o) {
            //创建target对象的代理对象,⽬的是将当前拦截器加⼊到该对象中
            return Plugin.wrap(o,this);
        }
    
        @Override
        public void setProperties(Properties properties) {
    
        }
    }
    
    1. 性能分析插件

    用于输出每条SQL语句及其执行时间,可以设置最大执行时间,超过时间会抛出异常。

     @Bean
        public PerformanceInterceptor performanceInterceptor(){
            PerformanceInterceptor performanceInterceptor = new
                    PerformanceInterceptor();
            performanceInterceptor.setMaxTime(100);
            performanceInterceptor.setFormat(true);
            return performanceInterceptor;
        }
    
    1. 乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    return new OptimisticLockerInterceptor();
    }
    

    实体类上加上@version注解

    @Version
    private Integer version;
    

    自动填充功能

    1. 给要填充的字段加注解
       @TableField(fill = FieldFill.INSERT)
        private Date createTime;
    

    填充策略有多种:

    public enum FieldFill {
    
    /**
    * 默认不处理
    */
    DEFAULT,
    /**
    * 插⼊时填充字段
    */
    INSERT,
    /**
    * 更新时填充字段
    */
    UPDATE,
    /**
    * 插⼊和更新时填充字段
    */
    INSERT_UPDATE
    
        
    }
    

    编写MyMetaObjectHandler

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
        @Override
        public void insertFill(MetaObject metaObject) {
            Object createTime = getFieldValByName("createTime", metaObject);
            if(createTime==null){
                setFieldValByName("createTime",new Date(),metaObject);
            }
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
    
        }
    }
    

    SQL注入器

    在Mytabis-Plus中,通过AbstractSqlInjector将BaseMapper中的方法注入到Mybatis容器中,这样它的方法才能被正常执行。那么我们如果需要扩展BaseMapper中的方法,该怎么实现呢?

    1. 编写一个MybaseMapper继承BaseMapper
    public interface MyBaseMapper<T> extends BaseMapper<T> {
    List<T> findAll();
    }
    
    1. 给对应的要扩展的方法编写方法类
    public class FindAll extends AbstractMethod {
    
        @Override
        public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
            String sqlMethod="findAll";
            String sql="select * from "+tableInfo.getTableName();
            SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
            return this.addSelectMappedStatement(mapperClass,sqlMethod,sqlSource,modelClass,tableInfo);
        }
    }
    
    1. 注入到容器
    @Component
    public class MySqlInjector extends DefaultSqlInjector {
    
        @Override
        public List<AbstractMethod> getMethodList() {
            List<AbstractMethod> methodList = super.getMethodList();
            methodList.add(new FindAll());
    
            return methodList;
        }
    }
    

    逻辑删除

    1. 实体类加注解
    @TableLogic
        private Integer deleted;
    
    1. 配置删除属性值
    # 逻辑已删除值(默认为 1)
    mybatis-plus.global-config.db-config.logic-delete-value=1
    # 逻辑未删除值(默认为 0)
    mybatis-plus.global-config.db-config.logic-not-delete-value=0
    
    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    使用NBU进行oracle异机恢复
    mycat偶尔会出现JVM报错double free or corruption并崩溃退出
    exp导出数据时丢表
    service_names配置不正确,导致dg创建失败
    XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
    HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
    java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
    【JAVA集合框架一 】java集合框架官方介绍 Collections Framework Overview 集合框架总览 翻译 javase8 集合官方文档中文版
    java内部类深入详解 内部类的分类 特点 定义方式 使用
    再谈包访问权限 子类为何不能使用父类protected方法
  • 原文地址:https://www.cnblogs.com/javammc/p/15515290.html
Copyright © 2011-2022 走看看