1.if标签

public interface StudentDao {
/**
*动态sql的查询 参数是Student对象 不确定 用户输入几个属性值
*/
List<Student> selectStudentsByIf(Student student);
}

xml文件中的内容

<?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.dao.StudentDao"> <!-- 需要注意的事项:
01. 在xml文件中 特殊字符的使用
&&必须换成 and或者 &amp;
< &lt;
> &gt;
<= &lt;=
>= &gt;=
' &apos;
" &quot; 02.因为不确定用户输入的到底是哪个参数
所以 where 之后必须加上 1=1 而且 每个条件之前加上 and -->
<select id="selectStudentsByIf" resultType="Student">
select id,name,age from student
where 1=1
<if test="name!=null &amp; name!=''">
and name like '%' #{name} '%'
</if>
<if test="age>0">
and age > #{age}
</if>
</select>
</mapper>

测试类

public class StudentTest {
StudentDao dao;
SqlSession session; @Before
public void before() {
// 因为需要关闭session 需要把session提取出去
session = SessionUtil.getSession();
dao = session.getMapper(StudentDao.class);
} @After
public void after() {
if (session != null) {
session.close();
}
} // 01.动态查询
@Test
public void test1() { Student stu=new Student();
//01.属性都不赋值 会查询所有
//02.只给年龄赋值stu.setAge(10);
//03.只给姓名赋值stu.setName("小");
//04.同时给两个属性都赋值
stu.setAge(10);
stu.setName("小");
List<Student> list = dao.selectStudentsByIf(stu);
for (Student student : list) {
System.out.println(student);
}
}
}

2.where标签

上面的代码有点问题,就是在xml文件中的sql语句有where  1=1,如果查询条件多的话,性能是很低的,因为每次查询都需要判断一次!这时候 我们就需要使用 where 标签来代替!

public interface StudentDao {

    List<Student> selectStudentsByWhere(Student student);
}

xml文件的配置  省略了  where  1=1

<?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.dao.StudentDao"> <select id="selectStudentsByWhere" resultType="Student">
select id,name,age from student
<where>
<!-- and 必须要加上mybatis只会减 不会加 -->
<if test="name!=null &amp; name!=''">
and name like '%' #{name} '%'
</if>
<if test="age>0">
and age > #{age}
</if>
</where>
</select>
</mapper>

测试类中新增

    // 02.动态查询 where
@Test
public void test2() {
Student stu=new Student();
//01.属性都不赋值 会查询所有
//02.只给年龄赋值stu.setAge(10);
//03.只给姓名赋值stu.setName("小");
//04.同时给两个属性都赋值
stu.setAge(10);
stu.setName("小");
List<Student> list = dao.selectStudentsByWhere(stu);
for (Student student : list) {
System.out.println(student);
}
}

运行即可得到相同的结果!

2.choose标签

比如说当姓名不为空的时候,按照姓名来查询,年龄不为空的时候按照年龄来查询!如果都为空则返回空!

public interface StudentDao {
/**
*动态sql的查询 参数是Student对象
*/ List<Student> selectStudentsByChoose(Student student);
}

xml文件中配置

<?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.dao.StudentDao">
<!-- 姓名不空 按照姓名查询 年龄不为空 按照年龄查询
只要满足一个when 则其他的when则不会执行!
如果都不满足,则会执行otherwise 也就是没有查询结果
-->
<select id="selectStudentsByChoose" resultType="Student">
select id,name,age from student
<where>
<choose>
<when test="name!=null and name!=''">
and name like '%' #{name} '%'
</when>
<when test="age>0">
and age > #{age}
</when>
<otherwise>
1!=1
</otherwise>
</choose>
</where>
</select>
</mapper>

测试类代码

// 03.动态查询 choose
@Test
public void test3() {
Student stu=new Student();
stu.setName("小"); //name 不会空 则会按照name来查询 其他的条件无效
stu.setAge(10);
//如果都没有赋值 则没有返回结果
List<Student> list = dao.selectStudentsByChoose(stu);
for (Student student : list) {
System.out.println(student);
}
}

 4.choose标签 遍历数组

