转义
Java项目开发过程中,我们的sql语句通常都写在XML文件当中,其中存在类似正则表达式那样的特殊符号,需要转义后才能使用,否则XML语法在检查时就会报错。
常用的XML转义字符:
转义符 | 符号 | 意义 |
---|---|---|
<; | < | 小于 |
>; | > | 大于 |
<= | <= | 小于等于 |
>= | >= | 大于等于 |
&; | & | 与 |
&apos; | ' | 单引号 |
"; | " | 双引号 |
确切的来说,XML中只有符号 "<" 和 "&" 是非法的,其它都是可以不用转义,是合法的存在。但后来在开发过程中,大家形成了一种开发规范,其它几个也都使用了转义符号。
代码示例:
假设数据库中,user表的数据为:
id | name | age | score |
---|---|---|---|
1 | Bob | 11 | 95 |
2 | Alice | 12 | Null/0 |
<select id="findUserInfo" resultType="map" parameterType="map">
SELECT
id,name,age,score
FROM user
WHERE 1 = 1
<if test="score != null">
AND (age & #{socre}) > 0
</if>
</select>
上述sql含义为:查询age与分数都不为空并且不为0的用户信息;其查询结果为:
id | name | age | score |
---|---|---|---|
1 | Bob | 11 | 95 |
递归查所有子节点
语法:
SELECT c.*
FROM (
SELECT a.*, b.*,
IF ( FIND_IN_SET( parent_id, @pids ) > 0, @pids := CONCAT( @pids, ',', id ), '0' ) AS children
FROM
( SELECT * FROM student WHERE status = 1) AS a,
( SELECT @pids := 填写父节点id ) AS b
) c
WHERE
c.children != '0'
实际例子,有以下情况:
数据库结构为,表名为student:
id | parent_id | name | status |
---|---|---|---|
1 | NULL | 一班 | 1 |
2 | 1 | 男生 | 1 |
3 | 1 | 女生 | 1 |
4 | 2 | 小胖 | 1 |
5 | 3 | 小美 | 1 |
现需要查询一班下的所有数据,包括男生、女生、小胖、小美,则:
SELECT c.*
FROM (
SELECT a.*, b.*,
IF ( FIND_IN_SET( parent_id, @pids ) > 0, @pids := CONCAT( @pids, ',', id ), '0' ) AS children
FROM
( SELECT * FROM student WHERE status = 1) AS a,
( SELECT @pids := '1' ) AS b
) c
WHERE
c.children != '0'
上述 IF(a, b, c ) 函数意思是:如果条件 a 成立,则返回 b ,否则返回 c ;类似三目运算