mysql 查询多条件查询

ibatis动态多条件查询及模糊查询(oracle,mysql,sql)
这几天在学习使用IBATIS突然要使用模糊查询,以及动态多个条件查询,按照自己的想法试了很久,都没解决这个问题.
首先是模糊查询的问题,开始时我使用如下条件:select * from user where name like
'%#value#%'. 可是怎么也不行,好像还报错了.后来在网上找到了解决方法,就是使用$来代替#号.
1&写成: like '%$value$%' 就可以了,&!--
模糊查询不能用#,#是用prepareStatement的?插入参数,$是文本替换 --&,
2&同时还找到另一个方法,但是那个方法我试了很久,就是不行,方法为: like '%' ||
#value# || '%' , 查询出来的结果居然是全部.后来在网上有人说,这个写法是oracle的写法,
3&如果是mysql,则应该写成: name like
CONCAT('%',#value:VARCHAR#,'%') ,不过我没试用过,反正有一个方法成功就可以了.
第一个方法我试用成功,后面的也就没试过,有兴趣的朋友可以试试
第二个大问题就是多条件组合查询,开始时,我也在想这个问题,总不能为每一个查询都写一个SQL配制吧,这样太........后来参考一些文档,发现,原来IBATIS里提供了动态映射.示例如下:
在ibatis中使用安全的拼接语句,动态查询
ibatis比JDBC的优势之一,安全高效
说明文字在注释中
&select id="selectAllProducts"
parameterClass="Product"
resultMap="ProductResult"&
select id,note from Product
&dynamic prepend="WHERE"&
&!-- isNotNull判断参数是否存在,Integer类型
&isNotNull property="id"&
isGreaterThan判断参数是否大于compareValue,isGreaterEquals是大于等于
&isGreaterThan prepend=" and " property="id"
compareValue="0"&
&/isGreaterThan&
&/isNotNull&
&!-- isNotEmpty判断字串不为空,isEmpty可以判断字串为空
&isNotEmpty prepend=" and "
property="note"&
&!-- 模糊查询不能用#,#在是用prepareStatement的?插入参数,$是文本替换
note like '%$note$%'
&/isNotEmpty&
&/dynamic&
用Map传参数
&select id="selectAllProducts"
parameterClass="java.util.HashMap"
resultMap="ProductResult"&
select id,note from Product
&dynamic prepend="WHERE"&
&!-- isPropertyAvailable判断属性是否有效
&isPropertyAvailable
property="id"&
&isNotNull property="id"&
isLessThan判断参数是否小于compareValue,isLessEquals是小于等于
&isLessThan prepend=" and " property="id"
compareValue="10"&
&/isLessThan&
&/isNotNull&
&/isPropertyAvailable&
&/dynamic&
&!--------------------------------------------------------------------几个常用属性--&
&isPropertyAvailable& 属性是存在
&isNotPropertyAvailable& 属性不存在
&isNull& 属性值是null
判断Collection.size&1或String.length()&1
&isEqual& 等于
&isNotEqual& 不等于
&isGreaterThan& 大于
&isGreaterEqual& 大于等于
&isLessThan& 小于
&isLessEqual& 小于等于
以下是引用一个文章,大家可以参考一下
/edmond80/blog/item/44b31afa42aef18b9f51467e.html
iBatis 开发指南告诉我们,当 Person 对象的 name 属性不为 null 时启用 name 查询条件在映射文件
person.xml 中的配置为
&select id="getPersonsByName"
resultClass="com.unmi.Person"&
select id as id,name as name,passwd as passwd from person
&dynamic prepend="WHERE"&
&isNotNull prepend="AND"
property="name"&
(name like #name#)
&/isNotNull&
&/dynamic&
&select id="getPersonsByName"
resultClass="com.unmi.Person"& select id as id,name
as name,passwd as passwd from person &dynamic
prepend="WHERE"& &isNotNull
prepend="AND" property="name"& (name like #name#)
&/isNotNull&
&/dynamic&
再用如下的代码调用
Person person = new Person();
person.setName("unmi");
List list = sqlMap.queryForList("getPersonsByName", person);
Person person = new Person(); person.setName("unmi"); List list =
sqlMap.queryForList("getPersonsByName", person);
执行效果翻译成 sql 语句就是
select * from person where name like 'unmi'
select * from person where name like 'unmi'
这实际上是一个完全匹配的查询,与用等号写成如下语句是一致的
select * from person where name = 'unmi'
select * from person where name = 'unmi'
我们之所以要用 like 谓词,一般都想实现模糊查询,比如说 name 以 'unmi' 开始、结束或包含 'unmi'
的记录,如下
select * from person where name like 'unmi%';
select * from person where name like '%unmi';
select * from person where name like '%unmi%';
select * from person where name like 'unmi%'; select * from person
where name like '%unmi'; select * from person where name like
也就是如上的 like 语义在 person.xml中应该怎么表述呢?我曾经是想当然的尝试把
(name like #name#) 写成 (name like '%#name#%') 或 (name like %#name#%)
,都没法通过,分别报错
java.sql.SQLException: Invalid argument in JDBC call: parameter
index out of range: 1
java.sql.SQLException: Unexpected token: % in statement [ select
那么正确的写法是什么呢?在网上找到一个解答 How do I use LIKE in my queries,方法有两种
1. 是把上面 (name like '%#name#%') 的 # 换成 $, 也就是 (name like
'%$name$%')
2. 是用 || 连接字符串的方式,写成 (name like '%' || #name# || '%')
但却不能写成 (name like '%'||$name$||'%') ,不能又要出错
java.sql.SQLException: Column not found: UNMI in statement [select
总结一下,在 iBatis 中用 like 的模糊查询的配置如下(两种方式)
&select id="getPersonsByName"
resultClass="com.unmi.Person"&
select id as id,name as name,passwd as passwd from person
&dynamic prepend="WHERE"&
&isNotNull prepend="AND"
property="name"&
(name like '%$name$%')
&!-- (name like '%'||#name#||'%')
&/isNotNull&
&/dynamic&
&select id="getPersonsByName"
resultClass="com.unmi.Person"& select id as id,name
as name,passwd as passwd from person &dynamic
prepend="WHERE"& &isNotNull
prepend="AND" property="name"& (name like
'%$name$%') &!-- (name like '%'||#name#||'%')
--& &/isNotNull&
&/dynamic&
不知细心的诸位注意到没有,这同时也是我在组织上面文字时产生的疑问:
1. 写成 (name like '%'||$name$||'%') 为什就不行呢?# 和 $ 有什么区别呢?
2. 还有明明是写成的 unmi,为什么报错的时候又是全大写的 UNMI 呢?
具体的异同我们可能还需从源代码中找,简单的只要知道,$name$ 是字面意义的替换,这种形式要注意 SQL 注入的漏洞;#name#
是带类型的替换。至于unmi被转换成大写,还需再研究研究,对于以上两个疑问必要时还可以发挥一下。
感谢百度空间的dongmingdiyi
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。求大神,Mysql的多条件查询_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:219,071贴子:
求大神,Mysql的多条件查询收藏
数据库中有一张表,有6个字段,分别为:id、name、age、position、c_id(所属公司id)、d_id(所属部门id),现在想写一个多条件查询,任意输入零项或六项,就能查到结果,用了如下语句select * from Workers where
name like?||'%' or position like ?||'%' or age like ? ||'%' or d_id like ?||'%' or c_id like ?||'%' or id like ?||'%'首先,这个语句肯定是错的,因为当输入两个条件时,就会发现查询的结果跟自己想的不一样,个人想要获得的是同时满足条件的,但从语句可以看出,他是利用了or去查询。本人是做后台的,数据库这块实在是不懂,请问,有什么办法可以实现我的预想么?那个when case语句看不大懂
select * from Workers where name like?||'%' or position like ?||'%' or age like ? ||'%' or d_id like ?||'%' or c_id like ?||'%' or id like ?||'%'看你需求:应该是看你给什么字段数据了。然后去拼接SQL例如:public &T& getData(6个字段参数){对每个字段判断是否为空。不为空就拼接sql}
觉得像是未毕业的…
已找到解决方法,自己直接拼SQL语句了,对输入条件进行判断,如果不为空就拼上该SQL语句,比那个WHEN CASE 容易多了昨天不能上网,现在才看到二楼的方案,真心谢谢了,耽误了好长时间
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或基于JDBC的多条件动态查询实现 - lixor - ITeye技术网站
在Web开发中,多种条件的综合查询非常常见,应对这种业务需求我们通常使用下面几种方法来实现:
PS:
i.(Hibernate的条件查询Criteria Queries当然是非常方便的,本文仅探讨JDBC方式的使用)
ii.(欢迎高手、大拿们拍砖,请勿人身攻击)
1.直接将参数值拼接到SQL语句中,然后进行查询。
这种方式的安全性应当说是比较差的,一不小心就被SQL注入了。虽然可以先过滤参数值中的特殊字符,但总感觉不是很优雅。
2.先使用占位符'?'来拼接SQL,然后再通过条件判断去填充PreparedStatement。
用过这种方式的TX,都知道这种方式的复杂性。先要在拼SQL时判断一次,然后还要在填充pst时再判断一次,麻烦。
3.存储过程
本人一直不爽存储过程,以前有一个项目从MySQL迁移到MSSQL,后来又换成ORACLE,最后产品的不同版本运行在不同数据库上,当时差点要了亲命了。
其实讲这么多无非就是想要一种相对优雅简单的查询方式,前一段看到.NET中的SQLHelper受到一些启发,然后就写了这么一个类似的组件(其实我Google了半个小时都没有找到符合要求的)。
基本思想:
1.在控制器中(Servlet/Action etc...)中将查询表单中的参数值添加到查询条件列表中
2.在DAO(你明白的)中设置基本SQL
3.迭代查询条件列表,使用占位符拼接SQL
4.在DAO中拿SQL创建PreparedStatement
5.迭代查询条件列表,为pst填充值
6.接下来,没有特殊的地方了,就是正常的executeQuery,while(rs.next()){...}
将第1/2/3/5步骤的功能提取出来做成一个工具类,然后其它地方就可以随意使用了,嘿嘿
好了,不啰嗦了直接上代码吧
Parameter.java
* 查询参数类,用于表示条件参数对象
* @author Lixor(
public class Parameter{
* @param field 数据库字段名
* @param operator 数据库操作符 =、&=、&、like etc...
* @param value 参数值 Object
public Parameter(String field,String operator, Object value) {
this.field =
this.value =
this.operator =
public String getField() {
public Object getValue() {
public String getOperator() {
DynamicQuery.java
* 动态查询工具类,用于拼接SQL、填充pst
* @author Lixor(
public class DynamicQuery {
private static Logger logger=Logger.getLogger(DynamicQuery.class);
private String templet = " AND %s %s ?";
private String baseS
private ArrayList&Parameter& parameters = new ArrayList&Parameter&();
public DynamicQuery() {
* 要求baseSql带有where条件
* @param baseSql
public void setBaseSql(String baseSql) {
this.baseSql = baseS
public void addParameter(Parameter parameter) {
parameters.add(parameter);
public String generateSql() {
StringBuffer buffer = new StringBuffer(baseSql);
for (Parameter p : parameters) {
buffer.append(String.format(templet, p.getField(), p.getOperator()));
logger.debug(buffer);
return buffer.toString();
public void fillPreparedStatement(PreparedStatement pst) throws SQLException {
int count = 1;
for (Parameter p : parameters) {
pst.setObject(count, p.getValue());
示例:查询产品信息
QueryServlet.java
DynamicQuery query=new DynamicQuery();
query.addParameter(new Parameter("p.name" ,"like","电视"));
query.addParameter(new Parameter("p.type_id","=" ,1));
query.addParameter(new Parameter("p.productDate" ,"&=",java.sql.Date.valueOf("")));
query.addParameter(new Parameter("p.price" ,"&=",1000.0f));
ProductDao dao=new ProductDao();
List&Product& productList=dao.query(query);
request.setAttribute("productList",productList);
ProductDao.java
public List&Product& query(DynamicQuery query) {
List&Product& productList = new ArrayList&Product&();
String sql = "SELECT p.id,p.name,p.price,p.productDate,p.image,p.type_id,t.name,p.description FROM tbl_product p,tbl_type t WHERE p.type_id=t.id";
query.setBaseSql(sql);
sql = query.generateSql();//如果想排序,自行在sql后添加
Connection conn =
conn = DbUtil.getConnection();
PreparedStatement pst= conn.prepareStatement(sql);
query.fillPreparedStatement(pst);//填充pst
ResultSet rs = pst.executeQuery();
while (rs.next()) {
Product product = new Product();
productList.add(product);
rs.close();
pst.close();
} finally {
if (conn != null) {
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return productL
感谢“jl580650”提出的pst.setObject建议,我之前是用反射做的。
setObject不就好了 嗯,对的,代码已修改
浏览: 45317 次
来自: 合肥
&div class=&quote_title ...
还有一种更好的方法,修改上面server.xml中protoc ...
&Connector port=&44 ...
LZ下的是哪个呢 里面好几个东东 在数据库查询时,常常需要排序,而有时排序条件可能有多个。
  如数据库:
  a&&&&& b
  1&&&&& 103
  1&&&&& 101
  2&&&&& 201
  2&&&&& 203
  1&&&&& 102
  2&&&&& 202
  排序后:&&&&&& a&&&&& b
  1&&&&& 103
  1&&&&& 102
  1&&&& 101
  2&&&&& 203
  2&&&&& 202
  2&&&&& 201
  语句:
  SELECT A.a , A.b FROM TABLE A ORDER BY A.a& ASC , A.b DESC
  其中ASC连接多条排序,且与后一条查询之间有逗号隔开!
【】【】【】【】
ISBN编号:&8
出版时间:&2013-3
出版社:&中国人事出版社
定价:¥45 优惠价:¥45&&ISBN编号:&9
出版时间:&2013-4
出版社:&中国人事出版社
定价:¥45 优惠价:¥45&&
????????????
????????????
         Copyright ©
() All Rights Reserved举例如下:& & 数据表为DemoTable,字段有id, condition1,condition2,condition3,condition4,condition5& & 要求是查询DemoTable中,condition1,condition2,condition3,condition4,condition5五个字段中符合任意两个或两个以上的条件的内容。& & 可使用case when来实现这个条件,需要嵌套子查询语句& & sql语句代码示例如下:& & 复制代码代码如下:& & SELECT * FROM DemoTable& & WHERE ((SELECT CASE 1 WHEN condition1满足条件 THEN 1 ELSE 0 END FROM DemoTable )& & +(SELECT CASE 1 WHEN condition2满足条件 THEN 1 ELSE 0 END FROM DemoTable)& & +(SELECT CASE 1 WHEN condition3满足条件 THEN 1 ELSE 0 END FROM DemoTable)& & +(SELECT CASE 1 WHEN condition4满足条件 THEN 1 ELSE 0 END FROM DemoTable)& & +(SELECT CASE 1 WHEN condition5满足条件 THEN 1 ELSE 0 END FROM DemoTable))>=2& & 您可能感兴趣的文章:MySQL 的CASE WHEN 语句使用说明MySQL的CASE WHEN语句的几个使用实例& & QQ空间
百度搜藏更多& & Tags:MySQL 多条件查询& & 复制链接收藏本文打印本文关闭本文返回首页& & 上一篇:JDBC连接MySQL出现的问题& & 下一篇:21分钟 MySQL 入门教程& & 相关文章Windows环境下重置mysql密码操作命令MySql报错Table mysql.plugin doesn’t exist的解决方法MySQL数据库MyISAM存储引擎转为Innodb的方法MySQL不支持InnoDB的解决方法mysql如何根据汉字首字母排序mysql登录遇到ERROR 1045问题解决方法Windows服务器下MySql数据库单向主从备份详细实现步骤分享修改MySQL数据库中表和表中字段的编码方式的方法mysql免安装制作使用说明mysql下修改engine引擎的方法& & 文章评论& & 最 近 更 新& & mysql 有关“InnoDB Error ib_logfile0 omysql error 1130 hy000:Host''localhostMySql获取某个字段存在于哪个表的sql语句解析如何使用Zend Framework 连接数据库使用mysql中遇到的几个问题Mysql5.5 InnoDB存储引擎配置和优化MySQL 存储过程的基本用法介绍MYSQL主从库不同步故障一例解决方法MySql存储过程异常处理示例代码分享mysql千万级数据大表该如何优化?& & 热 点 排 行& & mysql安装图解 mysql图文安装教程超详细mysql left join,right joCan''t connect to MySQL serverMysql命令行导入sql数据MYSQL 数据库导入导出命令Mysql字符串截取函数SUBSTRING的MySQL数据库备份与恢复方法MySQL server has gone away 问题windows下mysql忘记root密码的解MySQL日期数据类型、时间类型使用
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益

我要回帖

更多关于 mysql模糊查询 的文章

 

随机推荐