sql配置

我们已经了解ActiveRecord的一些基本用法了,但是ActiveRecord的优势在于单表查询和操作,联表查询目前不能直接通过ActiveRecord进行,leap-orm提供了sql配置的方式进行联表查询.

sql配置和使用

conf目录下添加sqls.xml,也可以添加sqls目录,并在目录下添加任意名称的'.xml'文件:

src/main/resources
      └ conf
          ├ sqls
          │   ├ user.xml
          │   └ post.xml
          ├ beans.xml
          ├ config.xml
          └ sqls.xml

这里我们创建了sqls.xml用来保存配置的sql,同时为了预防未来sql配置比较多,在sqls目录下创建了user.xmlpost.xml,按照模块划分sql配置。

现在我们先看看sqls.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<sqls xmlns="http://www.leapframework.org/schema/sqls">
    <command key="user-post-list">
        SELECT 
          u.*,
          p.`name` pname,
          p.`descript` 
        FROM
          leap_user u 
          JOIN leap_user_post up 
            ON up.`user_id` = u.id 
          JOIN leap_post p 
            ON up.`post_id` = p.`id`
    </command>
</sqls>

sqls.xml配置的根节点是sqls标签,这个标签下每一个sql都是一个单独的command标签,command标签的key属性是这个sql的唯一标示,不能包含空格.

现在我们在UserModelController下添加一个action:

public List<User> userPost(){
    return User.<User>query("user-post-list")
            .orderBy("name").list();
}

现在我们可以测试请求了:

http请求:
url:
   /user_model/user_post

返回结果:
[
  {
    "id": "990104a3-d47e-472d-86c0-5d6e13a02b4f",
    "descript": "软件工程师岗位",
    "name": "张三",
    "age": 20,
    "password": "123123",
    "createdAt": 1447125740000,
    "pname": "软件工程师",
    "loginId": "zhangsan"
  },
  {
    "id": "15583768-8b55-475f-87e0-6ddaee3cb910",
    "descript": "软件工程师岗位",
    "name": "王五",
    "age": 32,
    "password": "123123",
    "createdAt": 1447134433000,
    "pname": "软件工程师",
    "loginId": "wangwu"
  },
  {
    "id": "8bcaa593-fddd-4c6f-8443-b5091cae4388",
    "descript": "部门经理的岗位",
    "name": "赵六",
    "age": 19,
    "password": "123123",
    "createdAt": 1447134462000,
    "pname": "部门经理",
    "loginId": "zhaoliu"
  }
]

这里我们可以看到联表查询的结果了.

注意:

  1. 这里我们用User的列表接收参数结果,但实际上User并没有pname和descript这两个字段.不过这两个字段也会保存在User对象中,
    在java中可以用过user.get("pname")的方式获取到这个字段的值.

sql参数占位符

模型对象的章节里,我们已经知道可以通过?来设置sql的参数占位符,对应的参数按照顺序传入即可,这是一种比较简单的方式,并不能满足所有的参数传递的需求,leap-orm提供了另一种参数传递的方式.

在sql中,可以使用:paramName做为参数占位符.传入参数的时候,按照paramName:paramValue的方式传入即可.比如有如下的sql:

SELECT * FROM leap_user WHERE name = :userName

调用传参的时候可以有两种方式:

//方法一
User.query(sqlKey).param("userName", "张三").list();
//方法二
Map<String,Object> params = new HashMap<String,Object>();
params.put("userName", "张三");
User.query(sqlKey).params(params).list();

最终执行的sql如下:

 SQL  : select t.* from leap_user t where name = ?
 ARGS : ['张三',]

当然,实际上对于如此简单的sql,我们也可以不写在sql配置文件里,而直接使用查询:

User.query("SELECT * FROM leap_user WHERE name = :userName").param("userName", "张三").list();

sql的配置不仅仅是提供可以在不同的部署环境配置sql的功能,leap的sql配置提供了更加强大的动态sql功能,我们在下一节进行详细的介绍.

results matching ""

    No results matching ""