Mapper配置动态SQL:if,choose和foreach元素

本文介绍了MyBatis中用于动态SQL配置的if、choose和foreach元素,以及<where>标签的使用。通过示例展示了如何在Mapper配置文件中利用这些元素进行条件判断和集合遍历,以减少代码量和提高SQL语句的灵活性。内容包括:SQL语句拼接的避免方法,if标签的基本用法和条件判断,<where>标签的特殊处理,choose标签的多选一功能,以及foreach标签在遍历集合中的应用。
摘要由CSDN通过智能技术生成

SQL语句拼接

在前面的配置中,无论是基本的增删查改,还是关联嵌套,集合嵌套查询,使用的SQL语句都是很基础的,表关系之间的数据操作。翻回自己大一时写的代码,从一开始的SQL语句直接拼接,如:

String sql = "Update user Set username = " + username + ", gender = " + gender + " Where id = " + id;

这样拼接SQL语句,难免会因为粗心而出现漏逗号等不必要的错误,到后来使用string.Format格式化来拼接SQL语句,语句可读性好了很多:

string.Format("Update FoodItem Set FoodName='{0}',FoodStyle='{1}',Price='{2}' where FoodID='{3}'", FoodName, FoodStyle, Price, FoodId);

传统的JDBC除了拼接语句时有那么一点点麻烦外,在根据不同条件动态配置SQL语句方面,一样不太方便。假如我们想查询一张用户表中,性别为“男”,且姓名为“张三”的用户信息,我们很容易写出这样的查询语句:

SELECT * FROM user WHERE gender = '男' AND username = '张三';

这时如果我们想要查询性别为“男”,且城市字段为“广州”的用户信息,我们就不得不重新写一条查询语句:

SELECT * FROM user WHERE gender = '男' AND city = '广州市';

显然这样的代码量会变得很大,如果你不确定一些查询需求的参数,那么就可能要写很多的查询语句来应对不同的查询。

     在配置Mapper(SQL映射配置文件)中有较好的解决办法来减少代码量(例如其映射语句的配置据说最多能减少95%的代码量)。因为MyBatis提供了动态配置SQL语句的一些元素,配置过程中依旧踩了很多坑- -、,但是总算是成功配置并完美运行了!这篇日志总结下自己对if,choose以及foreach三个元素的配置,还有<where>标签,都十分的强大!

 

if 标签 – 选择查找文本

基本用法

看到“if”元素,大家肯定都猜到它的作用是用来做判断了,把“if”标签放到最前面来讲,因为它是最基本,也是程序员们最熟悉的元素之一。没错,它的作用就是条件判断,选择不同的SQL语句执行,来看各例子:

用到的JavaBean,下面的其他示例都是用这个实体类:

public class User implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int id;
	private String username;
	private String password;
	private String gender;
	private String email;
	private String province;
	private String city;
	private Date birthday;
	private int age;
	
	public User() {
		System.out.println("进入目标类无参数构造方法....");
	}
	// 构造方法初始化
	public User(String username, String password, String gender, String email, String province,
			String city, Date birthday) {
		super();
		System.out.println("进入目标类有参数构造方法....");
		this.username = username;
		this.password = password;
		this.gender = gender;
		this.email = email;
		this.province = province;
		this.city = city;
		this.birthday = birthday;
	}
    // 省略get()和set()方法
}

SQL映射配置文件:

<select id="UserActiveSearch_if" parameterType="User" resultType="User">
		SELECT 
			U.username,
			U.gender,
			U.email,
			U.city
		FROM User U WHERE gender = '男'
		<if test="username != null">
			AND U.username like #{username}
		</if>
	</select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值