mybatis(三).MyBatis的动态sql

前面的文章中sql操作文件讲的大都是一个固定的sql,那么如果要根据不用的条件拼接不同的sql,那么该怎么做呢,今天我们来学习MyBatis的动态sql。

不说废话,开干。

一.表达式

动态sql是怎么实现的呢,这里面要用到一些表达式,接下来看看这些表达会死:

1.选择表达式1

<if test=””>……</if>

如果test表达式成立,就后缀拼上<if>里面的sql语句

2.选择表达式2

<choose>

       <when test=”xxx”>…</when>

       <otherwise>……</otherwise>

</choose>

如果<when>标签里的test值对应的表达式成立为true,就拼上<when>标签里的sql语句,否则,就拼上<othrewise>标签里的sqly语句。

3.循环

<foreach></foreach> 

不管是什么集合都用数组array来接收,

属性parameterType:参数类型;

item:是每个元素 ;

open:循环之前加的字符串;

close:循环之后加的字符串;

注:<delete>语句不用加这些属性

4.where标签

<where>

顶替where关键字;去掉条件里多余的“and”或 “or”关键字。

5.set标签

<set>

顶替set关键字;去掉多余的逗号“,”。

二.实战

下面的实战都是接着上一篇文章MyBatis的接口映射器规则说的项目mybatis_demo1的基础上进行的。大家可以去看看,如果有这方面的基础,可以直接在自己搭建的MyBatis项目上来实战。

1.实例一

组合查询:我们要根据登录名(username字段),昵称(name字段),性别(gender字段)中0个或多个(最多3个)条件来查询用户。

我们先看看,这个表的结构:

(1).编写sql

在com.cdd.sql.UserMapper.xml文件中编写这个组合查询sql,代码如下:

(2).编写接口

编写与UserMapper.xml文件对应的符合接口映射器规则(可以看上一篇文章)的接口com.cdd.dao.UserDao,代码如下:

<where>标签顶替where关键字,可以去掉条件里多余的“and”或 “or”关键字

package com.cdd.dao;

import java.util.List;
import java.util.Map;

import com.cdd.entity.User;

public interface UserDao {
	public List<User> combinationQuery(Map map);  //组合查询
}

(3).测试

在com.cdd.test包下编写测试动态sql的测试类TestDynamicSql,代码如下:

package com.cdd.test;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.cdd.dao.UserDao;
import com.cdd.entity.User;
import com.cdd.util.MyBatisUtil;

public class TestDynamicSql {
	private UserDao userDao;
	private SqlSession session;

	//测试之前初始化session,userDao
	@Before
	public void init() throws Exception{
		session = MyBatisUtil.getSqlSession();
		userDao = session.getMapper(UserDao.class);
	}
	
	//测试后,关闭session
	@After
	public void end(){
		session.close();
	}
	
	//测试组合查询,可能会查到多个User,所以用List<User>接
	@Test
	public void test(){
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("username", null);
		map.put("name", null);
		map.put("gender", "m");
		List<User> userList = userDao.combinationQuery(map);
		for(User u : userList){
			System.out.println(u);
		}
		
	}
}

在test()方法上右键run as -> Junit Test,查看控制台,如下:

可以看到查到3个用户(这里能打印出每个user的详细信息,是因为在编写User实体类时重写了toString()方法),这个组合查询就成功了。

2.实例二

动态更新:我们更新id为3的用户,有可能更新该用户的登录名(username字段)、昵称(name字段)、性别(gender字段)中的0个或多个属性。

(1).编写sql

在com.cdd.sql.UserMapper.xml文件中添加这个动态更新sql,代码如下:

动态更新,可以将不为null的属性更新到数据库中 ,set关键字可以去掉多余的逗号。

(2).编写接口

在com.cdd.dao.UserDao中添加与之对应的方法dynamicUpdate(),代码如下:

(3).编写测试类

在com.cdd.test.TestDynamicSql类中添加测试方法test1(),代码如下:

执行DML语句一定要显示的commit,MyBatis默认是关闭自动commit的。

右键这个方法test1()运行,查看数据库,可以看到id为3的用户被更新了。

3.实例三

批量删除:根据一些用户的id,批量删除用户

(1). 编写sql

在UserMapper.xml文件中添加批量删除sql,如下:

collection:不管传来的是什么类型的集合都用array接收;

item:是这个集合的元素;

open:在循环之开始前加的字符串;

close:在循环之结束后加的字符串;

separator:每个元素之间的分隔符。

(2).编写接口

在com.cdd.dao.UserDao中添加与之对应的方法batchDelete(),代码如下:

(3).测试

右键这个方法test2()运行,查看数据库,可以看到没有id为1和2的用户了,事实上已经被删除了。

以上内容就是我们的动态sql了。

发布了45 篇原创文章 · 获赞 28 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_41968788/article/details/84000059