动态SQL查询,多条件,分页

<?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.bdqn.mybatis.mapper.CameraMapper">
<!-- 关键是where部分,得根据条件的有效性进行判断   使用where标签动态做-->
	<select id="findCamera" resultType="Camera">
		SELECT
			id,
			typeId,
			brandId,
			title,
			pixel,
			zoom,
			price,
			color
		FROM Camera
		<where>
			<if test="typeId!=null">typeId=#{typeId}</if>

			<if test="brandId!=null">and brandId=#{brandId}</if>
			<!-- 由于标签就是由<>组成的,在xml文件中是具有特殊含义的字符,在解析xml时发生错误,解析器xmlcdata块中是普通的字符 -->
			<if test="pixel!=null"><![CDATA[and pixel>=#{pixel}]]></if>
			<if test="zoom!=null"><![CDATA[and zoom>=#{zoom}]]></if>
			<if test="price!=null"><![CDATA[and price<=#{price}]]></if>
			<if test="color!=null">and color like #{color}</if>
			<if test="title!=null">and title like #{title}</if>
		</where>
		ORDER BY id

	</select>
</mapper>
package cn.bdqn.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import cn.bdqn.mybatis.entity.Camera;
import cn.bdqn.mybatis.entity.Grade;
import cn.bdqn.mybatis.entity.User;

//通过接口里边的抽象方法来调用对应的语句
//接口对应映射文件----把SQL语句的命名空间设置成接口的完整类名

//相当于原来dao层,我只需要定义dao接口,那具体的实现类现在不用咱自己写了,只需拿到mapper接口类即可   省了很多事,提高开发效率
public interface CameraMapper {

	 //根据条件搜索,mybatis不会自动识别我要对应到哪个属性上,需要添加注解
	public List<Camera> findCamera(
			@Param("typeId") Long typeId,
			@Param("brandId") Long brandId,
			@Param("pixel") Integer pixel,
			@Param("zoom") Double zoom,
			@Param("price") Double price,
			@Param("color") String color,
			@Param("title") String title
			);

}


mybatis自带的分页机制不推荐使用:首先会用sql语句,把数据库中所有数据加载回内存,再用我指定的页号、每页行数在内存中把那一页的数据提取出来。效率差。

更好的分页,在查询的时候,把我想看的分页语句只显示出来。自己手写底层分页语句。借助插件机制,自己写一个分页插件(可能公司有自己的分页插件)

第一步:添加分页插件

 mybatis的特点就是专注于执行语句的效率

在配置文件中,环境上边配置插件

<plugins>
	  <plugin interceptor="cn.bdqn.mybatis.plugin.PaginationInterceptor">
	    	<property name="dialectClass" value="cn.bdqn.mybatis.plugin.MySQLDialect"/>    //分页插件支持两种方言类  oracle和mysql
	  </plugin>
</plugins>
public List<Camera> findCamera(              //cn.bdqn.mybatis.plugin.中存在PageParam这个类
			@Param("pageParam") PageParam param,  名字必须叫"pageParam"
			@Param("typeId") Long typeId,
			@Param("brandId") Long brandId,
			@Param("pixel") Integer pixel,
			@Param("zoom") Double zoom,
			@Param("price") Double price,
			@Param("color") String color,
			@Param("title") String title
			);
时间: 2024-10-12 21:46:31

动态SQL查询,多条件,分页的相关文章

kettle中实现动态SQL查询

kettle中实现动态SQL查询 在ETL项目中,通常有根据运行时输入参数去执行一些SQL语句,如查询数据.本文通过kettle中的表输入("table input")步骤来说明动态查询.参数查询.示例代码使用内存数据库(H2),下载就可以直接运行,通过示例学习更轻松. SQL查询语句中占位符绑定字段值 第一个接近动态语句的是大家熟悉的从SQL代码中执行,开始写一个SQL查询,包含一些占位符,然后绑定值到占位符,使之成为一个有效的查询并执行.根据需要可以绑定多个值并循环执行.本示例的名

一次动态sql查询订单数据的设计

订单数据一般是变化比较多的数据,查询条件也是比较复杂,如果没有一个规则解释,写接口的变动就会比较频繁:由于个人不喜欢在业务端使用拼接sql的方式,另外本身是做安全出身,业务端的sql拼接容易sql注入,所以不考虑使用:为了满足这个特性,将订单的条件进行了一次划分: 状态.用户.时间.公司.上车地点.下车地点: 第一步: 先处理状态查询, 状态查询定义在t_om_group表中,后台人员可以手动添加状态分组,前端业务只需要状态分组对应哪些状态即可:如: group_id 1 对应 order_st

JPA分页查询与条件分页查询

情有独钟的JPA 平时在写一些小项目时,比较喜欢引用 Spring Data Jpa,其实还是图他写代码快~在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用 jpa 进行多条件查询以及查询列表分页呢? 关于JPA的使用 关于 jpa 的使用,下面2步简单过一下,详细资料,小伙伴自行搜索一下吧~ 1.导入依赖 <dependency>    <groupId>org.springframework.boot</groupId>    <arti

mybatis 动态SQL查询总结

背景 ××项目需要提供系统部分函数第三方调用接口,基于安全性和避免暴露数据库表信息的基础上进行函数接口的设计,根据第三方调用身份的权限提供某张表的自定义集合.本项目基于mybatis的持久层框架,支持定制化的SQL,这样可以避免拼接sql语句的痛苦.例如拼接时要确保不能添加空格,还要注意去掉列表的最后一个列名的都逗号.基于OGNL的表达式的mybatis框架可以彻底解决这种痛苦. 动态返回mysql某张表指定列的名字,类型和注释 <select id="queryColumns"

MyBatis的动态SQL查询-让查询更灵活多变!

序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护

获取动态SQL查询语句返回值(sp_executesql)

在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值查询Cost值(表名不确定但表结构确定,如下面的Product表) 如果不考虑获取返回值,我们这样写即可: declare @tableName varchar(50) declare @id varchar(10) declare @cost numeric(18,2) declare @sql

动态SQL之、条件判断(转)

错误方式一: 在mybatis的动态sql语句中使用<if>标签可以判断sql中的条件是否成立. <select id="getPerson" resultType="com.lzj.bean.Employee"> select * from tbl_employee where <if test="id!=null"> id=#{id} </if> <if test="lastNa

Oracle -Mybatis动态SQL查询分页的实现

首先看SQL 怎么写 select * from ( select a.*,ROWNUM rn from ( 最底层查询语句 ) a where ROWNUM <= #{endCol} ) where rn > #{startCol} 注意:Mybatis中 < 是小于号  >是大于号 当然 我们还需要 select count(*) 最底层查询语句来得到结果集的总数.然后再换算出 endCol 和 startCol 换算代码如下: //int totalRecord= 总条数;

Hibernate动态SQL查询

一.需求背景 给hibernate插上ibatis动态查询的翅膀,既保留crud的简洁性,又能收获ibatis的特性. 二.ibatis的动态查询 1 <select id="findUser" resultClass="User"> 2 SELECT * From User 3 <dynamic prepend="WHERE"> 4 <isNull property="id"> 5 id