写在前面
很久以前在有道云笔记上写的笔记,打算放弃它了,将笔记迁移到这里来。文章可能还有很多不足,请大家谅解,欢迎大佬提意见。
本文使用到的东西
- MyBatis
- java
1.正文
在映射其中,有select、update等标签,可以在这些标签中写sql查询语句
sql模糊查询实现
在映射器中不能直接连接字符串实现模糊查询,只能使用concat函数连接字符串
如下:
   <select id="findByOwner" parameterType="string" resultMap="HouseType">
      select house.*,pet.pname,pet.age,pet.feetcount from house,pet
      where house.owner like concat('%',#{owner},'%') and house.owner = pet.owner
   </select>
大于小于特殊符号表示:
在映射其中大于小于这些符号属于特殊符号不能直接输入,要转为对应的替代符号。
符号对应如下:
| 符号 | 编码 | 
|---|---|
| & | & | 
| < | < | 
| > | > | 
| " | " | 
| ' | ' | 
如输入
select count(*) from manage where closure < 5
应表示为:
select count(*) from manage where closure  < 5
动态SQL
在select、update等标签标签中存在
< if>标签
语法:
<if test="判断语句">
判断正确sql查询就包含内容....
</if>
- test属性表示判断语句的内容
- 在if标签的test中判断int类型的数据会报错,
- test中如果包含多条判断语句,语句之间用and、or连接
< where>标签
语法:
<where>
      自动给该内容添加“where”前缀,如果该内容以and、or开头,则自动删除and或or
</where>
- 可以用于联合if做动态sql,删除因为第一条if内容没显示在头部多出来的and、or
- where标签不会自动删除查询语句尾部的and或or
< set>标签
语法:
<set>
      自动给该内容添加“set”前缀,如果该内容以","结尾,则自动删除“,”
</set>
- 可以用于联合if做动态sql,删除因为最后一条if内容没显示在尾部多出来的“,”
- set标签不会自动删除查询语句头部的“,”
< trim>标签
语法:
<trim prefix="前缀" prefixOverrides="删除开头" suffixOverrides="删除结尾" suffix="后缀">
       自动给该内容添加prefix内的前缀,如果以prefixOverrides内容开头自动删除,如果以suffixOverrides内容结尾自动删除,自动添加suffix后缀
</trim>
- trim标签灵活性很大,可以替代和 标签的功能 
- prefix属性:自动给该标签内容添加一个前缀
- prefixOverrides属性:如果trim标签内容以prefixOverrides指定的内容开头自动删除
- suffix属性:自动给该标签内容添加一个后缀
- suffixOverrides属性:如果trim标签内容以suffixOverrides指定的内容结尾自动删除
< where>+< if>动态sql示例
--如果uname或password为空,则查询语句中不包含给该内容,并自动删除头部多出来的and
   <select id="find" parameterType="Userinfo" resultMap="UserinfoType">
      select * from userinfo
      <where> 
         <if test="uname!=null">
            uname =#{uname}
         </if>
         <if test="password!=null">
            and password=#{password}
         </if>      
      </where>
      limit 0,1
   </select>
< set>+< if>动态sql示例
--如果uname或password为空,则查询语句中不包含给该内容,并自动删除尾部多出来的“,”
   <update id="update" parameterType="Userinfo">
      update userinfo
      <set>
         <if test="uname!=null">
         uname=#{uname},
         </if>
         <if test="password!=null">
         password=#{password}
         </if>
      </set>
      where uid=#{uid}
   </update>
-- 用< trim>实现< where>标签的功能
    <select id="find" parameterType="Userinfo" resultMap="UserinfoType">
      select * from userinfo
      <trim prefix="where" prefixOverrides="and|or" suffix="limit 0,1">
         <if test="uname!=null">
            uname =#{uname}
         </if>      
         <if test="password!=null">
            and password=#{password}
         </if>
      </trim>        
   </select>
< trim>+< if>取代< set>+< if>示例
-- 用< trim>实现< set>标签的功能
   <update id="update" parameterType="Userinfo">
      update userinfo
      <trim prefix="set" suffixOverrides="," suffix="where uid=#{uid}">
         <if test="uname!=null">
         uname=#{uname},
         </if>
         <if test="password!=null">
         password=#{password}
         </if>
      </trim>     
   </update>
< foreach>标签获取列表参数
假如传入的直接是java.util.List类的List
实例:
那么我们要将List类添加入MyBatis-config.xml中的的别名:
<typeAlias type="java.util.List" alias="List"/>
接口的传入参数定义为List
   public List<Userinfo> findUname(List<String> para);
在主类中调用:
      List<String> unames = new ArrayList<String>();//创建对象
      unames.add("lswe");//添加数据
      unames.add("lswe2");//添加数据
      //使用接口,传入一个List<String>对象
      List<Userinfo> list = dao.findUname(unames);
映射器中对应该接口的查询内容:
   <select id="findUname" parameterType="List" resultMap="UserinfoType">
      select * from userinfo
      <where>        
         <foreach collection="list" item="uname" open="uname in(" close=")" separator=",">
                      #{uname}
         </foreach>
      </where>      
   </select>
- 上面实现的功能是 select * from userinfo where uname in('uname1','uname2',...)动态添加多个数据项
- collection属性表示传入的列表或集合参数
- item属性表示用于存储列表或集合中单个参数临时变量
- open属性表示列表项的前缀
- close属性表示列表项的后缀
- separator表示用separator中的内容分隔列表项
假如传入的是java.util.List类的复杂对象类
实例:
自己定义一个封装类:
package com.etc.entity;
import java.util.List;
public class ArrayPara
{
   private List<String> unames;
   public List<String> getUnames() {
      return unames;
   }
   public void setUnames(List<String> unames) {
      this.unames = unames;
   } 
}
那么我们要将封装的对象类添加入MyBatis-config.xml中的的别名:
   <typeAlias type="com.etc.entity.ArrayPara" alias="ArrayPara"/>
接口的传入参数定义为List
   public List<Userinfo> findUname(ArrayPara ap);
映射器中对应该接口的查询内容:
   <select id="findUname" parameterType="ArrayPara" resultMap="UserinfoType">
      select * from userinfo
      <where>         
      <!-- unames是我们自定义的封装类的属性名 -->
         <foreach collection="unames" item="uname" open="uname in(" close=")" separator=",">
                      #{uname}
         </foreach>
      </where>      
   </select>
在主类中调用:
      List<String> unames = new ArrayList<String>();//创建对象
      unames.add("lswe");//添加数据
      unames.add("lswe2");//添加数据
      ArrayPara ap=new ArrayPara();
      ap.setUnames(unames);
      //使用接口,传入自己的封装类ArrayPara
      List<Userinfo> list = dao.findUname(ap);
< choose>映射器中的if...else...
格式:
<choose>
        <when test="判断语句">
            判断为true执行
        </when>
        <otherwise>
            判断为false执行
        </otherwise>
    </choose>
示例:
<choose>
        <when test="xxx !=null and xxx != ''">
            and xxx like concat(concat('%', #{xxx}), '%')
        </when>
        <otherwise>
            and xxx like '**%'
        </otherwise>
    </choose>
