Mybatis动态sql和分页

目录

mybatis动态sql

if

trim标签

foreach

模糊查询(3种方式)

mybatis传参

分页查询

特殊字符处理和范围查询


mybatis动态sql

写这个代码前建议导入一个lombok插件,方便赋值

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!--lombok-->
    <lombok.version>1.18.22</lombok.version>

  </properties>
  <dependencies>
    <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>${lombok.version}</version>
          <scope>provided</scope>
    </dependency>

在实体类中写入

@Data //get/set方法
@NoArgsConstructor  //无参的构造方法
@AllArgsConstructor   //全参的构造方法
@ToString  //toString方法
@Builder  //方便赋值

动态sql语句包括以下标签

if

这里if判断 如果bookType不为空就根据类型查询

test 属性用于指定判断条件

refid代表自动生成代码中的表中的所有字段

<sql id="Base_Column_List" >
  book_id, book_name, book_name_pinyin, book_price, book_type,book_images
</sql>

注意:1)必须使用恒等式如 where 1=1 否则 bookType为空就会报错

           2)代码中的bookType是实体类的字段    而book_type是数据库的字段

 <select id="queryBookByif" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/>
    from t_book where 1=1
    <if test="null!=bookType and ''!=bookType">
      and book_type=#{bookType}
    </if>

  </select>

trim标签


trim标签用于控制sql语句的前缀及后缀,其具体属性如下:

 mybatis中trim是动态拼接;java中表示去除前后空格

属性    描述
prefix    指定sql语句拼接的前缀
subfix    指定sql语句拼接的后缀
prefixOverrides    指定sql语句前面要去除的关键字或字符,如and 逗号 括号等
 

<insert id="insertSelective" parameterType="Mybatis01.model.Book" >
    insert into t_book
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="bookId != null" >
        book_id,
      </if>
      <if test="bookName != null" >
        book_name,
      </if>
      <if test="bookNamePinyin != null" >
        book_name_pinyin,
      </if>
      <if test="bookPrice != null" >
        book_price,
      </if>
      <if test="bookType != null" >
        book_type,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="bookId != null" >
        #{bookId,jdbcType=INTEGER},
      </if>
      <if test="bookName != null" >
        #{bookName,jdbcType=VARCHAR},
      </if>
      <if test="bookNamePinyin != null" >
        #{bookNamePinyin,jdbcType=VARCHAR},
      </if>
      <if test="bookPrice != null" >
        #{bookPrice,jdbcType=REAL},
      </if>
      <if test="bookType != null" >
        #{bookType,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>

foreach

foreach常用于集合进行遍历

collection表示迭代集合的名称,一般可为list、set、array、map,该参数为必选参数
item 本次迭代获取的元素,如collection为list、set、array则item为其中元素,若为map,则item为key-value中的alue,必填参数
open表示该语句以什么开始,最常见的是左括号“(” , 可选参数
close   表示该语句以什么结束,最常见的是右括号“)” , 可选参数
separator 分隔符,mybatis会在每次迭代后给item后添加一个分隔符,一般为逗号,可选参数
index   在list set 数组中,index表示当前迭代元素的下标,在map中index表示key-value中的key,可选参数

<select id="queryBookByForeach" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/>
    from t_book where 1=1 and book_id in   /*open="and book_id in (" close=")"*/
    (
    <foreach collection="ids" item="id" separator="," >
      #{id}
    </foreach>
    )
  </select>

