zoukankan      html  css  js  c++  java
  • Mybatis-技术专区-中的条件查询createCriteria example里面的条件

      之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可以一直不知道怎么用,到今天才开始知道怎么简单的用。

            在我们前台查询的时候会有许多的条件传过来:先看个例子:

    ContactExample example = new ContactExample();

    ContactExample.Criteria cri = example.createCriteria();

    // //////////////////////////////////////////////////////////

    if (this.objectAttrNullCheck(contact, "username"))

    cri.andUsernameEqualTo(contact.getUsername());

    if (this.objectAttrNullCheck(contact, "password"))

    cri.andPasswordEqualTo(contact.getPassword());

    ContactMapper vcontactMapper = sqlSession.getMapper(ContactMapper.class);

    List<Contact> returnList = vcontactMapper.selectByExample(example);

    return returnList;

      这是简单的用户登录的后台代码,example中有一个Criterria的方法,里面

    andUsernameEqualTo  
    andPasswordEqualTo

      都是在生成example的时候生成的。这两个方法是判断单值的。

    简单介绍下,都是百度的: 

    Criteria

      Criteria包含一个Cretiron的集合,每一个Criteria对象内包含的Cretiron之间是由AND连接的,是逻辑与的关系。

    oredCriteria

      Example内有一个成员叫oredCriteria,是Criteria的集合,就想其名字所预示的一样,这个集合中的Criteria是由OR连接的,是逻辑或关系。oredCriteria就是ORed Criteria。

    其他

      Example类的distinct字段用于指定DISTINCT查询。

      orderByClause字段用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定。

     

    import java.io.Reader;

    import java.util.ArrayList;

    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.apache.log4j.pattern.ClassNamePatternConverter;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import cn.itcast.ssm.mapper.ItemsMapper;

    import cn.itcast.ssm.po.ItemsExample;

    public class Student {

    public static void main(String[] args) throws IOException {

      /*方式一 */

      ItemsExample itemsExample1 = new ItemsExample();

      itemsExample1.or().andIdEqualTo(5).andNameIsNotNull();

      itemsExample1.or().andPicEqualTo("xxx").andPicIsNull();

      List<Integer> fieldValues = new ArrayList<Integer>();

      fieldValues.add(8);

      fieldValues.add(11);

      fieldValues.add(14);

      fieldValues.add(22);

      itemsExample1.or().andIdIn(fieldValues);

      itemsExample1.or().andIdBetween(5, 9);

      /* 方式二 criteria1与criteria2是or的关系 */

      ItemsExample itemsExample2 = new ItemsExample();

      ItemsExample.Criteria criteria1 = itemsExample2.createCriteria();

      criteria1.andIdIsNull();

      criteria1.andPriceEqualTo((float) 3);

      ItemsExample.Criteria criteria2 = itemsExample2.createCriteria();

      criteria2.andNameIsNull();

      criteria2.andIdGreaterThanOrEqualTo(5);

      itemsExample2.or(criteria2);

      //方式一和方式二是等价的

      // spring获取mapper代理对象

      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

      ItemsMapper itemsMapper = (ItemsMapper) applicationContext.getBean("itemsMapper");

      itemsMapper.countByExample(itemsExample2);

      // 获取SqlSessionFactory

      String resource = "SqlMapConfig.xml";

      Reader reader = Resources.getResourceAsReader(resource);

      SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);

      // 获取SqlSession

      SqlSession sqlSession = sqlMapper.openSession();

      }

    }

      javaBeans类的成员变量一般称为属性(property)。对每个属性访问权限一般定义为privateprotected,而不是定义为public的。注意:属性名必须以小写字母开头。 

      对每个属性,一般定义两个public方法,它们分别称为访问方法(getter)和修改方法(setter),允许容器访问和修改bean的属性。 

          public String getColor();

          public void setColor(String);

      一个例外是当属性是boolean类型时,访问器方法应该定义为isXxx()形式。

    对象类型

      虽然可以明确的引用对象的属性名了,但如果要在if元素中测试传入的user参数,仍然要使用_parameter来引用传递进来的实际参数,因为传递进来的User对象的名字是不可考的。如果测试对象的属性,则直接引用属性名字就可以了。

    测试user对象:

    <if test="_parameter != null">

    传入对象属性

    <if test="name != null">

    map类型

      传入map类型,直接通过#{keyname}就可以引用到键对应的值。使用@param注释的多个参数值也会组装成一个map数据结构,和直接传递map进来没有区别。

    mapper接口:

    int updateByExample(@Param("user") User user, @Param("example") UserExample example);

    sql映射:

    <update id="updateByExample" parameterType="map" >

        update tb_user set id = #{user.id,jdbcType=INTEGER}, ...

     <if test="_parameter != null" >

       <include refid="Update_By_Example_Where_Clause" />

     </if>

      注意这里测试传递进来的map是否为空,仍然使用_parameter

         再来看看我的项目中的,我写的是项目的接口开发,前端要穿写条件进来查询,前端的传参格式:

    传参格式:

     

     {

      "currPage": 0,

      "startRow": 0,

      "pageSize": 20,

      "map":{

        "andStealtollTypeEqualTo":1

        }

    }

      注意map里面的传的参数格式:全部是example里面的参数格式,如果还要传入什么参数直接在里面加(相当于前端传过来的条件),这些条件全部放进map里面。

     

      HisVehReviewHandleExample example = new HisVehReviewHandleExample();

      example.setPage(page);//将前面传过来的page数据放进example中

      popQeuryExample(example.getPage().getMap(), example.createCriteria());

      vehReviewService.queryPage(example);

      Map<String, Object> map = new HashMap<String, Object>();

      map.put("page", page);

      //map.put("typeCount", value);

      result.setData(map);

      writeJson(response, JSON.toJSON(result));

    service层:

     public Page<HisVehReviewHandle> queryPage(HisVehReviewHandleExample example) {

      Page<HisVehReviewHandle> page = example.getPage();

      List<HisVehReviewHandle> list = HisVehReviewHandleMapper.selectByExample(example);

      System.out.println("查询list成功"+list.get(0).getStealtollType()+" "+list.get(0).getStealtollTypeName());

      int count = HisVehReviewHandleMapper.countByExample(example);

      page.setRows(list);

      page.setTotalCount(count);

      return page;

    }

    sql语句查询exaple的:

    <select id="selectByExample" parameterType="com.vrview.ssm.model.example.HisVehReviewHandleExample" resultMap="BaseResultMap">

    <!--

    WARNING - @mbggenerated

    This element is automatically generated by MyBatis Generator, do not modify.

    This element was generated on Wed Jan 17 10:03:58 CST 2018.

    -->

    <include refid="OracleDialectPrefix" />

      select

      <if test="distinct">

      distinct

      </if>

        <include refid="Base_Column_List" />

      from HIS_VEH_REVIEW_HANDLE

      <if test="_parameter != null">

        <include refid="Example_Where_Clause" />

      </if>

      <if test="orderByClause != null">

        order by ${orderByClause}

      </if>

        <include refid="OracleDialectSuffix" />

    </select>

    sql语句,用来查询数量的:

    <select id="countByExample" parameterType="com.vrview.ssm.model.example.HisVehReviewHandleExample" resultType="java.lang.Integer">

      select count(*) from HIS_VEH_REVIEW_HANDLE

      <if test="_parameter != null">

        <include refid="Example_Where_Clause" />

      </if>

    </select>

      关于参数_paramerter:参考:http://blog.csdn.net/u014476019/article/details/45878771

      这部分就是对criteria里面的参数进行判断,进而根据条件查询。

    <sql id="Example_Where_Clause"><where>

    <foreach collection="oredCriteria" item="criteria" separator="or">

    <if test="criteria.valid">

      <trim prefix="(" prefixOverrides="and" suffix=")">

      <foreach collection="criteria.criteria" item="criterion">

      <choose>

        <when test="criterion.noValue">//没有值

          and ${criterion.condition}

        </when>

        <when test="criterion.singleValue">//单个值

          and ${criterion.condition} #{criterion.value}

        </when>

        <when test="criterion.betweenValue">//区间值,范围查询

          and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}

        </when>

        <when test="criterion.listValue">//一组值

          and ${criterion.condition}

          <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">

            #{listItem}

          </foreach>

        </when>

      </choose>

    </foreach>

    </trim>

    </if>

    </foreach>

    </where>

    </sql>

  • 相关阅读:
    xdg-open filename 以相应的程序 打开文件
    列出zip文件内全部内容 当前目录下的所有文件压缩成zip格式的文件(file.zip)
    网线的制做
    多少天以后的时期和多少天以前的日期
    更数数据库用户密码
    tengine-2.1.0 源码安装
    inode
    mysql 查看用户的权限
    SQL Server 2008 R2占用内存越来越大两种解决方法
    SQL死锁知识及解决办法
  • 原文地址:https://www.cnblogs.com/liboware/p/12019746.html
Copyright © 2011-2022 走看看