mybits 动态Sql 查询

mybatis的核心就是动态sql.

什么是动态sql:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
转自:
https://www.cnblogs.com/shenxiaoquan/p/5779631.html

这篇文章讲解sql中的if语句。它可以对查询条件进行判断,如果输入参数不为空才进行查询条件的拼接。这篇文章的核心就是下面的这段代码。

相当于sql语句中的where关键字。
这个标签还有一个功能就是自动会去掉第一个and.,比如下面两句sql代码,如果第一个满足的那么就会去掉and这个关键字。

<where>
    <if test="userCustom!=null">
        <if test="userCustom.sex!=null and userCustom.sex!=''">
            and  user.sex= #{userCustom.sex}
        </if>
        <if  test="userCustom.username!=null and userCustom.username!=''" >
            and user.username=#{userCustom.username} 
        </if>
    </if>
</where>

下面给出u具体案例:

userMapper.xml代码如下:

 <?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="cn.itcast.mybatis.mapper.userMapper">

nanmespace:命名空间。 作用就是对sql进行分类话管理,理解Sal分离
注意:使用mapper代理方式,namespace有特殊重要的作用

< select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo"    resultType="cn.itcast.mybatis.po.UserCustom">
    SELECT id ,username FROM USER WHERE user.sex= #{userCustom.sex} AND user.username=#       
    {  userCustom.username} 
< /select>
这里的id要和Mapper接口里面的函数名字一模一样。parameterType表示输入的类型,resultType表示输出的类型,这里是匹配的实体类
    
<resultMap type="user" id="userResultMap">
    <!-- 
    id:表示查询结果集中唯一的标识。
    column:**查询出来的列名**
    property:type指定的pojo类型中的属性名
    最终resultMap对column和property作一个映射关系(对应关系)
     -->
    <id column="id_" property="id"/>
    <result column="username_" property="username"/>
</resultMap>

<!-- 
以上定义resultMap
将SELECT id id_,username username_ FROM USER 和User类中的属性做一个映射关系

type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识。
 -->

<select id="findUserByResultMap" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultMap="userResultMap">
    SELECT id id_,username username_ FROM USER 
<!-- 
where可以自动去掉条件中的第一个and
 -->
<where>
    <if test="userCustom!=null">
        <if test="userCustom.sex!=null and userCustom.sex!=''">
            and  user.sex= #{userCustom.sex}
        </if>
        <if  test="userCustom.username!=null and userCustom.username!=''" >
            and user.username=#{userCustom.username} 
        </if>
    </if>
</where>
</select>
</ mapper>

测试代码Mybatis_mappertest.java代码如下:

package cn.itcast.mybatis.first;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;


import cn.itcast.mybatis.mapper.userMapper;
import cn.itcast.mybatis.po.User;
import cn.itcast.mybatis.po.UserCustom;
import cn.itcast.mybatis.po.UserQueryVo;

public class Mybatis_mappertest {

private SqlSessionFactory sqlSessionFactory;
@Before
public void setup() throws IOException
{   String resource="SqlMapConfig.xml";
    InputStream inputStream= Resources.getResourceAsStream(resource);
    //主要是生成SqlsessionFactory。
    this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testMaper()
{
    SqlSession sqlSession=null;
    
    sqlSession=sqlSessionFactory.openSession();
    //生成代理类
    userMapper userMapper=sqlSession.getMapper(userMapper.class);
//创建包装对象,设置查询条件
    UserQueryVo userQueryVo=new UserQueryVo();
    UserCustom userCustom=new UserCustom();
 
    // 注意我把这里的sex注销掉了,也就是说sex没有值,那么我们用的是动态的sql语句,就是说sex不会被拼接进去吧
   // userCustom.setSex("1");
    userCustom.setUsername("王王");
    userQueryVo.setUserCustom(userCustom);
    
    userMapper.findUserByResultMap(userQueryVo);
    
    
   }
}

运行如下:

DEBUG [main] - ==> Preparing: SELECT id id_,username username_ FROM USER WHERE user.username=?

看到没,这里得sql语句中没有 and user.sex= #{userCustom.sex}这条语句。也就是说没有拼接上去。

我们再改一下:干脆把整个userCustom都不输入进去。

结果如下:

DEBUG [main] - ==> Preparing: SELECT id id_,username username_ FROM USER

看到没,这里的sql语句中什么where后面的语句都没有拼接上去了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值