1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Mybatis-Plus學(xué)習(xí)總結(jié)(建議收藏)

        共 32946字,需瀏覽 66分鐘

         ·

        2021-04-29 09:55

        點(diǎn)擊上方[全棧開發(fā)者社區(qū)]右上角[...][設(shè)為星標(biāo)?]

        點(diǎn)擊領(lǐng)取全棧資料全棧資料

        MyBatis-Plus(簡(jiǎn)稱 MP)是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生。

        基本特性

        • 無(wú)侵入:只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑

        • 損耗小:?jiǎn)?dòng)即會(huì)自動(dòng)注入基本 CURD,性能基本無(wú)損耗,直接面向?qū)ο蟛僮?/span>

        • 強(qiáng)大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過(guò)少量配置即可實(shí)現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類使用需求

        • 支持 Lambda 形式調(diào)用:通過(guò) Lambda 表達(dá)式,方便的編寫各類查詢條件,無(wú)需再擔(dān)心字段寫錯(cuò)

        • 支持主鍵自動(dòng)生成:支持多達(dá) 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問(wèn)題

        • 支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實(shí)體類只需繼承 Model 類即可進(jìn)行強(qiáng)大的 CRUD 操作

        • 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )

        • 內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來(lái)使用

        • 內(nèi)置分頁(yè)插件:基于 MyBatis 物理分頁(yè),開發(fā)者無(wú)需關(guān)心具體操作,配置好插件之后,寫分頁(yè)等同于普通 List 查詢

        • 分頁(yè)插件支持多種數(shù)據(jù)庫(kù):支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數(shù)據(jù)庫(kù)

        • 內(nèi)置性能分析插件:可輸出 Sql 語(yǔ)句以及其執(zhí)行時(shí)間,建議開發(fā)測(cè)試時(shí)啟用該功能,能快速揪出慢查詢

        • 內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作

        快速入門

        1、創(chuàng)建數(shù)據(jù)庫(kù) mybatis_plus

        現(xiàn)有一張 User 表,其表結(jié)構(gòu)如下:


        其對(duì)應(yīng)的數(shù)據(jù)庫(kù) Schema 腳本,數(shù)據(jù)庫(kù) Data 腳本如下:

        DROP TABLE IF EXISTS user;

        CREATE TABLE user
        (
         id BIGINT(20) NOT NULL COMMENT '主鍵ID',
         name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
         age INT(11) NULL DEFAULT NULL COMMENT '年齡',
         email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
         PRIMARY KEY (id)
        );
        -- 真實(shí)開發(fā)中,version(樂(lè)觀鎖),deleted(邏輯刪除)、gmt_create、gem_mo


        DELETE FROM user;

        INSERT INTO user (id, name, age, email) VALUES
        (1, 'Jone', 18, '[email protected]'),
        (2, 'Jack', 20, '[email protected]'),
        (3, 'Tom', 28, '[email protected]'),
        (4, 'Sandy', 21, '[email protected]'),
        (5, 'Billie', 24, '[email protected]');


        2、新建Maven工程


        導(dǎo)入相關(guān)依賴

        <?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">
            <modelVersion>4.0.0</modelVersion>

            <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.3.4.RELEASE</version>
                <relativePath/> <!-- lookup parent from repository -->
            </parent>

            <groupId>com.ly</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>1.0-SNAPSHOT</version>
            <name>mybatis-plus</name>
            <description>Demo project for Spring Boot</description>
            
            <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
                <java.version>1.8</java.version>
            </properties>

            <dependencies>

                <!--mybatis-plus 是自己開發(fā)的,非官方的!-->
                <dependency>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-boot-starter</artifactId>
                    <version>3.3.1.tmp</version>
                </dependency>

                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </dependency>

                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <scope>runtime</scope>
                </dependency>

                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                </dependency>

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

            </dependencies>

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

        </project>

        說(shuō)明:我們使用mybatis-plus可以節(jié)省我們大量的代碼,盡量不要同時(shí)導(dǎo)入mybatis和mybatis-plus!版本的差異!


        3、配置文件application.yml

        spring:
          #配置數(shù)據(jù)源
          datasource:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
            username: root
            password: 123456

        #配置日志,我們所用的sql現(xiàn)在是不可見的,我們希望知道他是怎么執(zhí)行的,所以我們必須要查看日志!
        mybatis-plus:
          configuration:
            log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

        4、編寫代碼

        mybatis-plus的使用步驟:引入依賴 -> 創(chuàng)建pojo -> 實(shí)現(xiàn)dao接口(不用寫mapper.xml文件,只需要在啟動(dòng)器上配置 mapper 掃描路徑即可)-> 基本使用


        編寫實(shí)體類 User.java,這里使用了Lombok插件

        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public class User {
            private Long id;
            private String name;
            private Integer age;
            private String email;
        }

        編寫Mapper類 UserMapper.java

        //在對(duì)應(yīng)的Mapper上繼承基本的類baseMapper
        public interface UserMapper extends BaseMapper<User> {
            //所有的CRUD已經(jīng)編寫完成
            //不需要像以前的配置一些xml

        }

        新建 Spring Boot 啟動(dòng)類中添加 @MapperScan 注解,掃描 Mapper 文件夾:

        @SpringBootApplication
        @MapperScan("com.ly.mapper")//掃描mapper文件夾
        public class MybatisPlusApplication {

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

        }

        工程目錄:


        添加測(cè)試類,進(jìn)行功能測(cè)試:

        @RunWith(SpringRunner.class)
        @SpringBootTest
        public class MybatisPlusTest {

            //繼承了BaseMapper,所有方法都來(lái)自父類
            //我們可以編寫自己的拓展方法
            @Autowired
            private UserMapper userMapper;

            @Test
            public void testSelect() {
                System.out.println(("----- selectAll method test ------"));
                //參數(shù)是一個(gè)Wrapper,條件結(jié)構(gòu)器,這里先不用 填null
                //查詢所有的用戶 
                List<User> userList = userMapper.selectList(null);
                userList.forEach(System.out::println);
            }

        }

        UserMapper 中的 selectList() 方法的參數(shù)為 MP 內(nèi)置的條件封裝器 Wrapper,所以不填寫就是無(wú)任何條件


        控制臺(tái)輸出:

        實(shí)現(xiàn)CRUD

        插入操作:

        插入一條記錄: int insert(T entity);

        插入類型T:實(shí)體對(duì)象

        舉例測(cè)試:

        @Test
        public void testInsert() {

            User user = new User();
            user.setName("LY");
            user.setAge(100);
            user.setEmail("[email protected]");

            int result = userMapper.insert(user);  //幫我們生成id
            System.out.println(result);      //受影響的行數(shù)
            System.out.println(user);       //發(fā)現(xiàn)id會(huì)自動(dòng)回填
        }

        運(yùn)行結(jié)果:mybatis-plus實(shí)現(xiàn)了主鍵自動(dòng)生成

        主鍵生成策略:

        數(shù)據(jù)庫(kù)插入的id為全局默認(rèn)的id(ID_WORKER),我們需要配置主鍵自增,在實(shí)體類字段上添加注解:@TableId(type =IdType.AUTO),數(shù)據(jù)庫(kù)字段一定要是自增的。

        public enum IdType {
            AUTO(0),   //數(shù)據(jù)可id自增
            NONE(1),   //未設(shè)置主鍵
            INPUT(2),   //手動(dòng)輸入
            ID_WORKER(3), //默認(rèn)的全局唯一id
            UUID(4),  //全局唯一id uuid
            ID_WORKER_STR(5); // ID_WORKEK 字符串表示法

            private int key;

            private IdType(int key) {
                this.key = key;
            }

            public int getKey() {
                return this.key;
            }
        }

        添加過(guò)注解,并將數(shù)據(jù)庫(kù)id字段設(shè)置為自增后,測(cè)試插入數(shù)據(jù):


        雪花算法:

        SnowFlake 算法,是 Twitter 開源的分布式 id 生成算法。其核心思想就是:使用一個(gè) 64 bit 的 long 型的數(shù)字作為全局唯一 id。在分布式系統(tǒng)中的應(yīng)用十分廣泛,且ID 引入了時(shí)間戳,基本上保持自增的。

        這 64 個(gè) bit 中,其中 1 個(gè) bit 是不用的,然后用其中的 41 bit 作為毫秒數(shù),用 10 bit 作為工作機(jī)器 id,12 bit 作為序列號(hào)。


        更新操作

        // 根據(jù) whereEntity 條件,更新記錄
        int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
        // 根據(jù) ID 修改
        int updateById(@Param(Constants.ENTITY) T entity);


        #參數(shù)說(shuō)明
        類型     參數(shù)名         描述
        T     entity         實(shí)體對(duì)象 (set 條件值,可為 null)
        Wrapper updateWrapper 實(shí)體對(duì)象封裝操作類(可以為 null,里面的 entity 用于生成 where 語(yǔ)句)

        舉例測(cè)試:

        @Test
        public void testUpdate() {
            //sql自動(dòng)動(dòng)態(tài)配置
            User user = new User();
            user.setName=("ZZ");
            user.setId(3L);
            user.setAge("50");
            
            //注意:updateById的參數(shù)是一個(gè)對(duì)象
            userMapper.updateById(user);
        }

        運(yùn)行結(jié)果:


        自動(dòng)填充

        創(chuàng)建時(shí)間、修改時(shí)間!這些個(gè)操作一般都是自動(dòng)化完成,我們不希望手動(dòng)更新!


        阿里巴巴開發(fā)手冊(cè):所有的數(shù)據(jù)庫(kù)表:gmt_create\gmt_modified幾乎所有的表都要配置上!而且需要自動(dòng)化


        方式一:數(shù)據(jù)庫(kù)級(jí)別 (工作中不允許)

        在表中新增字段 create_time 、update_time,設(shè)為默認(rèn)CURRENT_TIMESIAMP


        方式二:代碼級(jí)別

        在表中新增字段 create_time 、update_time:


        實(shí)體類上的屬性需要增加注解 @TableField

        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public class User {
            @TableId(type = IdType.AUTO)
            private Long id;
            private String name;
            private Integer age;
            private String email;
            
         //創(chuàng)建時(shí)間,插入數(shù)據(jù)時(shí)操作
         @TableField(fill = FieldFill.INSERT)
         private Date createTime; 
         //更新時(shí)間,插入和更新是操作
         @TableField(fill = FieldFill.INSERT_UPDATE)
         private Date updateTime;
        }

        編寫處理器來(lái)處理這個(gè)注釋:

        @Slf4j
        @Component //不要忘記吧處理器加到IOC容器中
        public class MyMetaObjectHandler implements MetaObjectHandler {

            //插入時(shí)候的填充策略
            @Override
            public void insertFill(MetaObject metaObject) {
                log.info("start insert fill ....");  //日志
                //設(shè)置字段的值(String fieldName字段名,Object fieldVal要傳遞的值,MetaObject metaObject)
                this.setFieldValByName("createTime",new Date(),metaObject);
                this.setFieldValByName("updateTime",new Date(),metaObject);
                
            }

            //更新時(shí)間的填充策略
            @Override
            public void updateFill(MetaObject metaObject) {
                log.info("start update fill ....");
                this.setFieldValByName("updateTime",new Date(),metaObject);
                
            }
        }

        測(cè)試插入一條數(shù)據(jù):

        數(shù)據(jù)庫(kù)中的數(shù)據(jù):


        樂(lè)觀鎖

        樂(lè)觀鎖:顧名思義十分樂(lè)觀,它總是被認(rèn)為不會(huì)出現(xiàn)問(wèn)題,無(wú)論干什么都不去上鎖!如果出現(xiàn)了問(wèn)題,再次更新測(cè)試


        悲觀鎖:顧名思義十分悲觀,它總是出現(xiàn)問(wèn)題,無(wú)論干什么都會(huì)上鎖!再去操作!


        樂(lè)觀鎖實(shí)現(xiàn)方式:

        • 取出記錄時(shí),獲取當(dāng)前version

        • 更新時(shí),帶上這個(gè)version

        • 執(zhí)行更新事,set version=newVersion where version =oldVersion

        • 如果version不對(duì),就更新失敗

        樂(lè)觀鎖:1、先查詢,獲得版本號(hào) version=1
        --A
        update user set name ="shuishui" ,version =version+1
        where id =2 and version=1

        --B 如果線程搶先完成,這個(gè)時(shí)候version=2,會(huì)導(dǎo)致A修改失敗
        update user set name ="shuishui" ,version =version+1
        where id =2 and version=1

        測(cè)試樂(lè)觀鎖:

        1、表中創(chuàng)建樂(lè)觀鎖字段version 默認(rèn)值為1

        2、同步實(shí)體類

        @Version //樂(lè)觀鎖Version注解
        private Integer version;

        3、注冊(cè)組件 (config包下)

        @EnableTransactionManagement
        @MapperScan("com.ly.mapper")
        @Configuration//配置類
        public class MyBatisPlusConfig{
            //注冊(cè)樂(lè)觀鎖插件
            @Bean
         public OptimisticLockerInterceptor optimisticLockerInterceptor() {
             return new OptimisticLockerInterceptor();
         }
        }

        測(cè)試樂(lè)觀鎖成功:

        //測(cè)試樂(lè)觀鎖成功
        @Test
        public void testOptimisticLocker(){
            //1、查詢用戶信息
            User user = userMapper.selectById(1L);
            //2、修改用戶信息
            user.setName("LZY");
            user.setEmail("[email protected]");
            //執(zhí)行更新操作
            userMapper.updateById(user);
        }


        模擬樂(lè)觀鎖失敗:

        //測(cè)試樂(lè)觀鎖失敗
        @Test
        public void testOptimisticLocker2(){
            //1、查詢用戶信息
            User user = userMapper.selectById(1L);
            //2、修改用戶信息
            user.setName("LZY1");
            user.setEmail("[email protected]");

            //1、模擬另一個(gè)線程執(zhí)行了插隊(duì)操作
            User user2 = userMapper.selectById(1L);
            //2、修改用戶信息
            user2.setName("LZY2");
            user2.setEmail("[email protected]");

            //執(zhí)行更新操作
            userMapper.updateById(user2);

            //執(zhí)行更新操作
            userMapper.updateById(user); //如果沒(méi)有樂(lè)觀鎖就會(huì)覆蓋插隊(duì)線程的值
        }


        查詢操作

        根據(jù) ID 查詢:T selectById(Serializable id);

        根據(jù) entity 條件,查詢一條記錄:T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);

        查詢(根據(jù)ID 批量查詢):List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

        根據(jù) entity 條件,查詢?nèi)坑涗洠?/span>List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);

        查詢(根據(jù) columnMap 條件):List selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

        根據(jù) Wrapper 條件,查詢?nèi)坑涗洠?/span>List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper);

        根據(jù) Wrapper 條件,查詢?nèi)坑涗?。注意?/span>只返回第一個(gè)字段的值:List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper);

        根據(jù) entity 條件,查詢?nèi)坑涗洠ú⒎?yè)):IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

        根據(jù) Wrapper 條件,查詢?nèi)坑涗洠ú⒎?yè)):IPage<Map<String, Object>> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

        根據(jù) Wrapper 條件,查詢總記錄數(shù):Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);


        參數(shù)類型說(shuō)明:

        • Serializable:主鍵ID

        • Wrapper :實(shí)體對(duì)象封裝操作類(可以為 null)

        • Collection<? extends Serializable>:主鍵ID列表(不能為 null 以及 empty)

        • Map<String, Object>:表字段 map 對(duì)象

        • IPage:分頁(yè)查詢條件(可以為 RowBounds.DEFAULT)

        實(shí)例測(cè)試:

        @Test
        public void testSelectById(){
            User user =userMapper.selectById(1);
            System.out.println(user);
        }

        //測(cè)試批量查詢
        @Test
        public void testSelectByBatchId(){
            List<User> users =userMapper.selectBatchIds(Arrays.asList(1,2,3));
            users.forEach(System.out::println);
        }

        //條件查詢
        public void testSelectByBatchIds(){
            HashMap<String,Object> map=new HashMap<>();
            //自定義查詢
            map.put("name","LZY");
            map.put("age",18);

            List<User> users = userMapper.selectByMap(map);
            users.forEach(System.out::println);
        }

        分頁(yè)查詢

        Mybatis-Plus中內(nèi)置了分頁(yè)插件,配置攔截器組件即可:

        @EnableTransactionManagement
        @Configuration
        @MapperScan("com.ly.mapper")
        public class MybatisPlusConfig {

            @Bean
            public PaginationInterceptor paginationInterceptor() {
                PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
                // 設(shè)置請(qǐng)求的頁(yè)面大于最大頁(yè)后操作, true調(diào)回到首頁(yè),false 繼續(xù)請(qǐng)求  默認(rèn)false
                // paginationInterceptor.setOverflow(false);
                // 設(shè)置最大單頁(yè)限制數(shù)量,默認(rèn) 500 條,-1 不受限制
                // paginationInterceptor.setLimit(500);
                // 開啟 count 的 join 優(yōu)化,只針對(duì)部分 left join
                paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
                return paginationInterceptor;
            }
        }

        測(cè)試分頁(yè):

        //測(cè)試分頁(yè)查詢
        @Test
        public void testPage(){
            // 參數(shù)一:當(dāng)前頁(yè)
            // 參數(shù)二:頁(yè)面大小
            // 使用了分頁(yè)插件之后,所有的分頁(yè)操作也變得簡(jiǎn)單了
            Page<User> page =new Page<>(2,5);
            userMapper.selectPage(page,null);

            page.getRecords().forEach(System.out::println);
            //獲取總數(shù)
            page.getTotal();
        }

        刪除操作

        根據(jù) entity 條件,刪除記錄:int delete(@Param(Constants.WRAPPER) Wrapper wrapper);

        刪除(根據(jù)ID 批量刪除):int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

        根據(jù) ID 刪除:int deleteById(Serializable id);

        根據(jù) columnMap 條件,刪除記錄:int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

        參數(shù)類型說(shuō)明:

        • Wrapper:實(shí)體對(duì)象封裝操作類(可以為 null)

        • Collection<? extends Serializable>:主鍵ID列表(不能為 null 以及 empty)

        • Serializable:主鍵ID

        • Map<String, Object>:表字段 map 對(duì)象

        測(cè)試刪除:

        @Test
        public void testDeleteById(){
            userMapper.deleteById(1);
        }

        //批量刪除
        @Test
        public void testDeleteBatchId(){
            userMapper.deleteBatchIds(Arrays.asList(1,2));
        }

        //條件刪除
        @Test
        public void testDeleteMap(){
            HashMap<String,Object> map = new HashMap<>();
            map.put("name","LZY");
            userMapper.deleteByMap(map);
        }

        邏輯刪除

        物理刪除 :從數(shù)據(jù)庫(kù)中直接移出


        邏輯刪除:方便數(shù)據(jù)恢復(fù)和保護(hù)數(shù)據(jù)本身價(jià)值的一種方案,在數(shù)據(jù)庫(kù)中沒(méi)有被移出,而是通過(guò)一個(gè)變量來(lái)讓他失效!deleted=0 ==>deleted =1(失效)


        在數(shù)據(jù)庫(kù)中增加deleted字段:

        實(shí)體類中增加屬性,并添加@TableLogic注解:

        @TableLogic  //3.1.1開始可以不用這一步,但如果實(shí)體類上有 @TableLogic 則以實(shí)體上的為準(zhǔn),忽略全局
        private Integer deleted;

        application.yml 加入配置:

        mybatis-plus:
          global-config:
            db-config:
              logic-delete-field: flag  #全局邏輯刪除字段值 3.3.0開始支持,詳情看下面。
              logic-delete-value: 1     # 邏輯已刪除值(默認(rèn)為 1)
              logic-not-delete-value: 0 # 邏輯未刪除值(默認(rèn)為 0)

        效果: 使用mp自帶方法刪除和查找都會(huì)附帶邏輯刪除功能 (自己寫的xml不會(huì))

        條件構(gòu)造器Wrapper

        1.查詢name不為null的用戶,并且郵箱不為null的永不,年齡大于等于35的用戶

        @Test
        public void findByAgeLessThan(){
            // 查詢name不為null的用戶,并且郵箱不為null的永不,年齡大于等于35的用戶
            QueryWrapper<User> wrapper =new QueryWrapper<>();
            wrapper.isNotNull("name");
            wrapper.isNotNull("email");
            wrapper.ge("age",35);
            userMapper.selectList(wrapper).forEach(System.out::println);
        }

        執(zhí)行結(jié)果:


        2.查詢name為L(zhǎng)Y的用戶

        @Test
        public void findByName(){
            // 查詢name為L(zhǎng)ZY的用戶
            QueryWrapper<User> wrapper =new QueryWrapper<>();
            wrapper.eq("name","LY");
            User user=userMapper.selectOne(wrapper);
            System.out.println(user);
        }

        執(zhí)行結(jié)果:

        3.查詢年齡在10~30歲之間的用戶

        @Test
        public void findByAgeBetween(){
            // 查詢年齡在10~30歲之間的用戶
            QueryWrapper<User> wrapper =new QueryWrapper<>();
            wrapper.between("age",10,30);
            Integer count =userMapper.selectCount(wrapper);//查詢結(jié)果數(shù)
            System.out.println(count);
        }

        執(zhí)行結(jié)果:


        4.測(cè)試模糊查詢

        //模糊查詢
        @Test
        public void findByLink(){
            QueryWrapper<User> wrapper =new QueryWrapper<>();

            wrapper.notLike("name","Z");//相當(dāng)于NOT LIKE '%Z%'
            wrapper.likeLeft("email","@qq.com");//相當(dāng)于LIKE '%@qq.com'
            List<Map<String,Object>> maps =userMapper.selectMaps(wrapper);//查詢結(jié)果數(shù)
            maps.forEach(System.out::println);
        }

        測(cè)試結(jié)果:


        5.測(cè)試子查詢

        @Test
        public void findById() {
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            //子查詢
            wrapper.inSql("id""select id from user where id<5");
            List<Object> objects = userMapper.selectObjs(wrapper);
            objects.forEach(System.out::println);
        }

        測(cè)試結(jié)果:


        6.通過(guò)id進(jìn)行排序

        @Test
        public void findByIdOrderByIdAsc(){
            QueryWrapper<User> wrapper =new QueryWrapper<>();
            //通過(guò)id進(jìn)行排序
            wrapper.orderByAsc("id");
            List<User> users =userMapper.selectList(wrapper);
            users.forEach(System.out::println);
        }

        執(zhí)行結(jié)果:


        代碼自動(dòng)生成器

        AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過(guò) AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各個(gè)模塊的代碼,極大的提升了開發(fā)效率。


        基本使用:

        新建一個(gè)springboot工程:

        在pom.xml中添加相關(guān)依賴:

        <!--在之前pom.xml文件的基礎(chǔ)上添加-->
        <!--代碼生成器依賴.3.0.3以后需要添加該依賴-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!--默認(rèn)的模板引擎velocity-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

        編寫yml文件,直接使用之前的即可:

        spring:
          #配置數(shù)據(jù)源
          datasource:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
            username: root
            password: 123456
          #設(shè)置開發(fā)環(huán)境
          profiles:
            active: dev
        #配置日志,我們所用的sql現(xiàn)在是不可見的,我們希望知道他是怎么執(zhí)行的,所以我們必須要查看日志!
        mybatis-plus:
          configuration:
            log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
          global-config:
            db-config:
              logic-delete-field: flag  # 全局邏輯刪除的實(shí)體字段名(since 3.3.0,配置后可以忽略不配置步驟2)
              logic-delete-value: 1 # 邏輯已刪除值(默認(rèn)為 1)
              logic-not-delete-value: 0 # 邏輯未刪除值(默認(rèn)為 0)
        server:
          port: 8010

        編寫代碼生成器:

        /**
         * @Author: Ly
         * @Date: 2021-04-16 09:06
         */
        import com.baomidou.mybatisplus.annotation.DbType;
        import com.baomidou.mybatisplus.annotation.FieldFill;
        import com.baomidou.mybatisplus.annotation.IdType;

        import com.baomidou.mybatisplus.generator.AutoGenerator;
        import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
        import com.baomidou.mybatisplus.generator.config.GlobalConfig;
        import com.baomidou.mybatisplus.generator.config.PackageConfig;
        import com.baomidou.mybatisplus.generator.config.StrategyConfig;
        import com.baomidou.mybatisplus.generator.config.po.TableFill;
        import com.baomidou.mybatisplus.generator.config.rules.DateType;
        import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
        import java.util.ArrayList;

        // 代碼自動(dòng)生成器
        public class MyBatisPlusGenerator {
            public static void main(String[] args) {
                // 需要構(gòu)建一個(gè) 代碼自動(dòng)生成器 對(duì)象
                AutoGenerator mpg = new AutoGenerator();
                // 配置策略
                // 1、全局配置
                GlobalConfig gc = new GlobalConfig();
                //獲取當(dāng)前項(xiàng)目路徑
                String projectPath = System.getProperty("user.dir");
                gc.setOutputDir(projectPath+"/src/main/java");
                gc.setAuthor("龍?jiān)磍ll");
                gc.setOpen(false);
                gc.setFileOverride(false);  // 是否覆蓋
                gc.setServiceName("%sService"); // 去Service的I前綴
                gc.setIdType(IdType.AUTO);
                gc.setDateType(DateType.ONLY_DATE);
                gc.setSwagger2(true);
                mpg.setGlobalConfig(gc);

                //2、設(shè)置數(shù)據(jù)源
                DataSourceConfig dsc = new DataSourceConfig();
                dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
                dsc.setDriverName("com.mysql.cj.jdbc.Driver");
                dsc.setUsername("root");
                dsc.setPassword("520992");
                dsc.setDbType(DbType.MYSQL);
                mpg.setDataSource(dsc);

                //3、包的配置
                PackageConfig pc = new PackageConfig();
                pc.setModuleName("blog");
                pc.setParent("com.ly");
                pc.setEntity("entity");
                pc.setMapper("mapper");
                pc.setService("service");
                pc.setController("controller");
                mpg.setPackageInfo(pc);

                //4、策略配置
                StrategyConfig strategy = new StrategyConfig();
                //strategy.setInclude("table1","table2",...); // 設(shè)置要映射的表名
                strategy.setInclude("user"); // 設(shè)置要映射的表名
                strategy.setNaming(NamingStrategy.underline_to_camel);
                strategy.setColumnNaming(NamingStrategy.underline_to_camel);
                // 自動(dòng)lombok
                strategy.setEntityLombokModel(true);
                strategy.setLogicDeleteFieldName("deleted");
                // 自動(dòng)填充配置
                TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
                TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
                ArrayList<TableFill> tableFills = new ArrayList<>();
                tableFills.add(gmtCreate);
                tableFills.add(gmtModified);
                strategy.setTableFillList(tableFills);
                // 樂(lè)觀鎖
                strategy.setVersionFieldName("version");
                strategy.setRestControllerStyle(true);
                strategy.setControllerMappingHyphenStyle(true);
                // localhost:8080/hello_id_2
                mpg.setStrategy(strategy);
                mpg.execute();
                //執(zhí)行
            }
        }

        運(yùn)行后的效果圖:


        原文鏈接:https://blog.csdn.net/Lzy410992/article/details/115750291

        瀏覽 39
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            翔田千里息子一二三四区 | 美女被鬼压床脱内衣内裤视频 | 永久免费 看片女女 | 操猛操逼 | 亚洲a网| 大鸡巴艹逼逼 | 男攻男受过程无遮掩视频 | 操逼网站草美女骚逼 | 日本精品无码 | 免费无遮挡婬乱男女视频网站野外 |