MyBatis

MyBatis

1.为什么要使用MyBatis - Dao层开发,增删改查

  • 代替JDBC,减少代码冗余

  • 不在java代码中将sql语句写死

2.如何使用MyBatis?如何在springboot中使用?

  • 建库建表

  • 创建springboot项目,导入mysql、MyBatis-start

  • 创建实体类

  • Mapper接口(定义了一些抽象方法)

  • Mapper映射配置文件 - 定义了和抽象方法对应的sql语句(.xml)

    • namespace和mapper接口的全接口名一致

    • id和mapper接口的抽象方法名一致

    • parameterType和mapper接口抽象方法参数的返回值类型一致

    • resultType和mapper接口抽象方法返回值类型一致

    • mapper映射配置文件在resource目录下的相对位置和mapper接口在java目录下的相对位置保持一致

  • 配置MyBatis(application\properties\启动类上添加@MapperScann注解)

    • properties
  • 测试

3.配置:lombok、mybatisframework(???????)

4.参数绑定

  • 序号参数绑定:如果抽象方法有多个参数,则

    • 第一个参数:arg0,param1

    • 第二个参数:arg1,param2

  • 注解参数绑定:在抽象方法前添加@Param注解

    • @Param("参数名") - 表示给方法的参数起了一个别名
  • map参数绑定

    • #{}中的占位符和map中的key对应,获取key对应的value作为参数值

5.模糊查询

sql 复制代码
 concat('%,#{username},'%')

6.主键回填 - 获取自增主键

  • useGeneratedKeys设置为true,keyColumn - 主键的列名 keyProperty - 主键对应的属性名

  • last_insert_id(),order=AFTER/BEFORE

  • 通过uuid()查询主键 - 雪花算法

7.动态SQL

  • if/where
sql 复制代码
 <select id="selectByCondition" resultType="user">
     SELECT * FROM `user` WHERE 1=1
     <if test="username!=null and username.length>0">
         AND `username`=#{username}
     </if>
     <if test="age!=null">
         AND `age`=#{age}
     </if>
     <if test="gender!=null and gender.length>0">
         AND `gender`=#{gender}
     </if>
     <if test="addr!=null and addr.length>0">
         AND `addr`=#{addr}
     </if>
 </select>
sql 复制代码
 // where标签
 <select id="selectByCondition" resultType="user">
     SELECT * FROM `user` 
     <where>
     <if test="username!=null and username.length>0">
         AND `username`=#{username}
     </if>
     <if test="age!=null">
         AND `age`=#{age}
     </if>
     <if test="gender!=null and gender.length>0">
         AND `gender`=#{gender}
     </if>
     <if test="addr!=null and addr.length>0">
         AND `addr`=#{addr}
     </if>
     </where>
 </select>
  • set

    sql 复制代码
     <update id="uodate" parameterType="user">
     UPDATE `user`
     <set>
         <if test="username!=null and username.length>0">
             AND `username`=#{username}
         </if>
         <if test="age!=null">
             AND `age`=#{age}
         </if>
         <if test="gender!=null and gender.length>0">
             AND `gender`=#{gender}
         </if>
         <if test="addr!=null and addr.length>0">
             AND `addr`=#{addr}
         </if>
     </set>
     WHERE `id`=#{id}
     </update>
sql 复制代码
trim

 <update id="uodate" parameterType="user">
 UPDATE `user`
 <trim prefix="SET" suffixOverrides=",">
     <if test="username!=null and username.length>0">
         AND `username`=#{username}
     </if>
     <if test="age!=null">
         AND `age`=#{age}
     </if>
     <if test="gender!=null and gender.length>0">
         AND `gender`=#{gender}
     </if>
     <if test="addr!=null and addr.length>0">
         AND `addr`=#{addr}
     </if>
 </trim>
 WHERE `id`=#{id}
 </update>
  • foreach

    sql 复制代码
     <select closet id="selectBuIds" resultType="user">
         SELECT * FROM `user`
         <where>
             <foreach collection="list" item="id" open="id IN (" close")" separator=",">
             #{id}
             </foreach>
         </where>
    </select>
    复制代码

8.列名和属性名不一致时如何映射

1)起别名:别名和属性名一致

2)resultMap - 结果映射

  • 定义resultMap

    • id:resultMap的名字,resultMap在当前映射配置文件中的标识

    • type:映射的类的全名/别名

    • id标签:设置主键列映射

    • result:设置非主键列映射

    • column:列名

    • property:属性名

  • 使用resultMap

9.SQL片段抽取:将重复的SQL提取出来,使用时用include引用即可,最终达到SQL重用的目的,减少代码冗余

复制代码
 
sql 复制代码
  <sql id="selectAll">
         SELECT * FROM user
     </sql>
         <select id="findAll" resultType="user">
       <include refid="selectAll" />
     </select>
 ​
     <select id="findByCondition" resultType="user">
         <include refid="selectAll" />
         <where>
             <if test="age!=null">
                 and age=#{age}
             </if>
             <if test="gender!=null">
                 and gender=#{gender}
             </if>
         </where>
     </select>

10.分页查询

如何使用分页插件:

  • 导入对应的starter

  • 设置分页信息

    java 复制代码
     PageHelper.startPage(1,5);
  • 查询

    java 复制代码
    List<User> userlist = userMapper.selectAll();
  • 创建封装查询结果的对象

    java 复制代码
    PageInfo<User> pageInfo = new PageInfo<>(userlise);
    sout(pageInfo.getPages());
相关推荐
一个处女座的暖男程序猿2 小时前
MyBatis Plus 中常用的 Service 功能
linux·windows·mybatis
endcy20162 小时前
IoTDB结合Mybatis使用示例(增删查改自定义sql等)
java·mybatis·iotdb
enjoy嚣士5 小时前
mybatis-plus之使用lombok的@Builder注解之后的坑
mybatis·lombok
小高不明5 小时前
仿 RabbitMQ 的消息队列3(实战项目)
java·开发语言·spring·rabbitmq·mybatis
沉默的煎蛋7 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
呼啦啦啦啦啦啦啦啦10 小时前
【Redis】持久化机制
java·redis·mybatis
苏-言19 小时前
MyBatis最佳实践:动态 SQL
数据库·sql·mybatis
苏-言1 天前
MyBatis最佳实践:提升数据库交互效率的秘密武器
数据库·mybatis
一缕叶2 天前
mybatis(19/134)
mybatis
lozhyf2 天前
基于SpringBoot + Mybatis Plus + SaToken + Thymeleaf + Layui的后台管理系统
spring boot·layui·mybatis