创建数据库用户并分配权限,这里就不详细说了。我已经有一个本地数据库的用户huchen.
在用户下创建表-- Create table create table XSQL_EMPLOYEE ( ID NUMBER, LASTNAME VARCHAR2(15), FIRSTNAME VARCHAR2(15), JOB VARCHAR2(30) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited );插入数据:insert into xsql_employee (ID, LASTNAME, FIRSTNAME, JOB) values (1, 'chen', 'hu', 'coder'); insert into xsql_employee (ID, LASTNAME, FIRSTNAME, JOB) values (2, 'lijun', 'zhang', 'Director ');
设置数据库连接
在XSQLConfig.xml文件中找到connection节点,并根据你的数据库设置如下:
<connection name="xsql_test"> <username>huchen</username> <password>huchen</password> <dburl>jdbc:oracle:thin:@localhost:1521:hcdb</dburl> <driver>oracle.jdbc.driver.OracleDriver</driver> <autocommit>false</autocommit> </connection>2)第一个xsql page
创建一个java web项目,在src目录下添加XSQLconfig.xml
在WebRoot目录下增加一个文件夹xsql,并在xsql文件夹下添加文件test1.xsql,在该文件下添加代码:
<?xml version="1.0"?> <?xml-stylesheet type=text/xsl" href="helloworld.xsl"?> <page connection="xsql_test" xmlns:xsql="urn:oracle-xsql"> <xsql:query> select * from xsql_employee </xsql:query> </page>访问http://localhost:8088/xsql_test/xsql/test1.xsql
将看到如下页面:
如果你的查询没匹配任何行,你又想在这种情况下执行另一个查询,你可以用
xsql:no-rows-query标签,他必须使用在xsql:query标签之下。如:
<?xml version="1.0"?> <?xml-stylesheet type=text/xsl" href="helloworld.xsl"?> <page connection="xsql_test" xmlns:xsql="urn:oracle-xsql"> <xsql:query> select * from xsql_employee where id = 1111 <xsql:no-rows-query> select * from xsql_employee </xsql:no-rows-query> </xsql:query> </page>2.writing xsql pages
1)查询数据库
xsql:query 标签是用来从数据库检索信息的。在前面的例子中,我们都简单的把一个sql放在该标签中,这个标签中只能放select 语句,如果你放一个insert语句在该标签中,那么xsql page processor将拒绝它。
在上面的例子中,查询语句查出的结果被转变成xml标签替代了xsql:query标签,表中的列名在每一行中替换成了xml元素的标签名字。如果你不喜欢列名,你可以用”select id as employee_id 来替代。
特别是当你的输出列名中有特殊字符的时候,如:
select id, to_char(hiredate, ‘YYYY-MON’) from xsql_employee
如果你这么写,你将得到一个错误,第二列包含了”(“,这是xml标签名不能允许的,所以你需要给他一个别名,如:
select id, to_char(hiredate, ‘YYYY-MON’) as hiredate from xsql_employee
你同样可以设置程序自己生成的rowset 和row标签,使用xsql:query的row-element 和 rowset-element 属性来设置。如:
<?xml version="1.0"?> <xsql:query connection="xsql_test" xmlns:xsql="urn:oracle-xsql" row-element="EMPLOYEES" rowset-element="EMPLOYEE_LIST"> select * from xsql_employee </xsql:query>
如果你需要在同一个page里使用多个xsql:query,则他们需要包含在一个跟节点下。因为一个xml文档必须要有一个根节点。
如:
<?xml version="1.0"?> <?xml-stylesheet type=text/xsl" href="helloworld.xsl"?> <page connection="xsql_test" xmlns:xsql="urn:oracle-xsql"> <xsql:query> select * from xsql_employee </xsql:query> <xsql:query> select * from xsql_employee </xsql:query> </page>
3.xsql parameters
xsql分为4种参数:
a.request parameters
b.page-private parameters
c.stylesheet parameters
d.session parameters
e.cookies
后面将说明各种类型的参数的用处。但是在此之前,我们的第一步是知道怎样去关联参数和参数值怎么在xml中呈现的。
1)关联参数
xsql page processor 通过寻找{@paramName}来解析xsql 页的参数,当他找到这种形式的参数时,它将用参数的值来替换{@paramName}。
下面来看一个例子:
<?xml version="1.0"?> <page xmlns:xsql="urn:oracle-xsql" connection="{@conn}"> <xsql:query> select {@fields} from {@tables} </xsql:query> </page>如果你键入url不带参数,你将会的到报错信息。
键入以下url,将返回表中所有行
http://localhost:8088/xsql_test/xsql/very-unsecure.xsql?conn=xsql_test&fields=*&tables=xsql_employee
参数必须放在xsql:动作标签内,不然xsql解析器不会去替换参数的。
如果你把刚才xsql文档改为如下:
<?xml version="1.0"?> <page xmlns:xsql="urn:oracle-xsql" connection="{@conn}"> <xsql:query> select {@fields} from {@tables} </xsql:query> <conn>{@conn}</conn> <fields>{@fields}</fields> <tables>{@tables}</tables> </page>
2)显示参数
在前面的例子中,我们知道了如何关联参数,但是如果你想要参数包括在输出中,需要使用<xsql:include-param> 或者<xsql:include-request-params>
例:
<?xml version="1.0"?> <page xmlns:xsql="urn:oracle-xsql" connection="{@conn}"> <xsql:include-param name="conn" /> <xsql:include-param name="fields" /> <xsql:include-param name="tables" /> </page>在这种情况下,你必须为每一个显示的参数写代码,如果你想显示所有的参数,你可以用<xsql:include-request-params>标签
如:
<?xml version="1.0"?> <page xmlns:xsql="urn:oracle-xsql" connection="{@conn}"> <xsql:include-request-params/> </page>3)参数类型
a)request parameters
在上面的例子中,我们用到的就是请求参数。这很好理解,请求参数是是http请求的一部分。刚才的例子中我们用到的是http的 get 方法获得的request,post方法也可以获得参数。例:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>post param form</title> </head> <body> <form action="xsql/very-unsecure.xsql" method="post"> <table border="0"> <tr> <td>connection:</td> <td><input type="text" name="conn" /></td> </tr> <tr> <td>fields:</td> <td><input type="text" name="fields" /></td> </tr> <tr> <td>tables:</td> <td><input type="text" name="tables" /></td> </tr> <tr> <td colspan="2" align="center"> <input name="submitButton" type="submit" value="select" /> </td> </tr> </table> </form> </body> </html>这个页面将获得同样的结果。
b)Page-Private Parameters
page-private parameters 是当前页面的私有的参数,不像session parameters和cookie parameters能够跨多个页面。
你可以通过<xsql:set-page-param>标签来明确的在你的页面中设置私有参数。
设置方法有两种,第一种直接指定参数值,第二种通过sql返回一个参数值。
如:
<?xml version="1.0"?> <page xmlns:xsql="urn:oracle-xsql" connection="xsql_test"> <xsql:set-page-param name="lastname" value="chen"/> <xsql:set-page-param name="job"> select job from xsql_employee where lastname='{@lastname}' </xsql:set-page-param> <xsql:include-param name="lastname"/> <xsql:include-param name="job"/> <xsql:query> select * from xsql_employee where job='{@job}' </xsql:query> </page>c)session parameters
略
d)cookie
略
4)默认参数
在上面的例子中,我们的xsql依赖于参数的设定或者是request参数,有时,我们希望给他一个默认值。
如:
<?xml version="1.0"?> <page fields="*" conn="xsql_test" tables="xsql_employee" xmlns:xsql="urn:oracle-xsql" connection="{@conn}"> <xsql:include-request-params /> <xsql:query> select {@fields} from {@tables} </xsql:query> </page>5)使用绑定变量
目前,我们使用的的都是通过{@param}这种方式引用参数,这种方式在解析的时候只是简单的字符串的替换,这种方式在某些情况下是很方便的,但是他并不会对sql进行优化.
让我们先来看下下面的例子:
<?xml version="1.0"?> <page job="coder" firstname="hu" xmlns:xsql="urn:oracle-xsql" connection="xsql_test"> <xsql:query bind-params="job firstname"> select * from xsql_employee where job=? and firstname=? </xsql:query> </page>这里我们没有用{@param}这种形式,而用了问号。在解析的时候,问号被按照<bind-params>属性中列出的参数顺序替代。
绑定变量使得优化sql语句变的简单,当你没有绑定变量的时候,sql优化器只能一次优化一个sql语句,优化器不知道将会有很多很多按照这种结构写出的sql,但是用绑定变量方式,sql优化器将预计会有很多同样结构的sql,在上面的例子中,优化器将知道会有很多按照职位和姓来查找员工.