模糊查询(3种方式)
 
 1 参数中直接加入%%

 2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
          关键:#{...}与${...}区别?
          参数类型为字符串,#会在前后加单引号['],$则直接插入值

          注:
          1) mybatis中使用OGNL表达式传递参数
          2) 优先使用#{...}
          3) ${...}方式存在SQL注入风险

  3 SQL字符串拼接CONCAT

 <select id="queryBookLike" resultType="Mybatis01.model.Book">
  <!--  select
    <include refid="Base_Column_List"/> from t_book where 1=1
    <if test="null!=bookName and ''!=bookName">
    and book_name like #{bookName}
    </if>-->
    <!--select
    <include refid="Base_Column_List"/> from t_book where 1=1
    <if test="null!=bookName and ''!=bookName">
      and book_name like '%${bookName}%'
    </if>-->
    select
    <include refid="Base_Column_List"/> from t_book where 1=1
    <if test="null!=bookName and ''!=bookName">
      and book_name like concat('%',#{bookName},'%')
    </if>
  </select>

mybatis传参

传递integer类型的参数 等同于八大基础类型

注意:if标签中的test条件里不可写参数名必须写value 但是取值可以写参数名或者value

 <select id="queryBookInterger" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/> from t_book where 1=1
     <if test="null!=value and ''!=value">
       and book_id=#{bookId}
      /*value*/
     </if>

  </select>

传递String类型的参数m,必须使用@Param()方式,并且指明参数名

这里使用的是注解里面设置的参数名称,只能写注解定义的参数名称

如 :List<Book> queryBookString(@Param("btype") String BookType);

 <select id="queryBookString" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/> from t_book where 1=1
    <if test="null!=btype and ''!=btype">
      and book_type=#{btype}
      /*value*/
    </if>

  </select>

传递对象或者集合参数
//对象
 <select id="queryBookObject" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/> from t_book where 1=1
    <if test="null!=bookType and ''!=bookType">
    and book_type=#{bookType}
    </if>
  </select>


//集合
<select id="queryBookByForeach" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/>
    from t_book where 1=1 and book_id in 
    (
    <foreach collection="ids" item="id" separator="," >
      #{id}
    </foreach>
    )
  </select>

传递多个参数

如:List<Book> queryBookParams(@Param("bookType") String bookType,@Param("bookId") Integer bookId);

 <select id="queryBookParams" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/> from t_book where 1=1
    <if test="null!=bookType and ''!=bookType">
    and book_type=#{bookType}
    </if>
    <if test="null!=bookId and ''!=bookId">
      and book_id=#{bookId}
    </if>
  </select>

.查询返回结果集

          resultMap:适合使用返回值是自定义实体类的情况

<select id="queryBookResultMap" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/> from t_book

  </select>


         resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型

  <select id="querySingleBookById" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/> from t_book where book_id=#{bookId}

  </select>

        使用resultMap返回自定义类型集合

 <select id="querySingBookByMap" resultType="java.util.Map">
    select
    <include refid="Base_Column_List"/> from t_book where book_id=#{bookId}


  </select>

      使用resultType返回List<Map>,适用于多表查询返回结果集

如:

Map<String,Object> querySingBookByMap(Integer bookId);

     使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集

如:

List<Map<String,Object>> queryBookByMaps();

<select id="querySingBookByMap" resultType="java.util.List">
    select
    <include refid="Base_Column_List"/> from t_book where book_id=#{bookId}
  </select>


  <select id="queryBookByMaps" resultType="java.util.Map">
    select
    <include refid="Base_Column_List"/> from t_book

  </select>

分页查询

   为什么要重写mybatis的分页?
   Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的


         导入分页插件

   <dependency>
         <groupId>com.github.pagehelper</groupId>
         <artifactId>pagehelper</artifactId>
         <version>5.1.2</version>
       </dependency>

          将pagehelper插件配置到mybatis中

<!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
       <plugin interceptor="com.github.pagehelper.PageInterceptor">
       </plugin>

   在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页

//分页查询
        PageBean pageBean=new PageBean();
        pageBean.setPage(2);
        //禁止分页
       /* pageBean.setPagination(false);*/
        //判断是否分页
       /* if(null!=pageBean&&pageBean.isPagination())
            //参数一:当前页码 ,二:每页条数
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        List<Book> books = bookService.queryBookpager(Book.builder().build(), pageBean);
        System.out.println(books.getClass());
        if(null!=pageBean&&pageBean.isPagination()){
            PageInfo pageInfo = new PageInfo(books);
            System.out.println("页码:" + pageInfo.getPageNum());
            System.out.println("页大小:" + pageInfo.getPageSize());
            System.out.println("总记录:" + pageInfo.getTotal());
            //分页结果集
            List list=pageInfo.getList();
            list.forEach(System.out::println);
        }*/

特殊字符处理和范围查询


    >(&gt;)   
    <(&lt;)  
    &(&amp;) 
 空格(&nbsp;)

#{min}最小的

#{max}最大的

  <select id="queryBookrange" resultType="Mybatis01.model.Book">
    select
    <include refid="Base_Column_List"/> from t_book where 1=1
    <if test="null!=min and ''!=min">
      and book_type&gt;#{min}
    </if>
    <if test="null!=max and ''!=max">
      and book_price&lt;#{max}
    </if>
  </select>
  <


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值