public interface StudentDao {

    List<Student> selectStudentsByForeach(int [] ids);
}

xml文件中的配置

<?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.dao.StudentDao"> <select id="selectStudentsByForeach" resultType="Student">
<!-- 这就不是动态查询了 而是把参数写成固定的了
select id,name,age from student where id in(1,13,15)
-->
select id,name,age from student
<if test="array.length>0"><!-- 看传递来的数组长度是否大于0,如果数组长度为0 则是查询所有信息-->
where id in
<foreach collection="array" item="myId" open="(" separator="," close=")">
#{myId}
</foreach>
</if>
</select>
</mapper>

测试代码

    // 04.动态查询 foreach 遍历数组
@Test
public void test4() {
int [] ids={1,13,15};
List<Student> list = dao.selectStudentsByForeach(ids);
for (Student student : list) {
System.out.println(student);
}
}

 4.choose标签 遍历list集合

public interface StudentDao {

    List<Student> selectStudentsByForeachArray(List<Integer>  ids);
}

xml文件中的配置

<?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.dao.StudentDao"> <select id="selectStudentsByForeachArray" resultType="Student">
select id,name,age from student
<if test="list.size>0"><!-- 看传递来的数组长度是否大于0,如果数组长度为0 则是查询所有信息-->
where id in
<foreach collection="list" item="myId" open="(" separator="," close=")">
#{myId}
</foreach>
</if>
</select>
</mapper>

测试代码

// 05.动态查询 foreach 遍历list集合
@Test
public void test5() {
List<Integer> ids=new ArrayList<Integer>();
ids.add(1);
ids.add(13);
ids.add(14);
List<Student> list = dao.selectStudentsByForeachArray(ids);
for (Student student : list) {
System.out.println(student);
}
}

4.choose标签 遍历自定义类型集合

public interface StudentDao {

    List<Student> selectStudentsByForeachStudent(List<Student>  stus);
}

xml文件中的配置

<?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.dao.StudentDao"> <!-- 遍历自定义类型的集合 -->
<select id="selectStudentsByForeachStudent" resultType="Student">
select id,name,age from student
<if test="list.size>0"><!-- 看传递来的数组长度是否大于0,如果数组长度为0 则是查询所有信息-->
where id in
<foreach collection="list" item="stu" open="(" separator="," close=")">
#{stu.id}
</foreach>
</if>
</select>
</mapper>

测试代码

// 06.动态查询 foreach 遍历自定义集合
@Test
public void test6() {
Student stu1 = new Student();
stu1.setId(1);
Student stu2 = new Student();
stu2.setId(13);
Student stu3 = new Student();
stu3.setId(15);
List<Student> stus=new ArrayList<Student>();
stus.add(stu1);
stus.add(stu2);
stus.add(stu3);
List<Student> list = dao.selectStudentsByForeachStudent(stus);
for (Student student : list) {
System.out.println(student);
}
}

5.sql片段

如果一个xml文件中的sql语句有很多相同的地方,则可以使用sql片段来替换!如:

public interface StudentDao {

    List<Student> selectStudentsBySql(List<Student>  stus);
}

xml文件中的配置

<?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.dao.StudentDao"> <!-- sql片段的使用 -->
<select id="selectStudentsBySql" resultType="Student">
<include refid="selectStudent"/><!-- 引入sql片段 -->
<if test="list.size>0">
where id in
<foreach collection="list" item="stu" open="(" separator="," close=")">
#{stu.id}
</foreach>
</if>
</select> <!-- 如果有需求不查询age了,之前需要在所有的查询中删除age字段,现在只需要在sql片段中删除即可! -->
<sql id="selectStudent">
select id,name,age from student
</sql>
</mapper>

测试代码

