您的位置:首页 > 数据库

Mybatis动态SQL 条件查询,批量删除

2017-04-29 17:02 951 查看
比如说某宝的搜索。可以添加选择的嘛。也就是where 后面的条件。如果有12种条件。要是全一个一个写那是要写很多哦。mybatis就有动态sql。根据条件组合sql语句。

首先创建个前端页面

<!DOCTYPE html>
<html>
<head>
<title>hight_search.html</title>

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

</head>

<body>
标题:<input type="text" id="title">
状态:<select id="status">
<option value="0">全部</option>
<option value="1">正常</option>
<option value="2">删除</option>
</select>
<br/>

开始日期:<input type="text" id="begin">
结束日期:<input type="text" id="end">
<input type="button" id="searchBtn" value="搜索">
<hr/>
结果列表
<ul id="ul">
<li></li>
</ul>
</body>

<script type="text/javascript" src="js/jquery-1.11.1.js"></script>
<script type="text/javascript">
var searchBtn = $("#searchBtn");
var status;
$("#status").change(function(){
status= $(this).val();});;
searchBtn.click(function(){
var title = $("#title").val();

var begin =$("#begin").val();
var end = $("#end").val();

$.ajax({
url:"http://localhost:8080/yunnote/note/hightSearch.do",
type:"post",
data:{"title":title,"status":status,"beginDate":begin,"endDate":end},
dataType:"json",
success:function(result){
var list = result["data"];

var ul = $("#ul");
ul.empty();
var length = list.length;
var $li = $("<li>"+"数量:"+length+"</li>");
ul.append($li);
for(i=1;i<list.length+1;i++){
var t = list[i].cn_note_title;
var $li = $("<li>"+t+"</li>");
ul.append($li);
}//for

}//success
});

});

</script>

</html>




那些标题啊。日期啊。状态就是where后面的条件

sql语句怎么实现呢

用了标签。类似jsp中的标签

<!-- 组合查询 -->
<select id="hightSearch" parameterType="map" resultType="yunnote.entity.Note">
select * from cn_note
<where><!-- 用where标签,不然如果直接写where后面如果第一个没有,那么后面的就有and 语句不对。用where标签可以解决,过滤掉and -->
<!-- 这个里面的直接就是用到map里面的key -->
<if test="title!=null">
cn_note_title like #{title}
</if>
<if test="status!=null">
and   cn_note_status_id= #{status}
</if>
<if test="beginDate!=null">
and   cn_note_create_time>=#{beginDate}
</if>
<if test="endDate!=null">
and   cn_note_create_time<=#{endDate}
</if>
</where>

</select>


要注意的是where 标签。

然后 service

public NoteResult hightSearch(String title, String status, String beginDate,
String endDate) {
// TODO Auto-generated method stub
Map params = new HashMap();
//如果有根据标题搜索就添加%% 来模糊查询
if(title!=null&&!"".equals(title)){
title = "%"+title+"%";

params.put("title", title);
}

//如果选择的不是全部,就添加参数
if(status!=null&&!"0".equals(status)&&!"".equals(status)){
params.put("status", status);
}

if(beginDate!=null&&!"".equals(beginDate)){
//将其时间字符串转成long
Date beDate=java.sql.Date.valueOf(beginDate);
params.put("beginDate", beDate.getTime());

}

if(endDate!=null&&!"".equals(endDate)){
Date enDate = java.sql.Date.valueOf(endDate);

params.put("endDate", enDate.getTime());
}

List<Note> notes = noteDao.hightSearch(params);
NoteResult result = new NoteResult();
result.setStatus(0);
result.setMsg("查询成功");
result.setData(notes);
return result;
}


Controller

package yunnote.Controller.note;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import sun.security.x509.EDIPartyName;

import yunnote.entity.NoteResult;
import yunnote.service.NoteService;
@Controller
@RequestMapping("/note")
public class HightSearchController {
@Resource
private NoteService noteService;
@RequestMapping("hightSearch.do")
@ResponseBody
public NoteResult execute(String title, String status, String beginDate,
String endDate){

NoteResult result =noteService.hightSearch(title, status, beginDate, endDate);

return result;
}
}








时间的话传过来的是字符串。利用java.sql.Date.valueOf的方法转成Date。与数据库中的时间进行比较。







批量删除

批量的删除利用的还是标签

<!-- 批量删除 -->

<delete id="deleteNotes">
delete from cn_note
where cn_note_id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>


删除,然后for循环, collection指的是说传入的是数组。item是数组的每个元素。open是说在循环的开始加上什么。这里加上( close是循环结束加上什么。这里是)形成正常的删除语句。然后separator是分隔符。形成最后的删除语句。

最后形成的语句
delete  cn_note where cn_note_id in(1,3,5)


写dao

public int deleteNotes(String[] ids);


测试类

package yunnote.test;

import yunnote.Dao.NoteDao;

public class TestDeleteNotes extends TestBse{

public static void main(String[] args){

NoteDao noteDao = getContext().getBean("noteDao",NoteDao.class);
String [] ids ={"09f60aeb-a573-4fcf-b39f-903e1536e762","0a233251-8991-493c-87c8-d36e9433eae3"};
int rows =noteDao.deleteNotes(ids);
System.out.println("删除了 :"+rows+"行");
}

}




期间遇到了一些错误。使用了工具seay源代码审计的插件 查看mysql执行的语句的工具。很方便。可以看到每次请求的sql语句。比对看有无错误。

下载地址:https://pan.baidu.com/s/1i3Jw2uL#list/path=%2F

理解的可能比较浅显,会继续学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: