注释的使用

以 # 开头即可
规范:开头的部分,请用注释写明用处

查看API文档

点击查询API

DB_TYPE关键字

目前支持的取值:MYSQL,ORACLE,默认为MYSQL,因此在使用mysql时可以省略
如果是oracle数据库,请在注释行 后 开始写 DB_TYPE=ORACLE

例子:
#这是配置范例
DB_TYPE=ORACLE

select ……

where条件的写法

java api 说明

1. setParam(String key, Object value)
    设置指定key的值,注意 value不能为 null
2. setParamAuto(String key, Object value)
    设置指定key的值,当 value 为 null 或 空字符串时,该条件行自动被忽略,即使行内有其他非空的参数
3. setParamLike(String key, String value)
4. setParamLikeAuto(String key, String value)
5. setParamLikeLeft(String key, String value)
6. setParamLikeLeftAuto(String key, String value)
7. setParamRightLike(String key, String value)
8. setParamLikeRightAuto(String key, String value)
注意:
1. setParamAuto及setParamXXXAuto的api,会根据参数值是否为空判断空,自动判断条件是否启用。下面是空的几种情况
    1. null
    2. 空字符
    3. 空的List集合
    4. 空的数组
2. 后缀不是 Auto的api,参数值不允许为 空

1. 普通where的写法

    1. select *
    from users
    where id = :id
    java代码:
        1. sqlQuery.setParam("id", 1);
            生成的sql: select * from users where id = 1
            如果传入的参数为空,程序会抛出异常
        2. sqlQuery.setParamAuto("id", 1);
            生成的sql: select * from users where id = 1
            sqlQuery.setParamAuto("id", null);或者sqlQuery.setParamAuto("id", "");
            生成的sql: select * from users
2. in条件的写法 id in :ids
    1. in条件的参数值必须是 null 或 List 或 数组
    2. 当使用 setParam 时,必须是非空的List或者非空的数组
    3. 当使用 setParamAuto 时,如果是 null、空的List、空的数组,该行条件被自动忽略
    4. 例子:
        select *
        from users
        where id in :ids
    java代码:
        1. sqlQuery.setParam("ids", new int[]{1,2,3});
            生成的sql: select * from users where id in (1,2,3)
            如果传入的参数是 null,空的List,空的数组 程序会抛出异常
        2. sqlQuery.setParamAuto("ids", new int[]{1,2,3});
            生成的sql:select * from users where id in (1,2,3)
            sqlQuery.setParamAuto("ids", null); 或 sqlQuery.setParamAuto("ids", new int[]{});
            生成的sql: select * from users
3. like的写法
    这里只简单的举个例子,具体用法跟上面的类似
    select *
    from users
    where username like :username
    java代码:
        sqlQuery.setParamLike("username", "张");
        生成的sql:select * from users where username like '%张%'
4. 注意1:
    where条件是以行为单位判断的,如果行中有多个参数,并且使用 setParamAuto 时,只要有一个参数为空,整行将被忽略
    例1:
    select *
    from users
    where id = :id and `status` = 'valid'
    java代码:
        sqlQuery.setParamAuto("id", null);
        生成的sql select * from users
5. 注意2:
    多动态条件的写法,为了防止特定条件被忽略,导致的sql语法错误,请用 where 1=1 写条件开始
    例1:
    select *
    from users
    where username like :username
    and gender = :gender
    java代码:
        sqlQuery.setParamAuto("gender", "male");
        由于 username参数没有设置,所以生成的sql是:select * form users and gender = 'male'
    改进:
    select *
    from users
    where 1=1
    and username like :username
    and gender = :gender
    同样的java代码,生成的sql:select * from users where 1=1 and gender = 'male'

普通where完整例子

field = :fieldVal,当采用这种写法的时候,系统会根据fieldVal是否有设置值自动拼接条件
需要注意的是,如果这时没有设置fieldVal的值,那么整行的条件都将忽略,即使后面有 and field1 = 2 这样的条件,都将被忽略

