MyBatis注解及动态Sql

Posted 谁为含愁独不见,更教明月照流黄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis注解及动态Sql相关的知识,希望对你有一定的参考价值。

一、注解实现MyBatis配置

  java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换Mapper配置文件。

package com.lhf.dao;

import com.lhf.entity.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserDao {
    @Select("select * from user")
    List<User> getAll();
    @Delete("delete from user where id=#{id}")
    int del(int id);
    @Insert("insert into user values(default,#{name},#{pwd})")
    int add(User user);
    @Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
    int modify(User user);
}

删除UserDaoMaper的xml文件,在dao层使用注解(select、delete、insert、update)来实现数据库的简单操作,这个效果与Xml文件的效果是一致的。上一篇中有介绍xml文件的配置

一定会有人问,这里方法内的参数一般都是一个,那如果是两个以及以上怎么办呢?那就需要我们的@Parm注解了,该注解的作用可以看成是给参数起别名:

MyBatis基本常用的注解大概就说这么多后续再补充

二、动态SQL

何为动态SQL,就是服务器根据用户请求从而选择性的发送SQL语句,最典型的就是修改了,一个表中有多个字段,如果用户只需修改其中一个即可,那我们的SQL语句就没办法确定要修改哪一个,以前的做法是再修改前先获取所有的字段信息,然后按照用户所做的修改一 一进行比对,最后统一进行修改。这样的话我们就需要再dao将所有的字段都修改一次了,这和删除以后再新增一个区别不大,而且浪费资源,所有才有了动态SQL的诞生,动态sql只能是在xml文件中进行配置

if : If标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件,它也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句用来判断是否插入某个字段的值。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lhf.dao.UserDao">
    <update id="modify">
        update user set
        <if test="pwd!=null">
            pwd=#{pwd}
        </if>
        where
        <if test="id>0">
            id=#{id}
        </if>
    </update>
</mapper>

 类似于java中的if判断语句,test中为判断条件。

choose:上一部分的if标签提供了基本的条件判断,但是它无法实现if....else、if....else..... 的逻辑,要想实现这样的逻辑,就需要使用到choose when otherwise标签。choose元素中包含when和otherwise两个标签,一个choose中至少包含一个when,有0个或1个otherwise。

 <select id="select" resultType="User">
     select * from user where 1=1
     <choose>
         <when test="name!=null and name!=\'\'">
             and name=#{name}
         </when>
         <when test="id!=-1">
             and id=#{id}
         </when>
         <otherwise>
             and name="程序员"
        </otherwise>
     </choose>
</select>

whereWhere标签的作用:如果该标签包含的元素有返回值,就插入一个where;如果where 后面的字符串是以and和or开头,就将它剔除。

<select id="select" resultType="User">
     select * from user<!--使用了where标签,无需手动编写where条件-->
    <where>
         <choose>
             <when test="name!=null and name!=\'\'">
                 and name=#{name}
             </when>
             <when test="id!=-1">
                 and id=#{id}
             </when>
             <otherwise>
                 and name="程序员"
            </otherwise>
         </choose>
    </where>
</select>

set:Set标签的作用:如果该标签包含的元素中有返回值,就插入一个set;如果set后面的字符串是以逗号结尾的,就把这个逗号剔除

<update id="modify" parameterType="User">
 <!--如果参数类型是一个对象,那么sql语句中#{对象的属性名}-->
    update user
<!--使用<set>标签替代set语句--> <set> <if test="name!=null and name !=\'\'"> name=#{name}, </if> </set> where id=#{id} </update>

trimWhere和set标签的功能都可以使用trim标签来实现。

<trim prefix="WHERE" prefixOverrides="AND|OR">
    
</trim>
<trim prefix="SET" suffixOverrides=",">

</trim>

 trim标签有如下属性:

  prefix:当trim元素中包含内容时,会给内容增加prefix指定的前缀

  prefixOverrides:当trim元素中包含内容时,会把内容中匹配的前缀去掉

 suffix:当trim元素中包含内容时,会给内容增加suffix指定的后缀

 suffixOverrides:当trim元素中包含内容时,会把内容中匹配的后缀去掉

foreach:可以生成一系列的值,这个标签主要用于SQL的in语句后面 foreach元素的属性主要有 item,index,collection,open,separator,close。

  •    item:示集合中每一个元素进行迭代时的别名,

       index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置,

       open:表示该语句以什么开始,

       separator:表示在每次进行迭代之间以什么符号作为分隔 符,

   close:表示该语句以什么结束 

1)foreach实现in集合

    使用foreach元素可以in 集合|数组

               1.foreach元素in array数组

      接口方法如下:

      

//根据插入的id数组获取用户
List<User> findUserByIds(int[] ids);

UserMapper.xml中新增select节点

<select id="findUserByIds" resultType="User">
    select * from account
    <!--此处必须使用array 不能使用参数名-->
    <if test="array.length>0">
        where id IN
        <foreach collection="array" open="(" close=")" separator="," item="item">
            #{item}<!--item此时表示数组中的元素-->
        </foreach>
    </if>
</select>

 新增测试代码

 

@Test
public void test04(){
    //检索id为3,5的用户
    List<User> userByIds = mapper.findUserByIds(new int[]{3, 5});
    System.out.println(userByIds);
}

2.foreach元素in 普通list集合

//根据插入的id集合获取用户
List<User> findUserByIds(List<Integer> lists);

修改select节点如下

<select id="findUserByIds" resultType="User">
    select * from account
    <!--此处必须使用list 不能使用参数名-->
    <if test="list.size>0">
        where id IN
        <foreach collection="list" open="(" close=")" separator="," item="item">
            #{item}<!--item此时表示集合中的元素-->
        </foreach>
    </if>
</select>

测试代码如下

@Test
public void test04(){
    //检索id为3,5的用户
    List<Integer> lists=new ArrayList<>();
    lists.add(3);
    lists.add(5);
    List<User> userByIds = mapper.findUserByIds(lists);
    System.out.println(userByIds);
}

3.foreach元素in 自定义list集合

修改上述代码,将findUserByIds方法修改如下:

//根据插入的id集合获取用户
List<User> findUserByIds(List<User> lists);

修改select节点如下:

<select id="findUserByIds" resultType="User">
    select * from account
    <!--此处必须使用list 不能使用参数名-->
    <if test="list.size>0">
        where id IN
        <foreach collection="list" open="(" close=")" separator="," item="item">
            #{item.id}<!--item此时表示集合中的元素User对象-->
        </foreach>
    </if>
</select>

 修改测试代码如下:

@Test
public void test04(){
    //检索id为3,5的用户
    List<User> lists=new ArrayList<>();
    User user=new User();
    User user1=new User();
    user.setId(3);
    user1.setId(5);
    lists.add(user);
    lists.add(user1);
    List<User> userByIds = mapper.findUserByIds(lists);
    System.out.println(userByIds);
}

 

以上是关于MyBatis注解及动态Sql的主要内容,如果未能解决你的问题,请参考以下文章

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级

Mybatis复杂查询动态sql及缓存详解