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>