例子:getUser.sls
#根据userid查询用户

select *
from users
where user_id = :user_id

java代码:
//获得session
Session session = sessionFactoryManager.getBasedataSession();
//执行查询
Map userInfo = SqlQuery.create("getUser.sls")
    .setParam("user_id", "123456")
    .getOneView(session);

where的高级写法

WHERE_key:指定的查询条件,key为将来设置条件的时候的索引,非特殊情况下不推荐采用这种写法,直接2中描述的写法
需要注意:采用这种写法需要手动调用api enableWhere(key)的方式,启用where
高级where跟普通where是类似的逻辑,只是在没有 调用api enableWhere(key) 时,这些where始终被忽略
例子:
    select *
    from users
    where 1=1
    WHERE_username=and username like :username
    and gender = :gender
java代码:sqlQuery.setParamLikeRight("username", "张");
    虽然设置了username的参数值,但是没有使用api启用;因此该行条件被忽略
    生成的sql:select * from users where 1=1
    如果java代码中在上面的基础上再加入:sqlQuery.enableWhere("username");
    生成的sql:select * from users where 1=1 and username like '张%'

order by的写法

解析器会自动分析order by,请确保sql中只有一个以order by开头的行
注意1:如果order by前有空格及tab等也算是以order by开头)
注意2:如果其他子查询里用到order by,请把order by放到其他行上,只要不以order by开头即可
注意3:如果需要运行时指定排序,务必要在文件中写 order by,order by后可以什么都不写

java api:
setOrderbyASC(列名);
setOrderbyDESC(列名);
例1:
    select *
    from users
    where 1=1
    WHERE_username=and username like :username
    and gender = :gender
    order by
例子的 order by说明没有默认排序,排序全部是通过 java api 指定,当没有任何指定时,order by行将被忽略
如果写下面的java代码:sqlQuery.setOrderbyDESC("gender");
生成的sql:select * from users where 1=1 order by gender
    例1:
    select *
    from users
    where 1=1
    WHERE_username=and username like :username
    and gender = :gender
    order by username
例子的order by指定了用username做默认排序,如果在使用java api指定排序,程序会自动拼接排序
同样的java代码:sqlQuery.setOrderbyDESC("gender");
生成的sql:select * from users where 1=1 order by username,gender
如果没有用api指定排序
生成的sql:select * from users where 1=1 order by username

分页时的写法

SQL_COUNT 关键字

表示下面的语句为count的语句,请单独占一行
在使用分页时,务必要 使用 “SQL_COUNT” 关键字指定数量查询语句,否则系统会抛出异常,无法执行
温馨提示:简单处理方式就是把 数据查询的 select**** 部分 改为 select count(1)

内置参数

:startRow,:endRow,:pageSize, :pageIndex,这四个参数是系统占用参数
如果分页要使用这些参数,请直接使用,无需自己重新定义,其他参数不要与该参数冲突

不同数据库,系统默认生成的分页方式

mysql分页,程序会在 sql后自动补充 limit ?,? 无需自己写
oracle分页,程序会自动使用
select * from (select rownum rnm,rs.* from (*******) rs where rownum <= ?) rss where rnm >= ?"

完整例子

#查询学生信息,其中 班级id 和 学校id是动态条件
SELECT u.id as uid, u.user_id, u.username, s.grade_id, cl.id as clazz_id, cl.`name` as clazz_name, c.id as campus_id, c.`name` as campus_name
from users u
inner join student s
on u.id = s.id
INNER JOIN clazz cl
on s.clazz_id = cl.id
and cl.id = :clazz_id
inner join campus c
on s.campus_id = c.id
and c.id = :campus_id

SQL_COUNT
SELECT count(1)
from users u
inner join student s
on u.id = s.id
INNER JOIN clazz cl
on s.clazz_id = cl.id
and cl.id = :clazz_id
inner join campus c
on s.campus_id = c.id
and c.id = :campus_id