对于Mybatis的理解----即总结+Mybatisplus

Mybatis: 半自动的ORM框架
ORM:对象关系映射

mybatis的官方网址

Mybatis是一个优秀的基于 java 的持久层框架,它内部封装了jdbc,让使用者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

特点:

  1. 简单易学
  2. 灵活
  3. 解除sql与程序代码的耦合
  4. 提供映射标签,支持对象与数据库的orm字段关系映射
  5. 提供对象关系映射标签,支持对象关系组建维护
  6. 提供xml标签,支持编写动态sql。
  7. 支持数据缓存和注解开发。

学习和开发中使用的依赖包

<dependencies>
        <!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--mysql驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--日志包-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--逆向工程依赖包-->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>

        <!--添加分页插件的依赖-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.10</version>
        </dependency>

    </dependencies>

mybatis主配置文件SqlMapConfig.xml

#{}和${}的区别

#{}是预编译处理,$${}是字符串替换。
使用#{}可以有效的防止 SQL 注入,提高系统安全性。

sql片段

Mybatis的连接池及事务详解

动态sql语句

where标签用于代替sql中的where关键字,可以根据条件判断是否附加where关键字。
如果where标签中有条件成立就会附加where关键字,如果没有成立的条件就不会附加where关键字. 可以去掉离他最近一个无关的and 或or关键字.
where标签的书写格式为`添写附加条件

if标签表示逻辑条件判断,如果条件成立就附加之间的sql语句,如果条件不成立就不附加之间的sql语句。书写格式为:

<if test="表达式">sql语句</if>

set标签用于更新语句中,代替set关键字,可以有效对指定字段进行更新,提升sql的执行效率。,
当set标签中有条件成立时就会附加set标签,set标签会去除无关的逗号。set标签中一般嵌套if标签进行使用

trim标签为万能标签,可用于set或where等。
prefix表示要附加的前缀关键字,
suffix表示要附加的后缀关键字,
prefixOverrides表示要忽略前置字符,
suffixOverrides表示要忽略后置字符。
格式:

<trim prefix="where" prefixOverrides=",">
         <if test="">
            
         </if>
        
</trim>

choose标签作用条件判断来拼接指定的条件,它和if不太相同,choose似类于java中的switch语句用法,直要有条件成立,其它判断将得不到执行,如果所有条件都不成立则执行otherwise标签中的内容。
格式:

<choose>
  <when test=条件1>
    执行的代码;
  </when>
<when test=条件2>
    执行的代码;
  </when>
  ......
  <otherwise>
      执行的代码;
  </when>
  </otherwise>
</choose>

foreach标签表示循环,对sql中有重复的部分可以使用此循环来动态拼接sql语句。可以实现批量添加、批量删除、批量更新操作。
foreach标签中有很多的属性,请参考下面的Foreach标签属性表。

collection指定你要使用的集合类型
item集合中每个元素。
open在起始时,需要附加字符串,只附加一次。
close在结束时,需要附加字符,只附加一次。
separator在每个循环结时需要附加的字符串。
index每个循环的索引值。

MyBatis多表查询

一对一

方式一:嵌套结果方式(需要建组合类)
方式二:嵌套查询方式 (需要在主类添加从类作为属性)

一对多

方式一:嵌套结果的方式(添加List)
方式二:嵌套查询的方式()

多对多

方式一:嵌套结果方式(需要建组合类)
方式二:嵌套查询方式

延迟加载策略

延迟加载(lazy load)是(也称为懒加载)关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。

MyBatis的逆向工程

Mybatis 缓存

缓存是存在于内存中的临时数据,使用缓存的目的是减少和数据库的交互次数,提高执行效率。
Mybatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能

mybatis一级缓存一种是SQLSESSION级别的,针对同一个会话SqlSession中,执行多次条件完全相同的同一个sql,那么会共享这一缓存。

二级缓存是 mapper(命名空间/接口) 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

MyBatis分页插件

PageHelper

MyBatis的注解开发

@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用

使用注解实现复杂关系映射开发

@Results 注解代替的是标签<resultMap>
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results({@Result(),@Result()})或@Results(@Result())
@Resutl 注解代替了 <id> 标签和<result> 标签
@Result 中 属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))
@One 注解(一对一)
代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用的 来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
使用格式:
@Result(column=" “,property=”",one=@One(select=""))
@Many 注解(多对一)
代替了 标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType
(一般为 ArrayList)但是注解中可以不定义;
使用格式:
@Result(property="",column="",many=@Many(select=""))

用注解进行复杂查询使用嵌套查询

MybatisPlus

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

Mybatis-Plus的优势

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。

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

lombok插件

用途是使用注解给你类里面的字段,自动的加上属性,构造器,ToString方法,Equals方法等等,比较方便的一点是,你在更改字段的时候,lombok会立即发生改变以保持和你的一致性。

常用的 lombok 注解

@Getter 加在类上,可以自动生成参数的getter方法。
@Setter 加在类上,可以自动生成参数的setter方法
@ToString 加在类上,调用toString()方法,可以输出实体类中所有属性的值。
@EqualsAndHashCode:它会生成equals和hashCode方法
@Data这个是非常常用的注解,注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法:
@NoArgsConstructor生成一个无参数的构造方法。
@AllArgsConstructor生成一个包含所有变量的构造方法。

Mybatis-Plus通用CRUD

BaseMapper接口

baseMaper中提供的方法:

// 插入一条记录
int insert(T entity);
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 whereEntity 条件,更新记录
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);

List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

@TableId(type=IdType.AUTO)
默认使用雪花算法生成数字

Mybatis-Plus条件构造器

用QueryWrapper来实现自定义条件查询

分页

mybatis-plus中分页有两种一种是逻辑分页或叫内存分页,另一种是物理分页,内存分页就是把数据全部查询出来放到内容中,返回你想要的一部分数据,当数据量非常庞大时这种方法就行不通了,因为太耗内容,所以一般采用物理分页,需要springboot中加入物理分页配置

Mybatis-Plus的Service封装

service接口  继承 IService<T>
service实现类 继承 ServiceImpl<TMapper,T> 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值