// 07.sql片段
@Test
public void test7() {
Student stu1 = new Student();
stu1.setId(1);
Student stu2 = new Student();
stu2.setId(13);
Student stu3 = new Student();
stu3.setId(15);
List<Student> stus=new ArrayList<Student>();
stus.add(stu1);
stus.add(stu2);
stus.add(stu3);
List<Student> list = dao.selectStudentsBySql(stus);
for (Student student : list) {
System.out.println(student);
}
}

mybatis06--动态sql的更多相关文章

  1. Mybatis-06 动态Sql

    Mybatis-06 动态Sql 多对一处理 多个学生,对应一个老师 对于学生这边而言,关联多个学生,关联一个老师 [多对一] 对于老师而言,集合,一个老师又很多学生 [一对多] 1.创建数据库 2. ...

  2. 值得注意的ibatis动态sql语法格式

    一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...

  3. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

  4. MyBatis4:动态SQL

    什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...

  5. 分享公司DAO层动态SQL的一些封装

    主题 公司在DAO层使用的框架是Spring Data JPA,这个框架很好用,基本不需要自己写SQL或者HQL就能完成大部分事情,但是偶尔有一些复杂的查询还是需要自己手写原生的Native SQL或 ...

  6. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

  7. 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】

    一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...

  8. 自定义函数执行动态sql语句

    --函数中不能调用动态SQL,使用用存储过程吧.如果还要对函数做其他操作,换成存储过程不方便,可以考虑把其他操作一起封装在存储过程里面.如:   create proc [dbo].[FUN_YSCL ...

  9. mybatis入门基础(五)----动态SQL

    一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...

  10. mybatis 动态sql表达式相关应用

    一.mybatis 表达式简介 对于mybatis3 ,提供了一种动态sql的方式.通过动态sql我们可以直接在mybatis 的xm映射文件中直接通过条件判断的方式进行查询添加的拼接.mybatis ...

随机推荐

  1. mycat 资料汇总

    1. mycat 官网http://www.mycat.io/ 2. mycat 官博:http://blog.csdn.net/zhxdick/article/category/6086991/1 ...

  2. Siamese网络

    1.       对比损失函数(Contrastive Loss function) 孪生架构的目的不是对输入图像进行分类,而是区分它们.因此,分类损失函数(如交叉熵)不是最合适的选择,这种架构更适合 ...

  3. .NET上传大文件时提示Maximum request length exceeded错误的解决方法

    使用IIS托管应用程序时,当我们需要上传大文件(4MB以上)时,应用程序会提示Maximum request length exceeded的错误信息.该错误信息的翻译:超过最大请求长度. 解决方法: ...

  4. Go语言无锁队列组件的实现 (chan/interface/select)

    1. 背景 go代码中要实现异步很简单,go funcName(). 但是进程需要控制协程数量在合理范围内,对应大批量任务可以使用"协程池 + 无锁队列"实现. 2. golang ...

  5. lua变量作用域

    3.5 – Visibility Rules Lua is a lexically scoped language. The scope of a local variable begins at t ...

  6. webstorm快捷键 webstorm keymap内置快捷键英文翻译、中英对照说明

    20160114参考网络上的快捷键,整理自己常用的: 查找/代替shift+shift 快速搜索所有文件,简便ctrl+shift+N 通过文件名快速查找工程内的文件(必记)ctrl+shift+al ...

  7. fastcgi php-cgi与php-fpm区别和之间的关系

    关于FastCGI.php-cgi.php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么,查阅相关资料,可谓是众说纷纭,莫衷一是: 说法一:fastcgi是一个协议,php-fpm实现了 ...

  8. Atitit 关于共享经济之共享男女朋友的创业计划

    Atitit 关于共享经济之共享男女朋友的创业计划 1. 共享经济的历史与趋势 1 1.1. 共享经济三大特征=产能过剩+共享平台+人人参与. 1 1.2. 共享经济是个大趋势,使用权渐渐的取代所有权 ...

  9. Jquery Post提交时Content-Type的不同取值详解

    四种常见的 POST 提交数据方式 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主体.类似于下 ...

  10. xml序列化与反序列化工具

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...