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

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. 《jQuery基础》总结

    目前,互联网上最好的jQuery入门教材,是Rebecca Murphey写的<jQuery基础>(jQuery Fundamentals).这本书虽然是入门教材,但也足足有100多页.我 ...

  2. TCP的状态(SYN,FIN等)

    TCP的标志位有SYN,FIN,RST,ACK,PSH,URG SYN:建立连接. FIN:关闭连接. RST:连接重置. ACK:响应. PSH:有数据传输. URG:urgent紧急. ACK可以 ...

  3. java实现折半排序算法

    折半插入排序法,又称二分插入排序法,是直接插入排序法的改良版,也需要执行i-1趟插入,不同之处在于,第i趟插入,先找出第i+1个元素应该插入的的位置,假定前i个数据是已经处于有序状态. 折半插入排序( ...

  4. activemq5.14.5单节点安装Demo

    什么情况下使用ActiveMQ? 1     多个项目之间集成 (1) 跨平台 (2) 多语言 (3) 多项目 2     降低系统间模块的耦合度,解耦 软件扩展性 3     系统前后端隔离 前后端 ...

  5. iOS 证书管理.p12文件不能导出

    iOS证书不能导出p12文件: 首先要确认证书是从你这个电脑上制作生成的! 钥匙串-->我的证书--->右键,就可以导出了!

  6. GitHub页面布局乱了,怎么解决??

    GitHub页面布局乱了,怎么解决?? GitHub乱了,怎么解决?? 一年一度的布局又乱了!!! F12一下下面有东西加载不了,,,, Refused to evaluate a string as ...

  7. 请问大家ndk中LOCAL_SHARED_LIBRARIES LOCAL_LDLIBS什么区别

    请问大家ndk中LOCAL_SHARED_LIBRARIES LOCAL_LDLIBS什么区别啊 我先是编译了一个.so 然后在此次编译的使用调用,请问用LOCAL_SHARED_LIBRARIES和 ...

  8. user-defined conversion

    http://en.cppreference.com/w/cpp/language/cast_operator

  9. H5 Canvas | 画布中变量作用域与setInterval方法同步执行探究

    Demo - 随机绘制圆环 实现思路: 将一个圆环的绘制分成100份,setInterval()方法定义每隔时间n绘制一段新的,每份的开始路径都是上一次的结束路径,实现步进绘制. 通过Math.ran ...

  10. 04-spring-控制反转

    使用myeclipse开发spring一个Demo. 第一步:新建一个web project. 第二步:安装spring开发的支持包. 安装后多了这几个东西 3,定义一个操作接口: package c ...