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>

where:Where标签的作用:如果该标签包含的元素有返回值,就插入一个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>

trim:Where和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);
}

原文地址:https://www.cnblogs.com/Tiandaochouqin1/p/10327626.html

时间: 2024-08-06 03:44:16

MyBatis注解及动态Sql的相关文章

MyBatis 注解使用动态SQL

使用MyBatis很长时间了,一直使用的是XML配置的 SQL,刚好在上一个项目中尝试使用注解方式开发,主要是由于XML配置过于繁琐,注解可以直接写在Mapper函数上,更加的方便一些. 在注解上不能直接使用动态的SQL,需要在其前后加入 <script> @Select("<script> " + "SELECT id, name, email,password " + "FROM user " + " <

mybatis注解开发-动态SQL

实体类以及表结构 在mybatis-config.xml中注册mapper接口 -------------------------- 动态查询@SelectProvider EmployeeMapper接口 package Intefaceproxy.Dyno; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.SelectProvider; import model.Employe

Mybatis使用之动态SQL语句

Mybatis使用之动态SQL语句 一:简介 Mybatis动态SQL语句可帮助我们根据需要动态拼接SQL语句.主要在配置文件中使用<where> <if><choose><when><otherwise> <set> <trim><foreach>标签来实现. 二:具体使用方式 2.1 where 2.1.1 功能 语句的作用主要是简化SQL语句中where中的条件判断,where元素的作用是会在写入wher

mybatis入门-2 动态sql

MyBatis 的强大特性之一便是它的动态 SQL. 闲话少说,代码撸起来! IF 这基本上是where的必需品了 public interface BlogMapper { //这个地方需要注解 @Param 对这个参数进行命名,要不然if的时候获取不到参数名称 List<Blog> selectByTitle(@Param("title") String title); } <?xml version="1.0" encoding="

Mybatis框架之动态SQL书写方式小结

动态SQL简介 动态SQL是Mybatis框架中强大特性之一.在一些组合查询页面,需要根据用户输入的查询条件生成不同的查询SQL,这在JDBC或其他相似框架中需要在代码中拼写SQL,经常容易出错,在Mybatis框架中可以解决这种问题. 使用动态SQL元素与JSTL相似,它允许我们在XML中构建不同的SQL语句.常用元素为: 判断元素:if,choose 关键字元素:where,set,trim 循环元素:foreach if元素 if元素是简单的条件判断逻辑,满足指定条件时追加if元素内的SQ

mybatis入门基础----动态SQL

原文:http://www.cnblogs.com/selene/p/4613035.html 阅读目录 一:动态SQL 二:SQL片段 三:foreach 回到顶部 一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态sql,对查询条件进行判断,如果输入参数不为空才进行查询拼接. 1.3.UserMapper.xml 1 <!-- 用户信息综合查询

Mybatis学习笔记-动态SQL与模糊查询

需求:实现多条件查询用户(姓名模糊匹配, 年龄在指定的最小值到最大值之间) User.java实体类 public class User { private int id; private String name; private int age; //... } ConditionUser.java public class ConditionUser { private String name; private int minAge; private int maxAge; //... }

Mybatis学习之动态sql语句(7)

Mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的

6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)

动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些东西. 动态Sql主要有以下类型: if choose,when,otherwise trim,where,set foreach 这里主要介绍几个常见的where  if  foreach,直接贴代码了 1.where 这里的where有一个好处就是在拼接成功的时候,会自动去掉第一个and 2.i