重启MyBatis-Plus

关于MyBatis-Plus,其实我是没有系统学习过,只是在做项目的时候,碰到不懂的去百度,逐步去了解MyBatis-Plus里,所以其实在我的记忆里对于MyBatis-Plus是十分混乱的,有时候同样的东西每次看到都会去各种反复百度。今天我将借着这个机会重启一下MyBatis-Plus。


学习目标

所需环境

1.1 MyBatis与JPA的对比

我自己的了解是jpa的前身是著名的ssh中的h——>Hibernate。


MyBatis优势
MyBatis劣势

我目前为止只了解过一些皮毛,jpa的对于单表的简单查询确实简单方便又实用,但是同时,对于多表关联和复杂查询,起码目前为止,要么把复杂查询拆成多个简单查询。


JPA优势

1.2 MP

官方网址: https://mp.baomidou.com/

MP框架结构

优势

优势

建立项目流程


MP流程

1.3 lombok

在java项目中充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生。

2.1 通用传统模式简介及通用mapper新增方法

SSM传统开发流程

warn模式 —在DAO层包下 —格式


日志

将实体类及其各层与数据库通通配置好,根据以下mp提供的方法进行开发。


方法

2.2 常用注解

@Tablename 表名注解 数据库表名改变了结果实体类可不变名
@Tableld 标记在实体类字段上方 表示表的主键 代表默认值 //指向表中的id @TableId(value = "id", type = IdType.AUTO)
@TableField
//指向表中user_id字段,点表中的字段与所使用的字段不一样时使用,比如user_id(表)和userId(用)
@TableField("user_id")
private Integer userId;

@TableName("uc_cust_lock")
public class CustLock {
        /**
     * 标识
     */
    @IdField
    @TableField("cust_lock_id")
    private String custLockId;
 
        /**
     * 经纪人id
     */
    @TableField("broker_user_id")
    private String brokerUserId;
 
    
        /**
     * 组织id(经纪人所属组织id)
     */
    @TableField("org_id")
    private String orgId;
    // get,set...省略
}

2.3 排除非表字段的三种方式

为防止实体类的字段在数据库不存在:
1.使用关键字 transient 不参与序列化变化.


image.png

插入成功 该字段被忽略
2.static标识为静态变量.(如果需要被序列化时候.)


image.png

需要在实体类写一个静态的get set方法 在逻辑上用类调用
3.@TableField(exist=false) 对应数据库中是否存在.
image.png

用对象调用 表明该字段在数据库不存在

3.1 查询方法-普通查询

一 、根据id查询


image.png

image.png

二、 根据id批量列表查询


image.png

image.png

三、根绝map对象查询
image.png

单条数据

多条数据

注意字段名和数据库字段名是否符合

3.2 条件构造器查询

条件构造器查询

条件构造器的各种使用:
https://mp.baomidou.com/guide/wrapper.html#abstractwrapper
例子:
1

2

3

4

5

6

7

8

只返回一条满足语句

3.3 select不列出全部字段

只列出条件之内的数据:第一种情况

不展示条件的数据:第二种情况
image.png

3.4 condition作用

condition方法

1

2

另一测试1

另一测试2

3.5 实体作为条件构造器构造方法的参数

1

结果

实体安排什么参数条, 按照此条件来查询

用SQL定义

image.png

image.png

3.6 AllEq用法

image.png
说明:

QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类
用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件
注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件**没有任何关联行为**

### [#](https://mp.baomidou.com/guide/wrapper.html#alleq)allEq
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
1

1.1
2

2.1
3

3.1

3.7 lambda条件构造器

官网说法:
获取 LambdaWrapper:
在QueryWrapper中是获取LambdaQueryWrapper
在UpdateWrapper中是获取LambdaUpdateWrapper


测试

image.png

4.1 自定义sql

需求来源:
在使用了mybatis-plus之后, 自定义SQL的同时也想使用Wrapper的便利应该怎么办? 在mybatis-plus版本3.0.7得到了完美解决 版本需要大于或等于3.0.7, 以下两种方案取其一即可

Service.java
mysqlMapper.getAll(Wrappers.<MysqlData>lambdaQuery().eq(MysqlData::getGroup, 1));
//方案一 注解方式 Mapper.java

@Select("select * from mysql_data ${ew.customSqlSegment}")
List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);

//方案二 XML形式 Mapper.xml

<select id="getAll" resultType="MysqlData">
    SELECT * FROM mysql_data ${ew.customSqlSegment}
</select>

4.2 分页查询

分页展示:
https://gitee.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-pagination

<!-- spring xml 方式 -->
<property name="plugins">
    <array>
        <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
            <property name="sqlParser" ref="自定义解析类、可以没有"/>
            <property name="dialectClazz" value="自定义方言类、可以没有"/>
            <!-- COUNT SQL 解析.可以没有 -->
            <property name="countSqlParser" ref="countSqlParser"/>
        </bean>
    </array>
</property>

<bean id="countSqlParser" class="com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize">
    <!-- 设置为 true 可以优化部分 left join 的sql -->
    <property name="optimizeJoin" value="true"/>
</bean>
//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}
XML 自定义分页
public interface UserMapper {//可以继承或者不继承BaseMapper
    /**
     * <p>
     * 查询 : 根据state状态查询用户列表,分页显示
     * </p>
     *
     * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
     * @param state 状态
     * @return 分页对象
     */
    IPage<User> selectPageVo(Page<?> page, Integer state);
}
UserMapper.xml 等同于编写一个普通 list 查询,mybatis-plus 自动替你分页
<select id="selectPageVo" resultType="com.baomidou.cloud.entity.UserVo">
    SELECT id,name FROM user WHERE state=#{state}
</select>
UserServiceImpl.java 调用分页方法
public IPage<User> selectUserPage(Page<User> page, Integer state) {
    // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分
    // page.setOptimizeCountSql(false);
    // 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询
    // 要点!! 分页返回的对象与传入的对象是同一个
    return userMapper.selectPageVo(page, state);
}

6.1 AR模式

AR模式简单的说就是直接用实体操作数据库
一是实体需要继承Model类,二是必须存在对应的原始mapper并继承baseMapper并且可以使用的前提下,才能使用此 AR 模式。


image.png

model里的方法

6.2 主题策略

主键生成策略必须使用INPUT
支持父类定义@KeySequence子类继承使用
内置支持:
DB2KeyGenerator
H2KeyGenerator
KingbaseKeyGenerator
OracleKeyGenerator
PostgreKeyGenerator
如果内置支持不满足你的需求,可实现IKeyGenerator接口来进行扩展.

@KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
public class YourEntity {
    
    @TableId(value = "ID_STR", type = IdType.INPUT)
    private String idStr;

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容

  • 前言: mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过...
    贪挽懒月阅读 1,018,729评论 63 386
  • 前言: mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过...
    小明同学呀呀呀阅读 407评论 0 0
  • 一、MyBatis vs JPA 1、MyBatis优势 (1)自由控制 SQL语句,可手动优化SQL语句 (2)...
    sdouclzh阅读 4,881评论 0 0
  • 冬季 在这个冬天 准备读好一些书 我还没有来的及准备 长围巾就催促我出门看雪 不知为什么 很想去父亲的...
    黄梅枝阅读 1,382评论 45 61
  • Python Python中要注意代码的可复用性。能够提取出来的公共部分尽量写成一个函数或者一个类,注意代码之间的...
    小甜瓜Melon阅读 439评论 0 0