假如有如下的关于书籍基本信息的表:

DROP DATABASE IF EXISTS `books`;
CREATE DATABASE `books`;
USE books; DROP TABLE IF EXISTS `book`; CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL,
`author` varchar(64) DEFAULT NULL,
`press` varchar(64) DEFAULT NULL,
`douban` FLOAT DEFAULT NULL,
`isbn` varchar(13) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO `book` (`name`,`author`,`press`,`douban`,`isbn`) VALUES('Java编程思想 第4版','(美)Bruce Eckel著','机械工业出版社',9.1,'9787111213826'); INSERT INTO `book` (`name`,`author`,`press`,`douban`,`isbn`) VALUES('深入理解Java虚拟机 JVM高级特性与最佳实践','周志明著','机械工业出版社',8.8,'9787111421900'); INSERT INTO `book` (`name`,`author`,`press`,`douban`,`isbn`) VALUES('疯狂Java讲义 第3版','李刚著','电子工业出版社',7.8,'9787121236693'); INSERT INTO `book` (`name`,`author`,`press`,`douban`,`isbn`) VALUES('深入理解Java 7 核心技术与最佳实践','成富著','机械工业出版社',6.9,'9787111380399');

用户可能用书名、出版社、豆瓣评分、ISBN中的1~4个字段进行查询,如果用固定的sql语句,那么得写C(4,1)+C(4,2)+C(4,3)+C(4,4)=4+6+4+1=15条sql和15个Dao方法

如果用动态sql,一条语句即可完成,比如这样:

<select id="multiSearch" parameterType="map" resultType="net.sonng.entity.Book">
SELECT * FROM book
<where>
<if test="name!=null">
name LIKE #{name}
</if>
<if test="press!=null">
AND press LIKE #{press}
</if>
<if test="douban!=null">
AND douban>=#{douban}
</if>
<if test="isbn!=null">
AND isbn=#{isbn}
</if>
</where>
</select>

动态sql,可以根据用户对字段选择和输入,动态生成一条sql执行

实体类Book,略。

BookDao,略

Controller略

Service如下:

package net.sonng.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.annotation.Resource; import net.sonng.dao.BookDao;
import net.sonng.entity.Book; import org.springframework.stereotype.Service; @Service
public class TestService {
@Resource
private BookDao bookDao;
public List<Book> multiSearch(String name,String press,String douban,String isbn){
Map<String,String> map=new HashMap();
if (name!=null && !name.equals("")) {
map.put("name", "%"+name+"%");
}
if (press!=null && !press.equals("")) {
map.put("press","%"+press+"%");
}
if (douban!=null && !douban.equals("")){
map.put("douban", douban);
}
if (isbn!=null && !isbn.equals("")) {
map.put("isbn", isbn);
}
return bookDao.multiSearch(map);
}
}

测试类如下:

package net.sonng.test;

import java.util.List;

import net.sonng.controller.TestController;
import net.sonng.entity.Book; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test {
public static void main(String[] args){
ApplicationContext ac=new ClassPathXmlApplicationContext("ac.xml");
TestController tc=ac.getBean("testController",TestController.class);//下面的4种查询语句,都可以一条动态SQL执行
//List<Book> books=tc.multiSearch("Java", "", "", ""); //查询到4条
//List<Book> books=tc.multiSearch("Java", "机械", "", ""); //3条
//List<Book> books=tc.multiSearch("Java", "机械", "8", ""); //2条
List<Book> books=tc.multiSearch("Java" ,"机械", "8", "9787111213826");//1条
for (Book book:books){
System.out.println(book.getId());
System.out.println(book.getName());
System.out.println(book.getIsbn());
System.out.println(book.getAuthor());
System.out.println(book.getPress());
System.out.println(book.getDouban());
System.out.println("----------------------------------");
}
}
}

0048 MyBatis动态SQL简易入门示例的更多相关文章

  1. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

  2. MyBatis从入门到精通(第4章):MyBatis动态SQL【if、choose 和 where、set、trim】

    (第4章):MyBatis动态SQL[if.choose 和 where.set.trim] MyBatis 的强大特性之一便是它的动态 SQL.MyBatis 3.4.6版本采用了功能强大的OGNL ...

  3. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  4. 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...

  5. mybatis 动态sql和参数

    mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...

  6. MyBatis动态SQL(认真看看, 以后写SQL就爽多了)

    目录 0 一起来学习 mybatis 1 数据准备 2 if 标签 2.1 在 WHERE 条件中使用 if 标签 2.1.1 查询条件 2.1.2 动态 SQL 2.1.3 测试 2.2 在 UPD ...

  7. Java EE数据持久化框架 • 【第4章 MyBatis动态SQL】

    全部章节   >>>> 本章目录 4.1 MyBatis动态标签 4.1.1  MyBatis动态标签介绍 4.1.2 < if >标签 4.1.3 update语 ...

  8. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  9. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

随机推荐

  1. EasyUI datagrid 复选框可以多选但不能全选功能实现

    1.功能需求:  实现多选,但是不能够全选功能 2.js代码 //帮卖列表页面,可以多选但是不能够全选实现 $(".datagrid-header-check").children ...

  2. metal 优化数据分析

    https://developer.apple.com/documentation/metal/render_pipeline/viewing_pipeline_statistics_of_a_dra ...

  3. fc游戏反编译流程

    最近打算玩一下nes游戏,重拾一下6502汇编. 摸索了几天,觉得下面这个反汇编的流程比较好: 用 fceux 载入游戏,选择debug菜单Code/Data Logger,点击Start,稍微玩一下 ...

  4. windows下创建vp9的VS版本

    1. webm官网   下载版本: http://code.google.com/p/webm/downloads/list 创建过程这里有比较详细的英文说明: http://www.webmproj ...

  5. SonarQube install on Kubernetes

    Sonarqube搭建代码 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: postgres labels: app: ...

  6. 解决Eclipse下不自动拷贝apk到模拟器问题( The connection to adb is down, and a severe error has occured)

    如题 解决方案如下: 1.先把eclipse关闭.2.在管理器转到你的android SDK 的platform-tools下3.键入adb kill-server ,如果adb关闭了会提示 serv ...

  7. Python strings, 元组tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的

    在python中,strings, 元组tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象. a = 1 def fun(a):     a = 2 fun(a ...

  8. AFNetworking 文件上传Data,File图片,文件等上传

    一:AFNetworking的文件上传: 主要几个以下类似 - (BOOL)appendPartWithFileURL:(NSURL *)fileURL name:(NSString *)name e ...

  9. 【转】linux性能相关的命令和概念

    1. top命令结果解读 23:31:27:系统时间 up 8 days: 表示从开机到现在,一共运行了8天 1 user:1个用户正在使用系统 load average:系统负载,即任务队列的平均长 ...

  10. odoo8登录时,同帐号在其它客户端的连接自动退出

    odoo跟大多数B/S系统一样,同一个帐号可以在不同的电脑上登录,并且可以同时操作,这样子会带来一些权限上的漏洞.为了解决这个问题,经过分析odoo的session处理机制,开发了一个模块,安装此模块 ...