1.动态SQL,解决关联sql字符串的问题,mybatis的动态sql基于OGNL表达式

if语句,在DeptMapper.xml增加如下语句;

<select id="selectByLikeName" resultType="org.mybatis.example.dao.Dept"
		parameterType="org.mybatis.example.dao.Dept">
		select d.deptno,d.dname,d.loc from dept d where 1=1
		<if test="dname!=null and dname!=''">
			AND	dname like #{dname}
		</if>
	</select>

DeptMapper.java接口中增加如下代码

public Dept selectByLikeName(Dept dept);

测试类如下:

public class Test23 {
	public static void main(String[] args) {
		SqlSession session=SqlSessionFactoryUtil.getSqlSession();
		DeptMapper mapper=session.getMapper(DeptMapper.class);
		Dept d=new Dept();
		d.setDname("开发部");
		Dept dept=mapper.selectByLikeName(d);
		System.out.println(dept.getDname());
	}
}

如果查询雇员的姓名,查询出雇员并且找到一些部门呢?

EmpMapper.xml增加如下代码

<select id="selectByLike" resultMap="getEmpresultMap"
		parameterType="org.mybatis.example.dao.Emp">
		select d.deptno,d.dname,d.loc,e.empno,e.ename
 		from Dept d  join emp e  on d.deptno=e.deptno where 1=1
		<if test="ename!=null and ename!=''">
			AND ename like #{ename}
		</if>
		<if test="dept!=null and dept.dname!=null">
			AND dname like #{dept.dname}
		</if>
	</select>

EmpMapper.java增加如下代码:

public List<Emp> selectByLike(Emp e);

测试类:

public class Test24 {
	public static void main(String[] args) {
		SqlSession session=SqlSessionFactoryUtil.getSqlSession();
		EmpMapper mapper=session.getMapper(EmpMapper.class);
		Emp e=new Emp();
		e.setEname("张%");
		List<Emp>empList=mapper.selectByLike(e);
		for(Emp emp:empList){
			System.out.println("所有名字首字母为张的员工是:"+emp.getEname());
		}
	}
}

3 choose when  otherwise语句

有时候针对,有多重选择的情况,可以使用choose语句

<select id="selectByLikeTwo" parameterType="org.mybatis.example.dao.Emp"
		resultMap="getEmpresultMap">
		select d.deptno,d.dname,d.loc,e.empno,e.ename,e.sal
 		from Dept d  join emp e  on d.deptno=e.deptno where 1=1
 		<choose>
 			<when test="ename!=null">AND ename like #{ename}</when>
 			<when test="dept!=null and dept.dname!=null">AND dname=#{dept.dname}</when>
 			<otherwise>AND sal >5000</otherwise>
 		</choose>
	</select>

EmpMapper.java增加接口

public List<Emp> selectByLikeTwo(Emp e);

public class Test25 {
	public static void main(String[] args) {
		SqlSession session=SqlSessionFactoryUtil.getSqlSession();
		EmpMapper mapper=session.getMapper(EmpMapper.class);
		Emp e=new Emp();
		Dept d=new Dept();
		d.setDname("开发部");
		e.setDept(d);
		List<Emp>empList=mapper.selectByLikeTwo(e);
		for(Emp emp:empList){
			System.out.println("所有开发部的员工:"+emp.getEname());
		}
	}
}

4.

<select id="selectByLikeName" resultType="org.mybatis.example.dao.Dept"
		parameterType="org.mybatis.example.dao.Dept">
		select d.deptno,d.dname,d.loc from dept d where
		<if test="dname!=null">
			1=1
		</if>
		<if test="dname!=null and dname!=''">
			AND	dname like #{dname}
		</if>
	</select>

测试类

public static void main(String[] args) {
		SqlSession session=SqlSessionFactoryUtil.getSqlSession();
		DeptMapper mapper=session.getMapper(DeptMapper.class);
		Dept d=new Dept(); //或者设置为null
		d.setDname("开发部");//设置为null的时候注释
		List<Dept>deptList=mapper.selectByLikeName(d);
		System.out.println(deptList.get(0).getDname());
	}

5. foreach

动态SQL迭代一个集合,通常放在In条件语句中,foreach允许指定一个集合,声明集合项和索引变量,他们可以用在元素体内,也允许指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是智能的,不会偶然地附加多余的分隔符。

在EmpMapper.xml中增加代码段

<select id="selectDeptIn" resultType="org.mybatis.example.dao.Dept">
		select * from dept d where deptno in
		<foreach item="item" index="index" collection="list"
			open="(" separator="," close=")">
			#{item}
		</foreach>
	</select>

在接口EmpMapper.java中增加代码

public List<Dept> selectDeptIn(List<Integer>list);

测试类代码段

public class Test26 {
	public static void main(String[] args) {
		SqlSession session=SqlSessionFactoryUtil.getSqlSession();
		DeptMapper mapper=session.getMapper(DeptMapper.class);
		List<Integer>idList=new ArrayList<Integer>();
		idList.add(5);
		idList.add(6);
		List<Dept>deptList=mapper.selectDeptIn(idList);
		System.out.println(deptList.get(0).getDname());
		System.out.println(deptList.get(1).getDname());
	}
}

对于在Mybatis中出现的TooManyResultsException异常,需要将接口的方法返回类型修改为List<T>泛型类型即可。

mybatis.5.动态SQL的更多相关文章

  1. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  2. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  3. mybatis 使用动态SQL

    RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...

  4. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  5. 使用Mybatis实现动态SQL(一)

    使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:        *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...

  6. MyBatis探究-----动态SQL详解

    1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...

  7. mybatis中的.xml文件总结——mybatis的动态sql

    resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...

  8. MyBatis的动态SQL详解-各种标签使用

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...

  9. 利用MyBatis的动态SQL特性抽象统一SQL查询接口

    1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...

随机推荐

  1. Next Generation MSP 和传统MSP的区别

    1. 速度 -- 基础架构代码化快速部署 由于物理硬件已经在云上启动并运行,因此配置服务器要快得多.配置完成后,只有当MSP采用DevOps并将环境“基础设施作为代码”时,配置才能快速.云MSP可以轻 ...

  2. python数据分析系列(2)--numpy

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  3. python3去除字符串中括号及括号里面的内容

    a = """ <option value="search-alias=arts-crafts-intl-ship">Arts & ...

  4. which命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/jkin/p/10289085.html Linux which命令用于查找文件. which指令会在环境变量$PATH ...

  5. python如何与以太坊交互并将区块链信息写入SQLite

    关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀.因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物.今天我们将观察 ...

  6. “Hello World!“”团队第七周召开的第三次会议

    今天是我们团队“Hello World!”团队第七周召开的第三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码 一 ...

  7. WPF四则运算《《《《《策略模式

    设计思路:           因为之前没有用过WPF,听说和window窗体语法类似,就想着仿照之前的Window窗体做的,首先用三个textbox存储数据,添加一个comboBox,利用索引选择运 ...

  8. 谈对“Git”的认识与理解

    自诞生于2005年以来,Git日臻完善,在高度易用的同时,仍然保留着初期设定的目标.它的速度飞快,及其适合管理大项目,它还有着令人难以置信的非线性分支管理系统,可以应付各种复杂的项目开发需求.接着说说 ...

  9. dsdsd

    #include<iostream> using namespace std; #include<string.h> #define max 205 char map[max] ...

  10. coreseek优化

    问题前提: 这篇博客是在你已经安装并使用coreseek的前提下,并且在使用过程中发现当前默认的分词效果不佳时作为参考. 解决方案: 1.扩展基本词典 参考: http://jockchou.gith ...