配置guzz.xml
核心配置
guzz.xml为guzz框架的核心配置文件,用于定义应用配置,数据库使用,ORM,以及服务等。
guzz.xml样本:
1 <guzz-configs> 2 3 <config-server> 4 <server class="org.guzz.config.LocalFileConfigServer"> 5 <param name="resource" value="guzz_app.properties" /> 6 </server> 7 </config-server> 8 9 <dialect class="org.guzz.dialect.H2Dialect"></dialect> 10 <dialect name="mysql5dialect" class="org.guzz.dialect.Mysql5Dialect" /> 11 <dialect name="oracle10gdialect" class="org.guzz.dialect.Oracle10gDialect" /> 12 13 <tran> 14 <dbgroup name="default" masterDBConfigName="masterDB" /> 15 <dbgroup name="log" masterDBConfigName="masterDB" dialectName="mysql5dialect" /> 16 <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" /> 17 </tran> 18 19 <import resource="include/part2.xml" /> 20 21 <business name="user" dbgroup="default" class="org.guzz.test.User" interpret="" file="classpath:org/guzz/test/User.hbm.xml" /> 22 <business name="book" class="org.guzz.test.Book" file="classpath:org/guzz/test/Book.hbm.xml" /> 23 <business name="userInfo" dbgroup="oracle" class="org.guzz.test.UserInfo" file="classpath:org/guzz/test/UserInfo.hbm.xml" /> 24 <business name="userInfo2" dbgroup="default" file="classpath:org/guzz/test/UserInfoH2.hbm.xml" /> 25 <business name="comment" dbgroup="default" file="classpath:org/guzz/test/Comment.hbm.xml" /> 26 <business name="cargo" dbgroup="default" file="classpath:org/guzz/test/shop/Cargo.hbm.xml" /> 27 <business name="sp" dbgroup="default" file="classpath:org/guzz/test/shop/SpecialProperty.hbm.xml" /> 28 29 <service name="onlyForTest" configName="onlyForTestConfig" class="org.guzz.test.sample.SampleTestService" /> 30 <service name="onlyForTest2" configName="onlyForTest2Config" class="org.guzz.test.sample.SampleTestService2" /> 31 32 <sqlMap dbgroup="default"> 33 <select id="selectUser" orm="user" dbgroup="default"> 34 select * from @@user 35 where 36 @id = :id and @status = :checked 37 <paramsMapping> 38 <map paramName="userName" propName="userName" /> 39 <map paramName="checked" type="int" /> 40 </paramsMapping> 41 </select> 42 43 <select id="selectUserByName" orm="user"> 44 select id, userName, vip, password from tb_user where userName = :userName 45 </select> 46 47 <update id="updateUserFavCount" orm="userObjectMap"> 48 update @@user set @favCount = favCount + 1 49 </update> 50 51 <select id="selectUsers" orm="userObjectMap"> 52 select @id, @name, @vip, @favCount from @@user 53 </select> 54 55 <select id="listCommentsByName" orm="commentMap"> 56 select * from @@commentMap where @userName = :userName 57 </select> 58 59 <orm id="userObjectMap" class="org.guzz.test.UserModel"> 60 <result property="id" column="pk"/> 61 <result property="name" column="userName"/> 62 <result property="favCount" column="FAV_COUNT"/> 63 <result property="vip" column="VIP_USER"/> 64 </orm> 65 66 <orm id="commentMap" class="org.guzz.test.Comment" table="TB_COMMENT" shadow="org.guzz.test.CommentShadowView"> 67 <result property="id" column="id" type="int"/> 68 <result property="userId" column="userId" type="int"/> 69 <result property="userName" column="userName" type="string" /> 70 <result property="createdTime" column="createdTime" type="datetime" /> 71 </orm> 72 </sqlMap> 73 74 </guzz-configs>
其中:
config-server:指定应用配置信息管理服务。guzz通过配置服务器读取应用的各项配置参数。默认实现为本地文件配置,本例中通过读取guzz_app.properties加载配置信息。
guzz_app.properties: 为应用配置文件,按照组进行设置。类似于Mysql数据库的配置文件,在下一节进行详细介绍。本例中为向org.guzz.config.LocalFileConfigServer配置管理服务器传入的参数。
dialect:指定数据库的实现方言。目前dialect主要用来创建主键,以及进行物理分页查询。dialect可以指定1个名称,默认为default。guzz允许一次管理多组不同类型的数据库,dialect可以配置多个。
tran:定义数据库组,1个tran下可以有多个 dbgroup,每个dbgroup可以指定主数据库配置名和从数据库配置名,以及dialect名(默认用default)。guzz通过配置名,从配置服务器中查询配置,本例中就是从guzz_app.properties读取此组名的配置信息。每个dbgroup对应1个物理的数据库组,可以有主库从库之分,也可以通过不同的dialect名称设置不同类型的数据库厂商,默认的dialect名称为default。
business:定于领域对象。1个领域对象对应数据库中的一张表。领域对象必须指定一个名字name属性(以后称为 businessName),这个名字以后可以用来代替类名查询对象,以及在jsp taglib中标示读取什么对象。business可以指定dbgroup属性,标示对象存储在那一组数据库中,默认为default组。file属性制定hbm.xml文件位置。business可以指定interpret属性进行高级的taglib标签条件控制,interpret为实现 org.guzz.orm.BusinessInterpreter接口的完整类名,也可以指定class属性覆盖hbm.xml中设定的class。
import:引入一个子配置文件,通过resource属性指定配置文件相对当前文件的位置。import工作时相当于汇编的宏或者c++的inline函数,他copy子文件的配置内容合并到import的位置,然后再按照1个整体来解析。
service:用于外挂系统服务。name为服务名称,在程序中可以通过name查询到服务实例;configName为配置信息组名称,class为服务实现客户端。class必须实现org.guzz.Service接口。
sqlMap:定义sql语句以及sql映射,类似于ibatis。sqlMap可以指定dbgroup属性标记此sqlMap下所有查询对应的数据库组,默认为default数据库组。
sqlMap/select|update:定义sql查询和更新|删除语句,通过id指定名称(在程序中使用的名称),通过orm 属性指定要Mapping的配置。sql语句为可在数据库中执行的标准sql语句。在编写sql语句时,为了方便记忆,可以用@@businessName或者@@full-class-name的方式代替数据库表名,用@java属性名称或者@orm/result/property 名称代替对应的数据库字段,guzz在执行时会完成自动替换;当然也可以不用。
如果sql中包含参数,使用“冒号+参数名称”代替,如“:userName”,在程序中执行时通过java.util.Map传入"userName"->value对进行调用,guzz将完成命名参数的参数设置(PreparedStatement方式)。
参数设置时,需要确定参数的数据类型。默认情况下,数据类型由JDBC驱动自动检测与匹配(可能会不准确),用户也可以自己定义参数的数据类型(建议方式)。设置方法是将参数与映射后对象的属性名称做映射,guzz将按照java属性的类型对待参数类型。定义方法为在select/update中增加paramsMapping/map配置,如上面示例中id为selectUser的sql配置。map接受3个参数,paramName为参数名称,必须填写;propName为参数对应的java属性名称,type为数据类型,类似hbm.xml中定义属性的type属性。propName和type必须设定1个,用于确定paramName的数据类型。做完映射后,guzz支持自动把字符串类型转为需要的类型,在使用动态SQL需要自动传入与解析不确定的参数时,非常有用。
select|update的orm属性值可以是本文件中定义的orm元素的值,也可以是领域对象的businessName(直接使用hbm.xml或者annotation定义的映射)。orm映射默认将结果转会成领域对象,用户也可以通过配置result-class自定义转换成的java对象。result-class可以是javabean类或Map类,如...result-class="org.guzz.SomeBeanForm",或result-class="java.util.HashMap"。
select|update的templated属性用于开启模板化SQL,也就是根据参数动态的解析和组装sql语句。具体请参看 TemplatedSQL
orm:定义sql查询结果字段与对象的对应关系,类似ibatis。可以通过指定dbgroup覆盖sqlMap中设定的数据库。 orm可以放在sqlMap内,表示此ORM在本sqlmap内有效,也可以放在sqlMap外,表示所有sqlMap中的select/update都可以使用。放在sqlMap内的orm优先级高于放在sqlMap的,同时orm名称不能是business name,所有business name会按照自己的名字自动声明自己为一个全局的orm。因此,在配置的sql语句选择orm时,可以填写为business name使用hbm.xml的映射关系(hbm.xml中所有的特殊功能,包括表分切自定义属性延迟加载等将依然有效),但此时将查询结果转换成java对象时采用hibernate的规则,查询多少字段映射多少字段,没有select的属性设为默认值。
orm/result:每1个Result代表一列的对应关系,property为java属性名,column为数据库属性,type为数据类型(与hbm.xml中的type含义和取值相同);如果type没有指定,则通过orm/class按照property属性反射获取类型。
sql语句中特殊字符转义
在sql语句中,某些特殊的字符为sql语句保留或是guzz保留。如果这些字符仅仅是参数值的一部分,在拼接成sql语句中时,需要进行转义。
需要转义的字符有
特殊字符 | 转义写法 |
: | \: |
@ | \@ |
' | \' |
\ | \\ |
" | \" |
举例来说:
1 select * from @@article where @title=:title and @createdTime > to_date('20110101 0\:0\:0', 'YYYYMMDD HH24\:MI\:SS')
在上面的例子中,时间值包含“:”,则需要进行转义;否则guzz将把“:”后的内容当作命名参数处理,引发错误。
注意: 如果参数值通过命名参数传入,特殊字符也不需要转义。转义仅适用于直接的sql拼接。
guzz支持的数据库和dialect
数据库 | dialect | 备注 |
Mysql 5.0+ | org.guzz.dialect.Mysql5Dialect | 估计老版本的也支持,没有测试过 |
Oracle 8i | org.guzz.dialect.Oracle8iDialect | - |
Oracle 9i | org.guzz.dialect.Oracle9iDialect | - |
Oracle 10g | org.guzz.dialect.Oracle10gDialect | - |
H2 Database | org.guzz.dialect.H2Dialect | - |
Microsoft SQL Server 2000+ | org.guzz.dialect.MSSQLDialect | 不支持分页查询。未测试。 |
guzz支持的数据类型
数据库 | 数据库数据类型 | guzz中type取值 | Java类型 | 含义 |
所有 | int | int | int | 整数 |
所有 | string | string | java.lang.String | 字符型 |
所有 | varchar | string | java.lang.String | 字符型 |
所有 | nvarchar | string | java.lang.String | 字符型 |
所有 | char | string | java.lang.String | 字符型 |
所有 | nchar | string | java.lang.String | 字符型 |
所有 | text | string | java.lang.String | 字符型 |
所有 | datetime | datetime | java.util.Date或java.sql.Timestamp | 时间戳,包含日期和时间 |
所有 | timestamp | datetime | java.util.Date或java.sql.Timestamp | 时间戳,包含日期和时间 |
所有 | date | date | java.util.Date或java.sql.Date | 日期 |
所有 | time | time | java.util.Date或java.sql.Time | 时间 |
所有 | bool | boolean | boolean | 布尔型 |
所有 | boolean | boolean | boolean | 布尔型 |
所有 | bigint | bigint | long | 长整型 |
所有 | long | bigint | long | 长整型 |
所有 | double | double | double | 长浮点型 |
所有 | money | decimal | java.math.BigDecimal | 货币类型 |
所有 | decimal | decimal | java.math.BigDecimal | 货币类型 |
所有 | float | float | float | 浮点型 |
所有 | short | short | short | 短整型 |
所有 | smallint | short | short | 短整型 |
所有 | tinyint | short | short | 短整型 |
所有 | byte | byte | byte | 字节 |
所有 | bit | byte | byte | 字节 |
所有 | bytes | bytes | byte[] | 字节数组 |
所有 | binary | bytes | byte[] | 字节数组 |
所有 | varbinary | bytes | byte[] | 字节数组 |
所有 | clob | clob | org.guzz.pojo.lob.TranClob | 大字符 |
所有 | blob | blob | org.guzz.pojo.lob.TranBlob | 大二进制 |
所有 | int | enum.ordinal|enum.class.fullname | enum类 | java枚举类型。数据库中为整数定义,enum.class.fullname为枚举类的完整类名。 |
所有 | varchar | enum.string|enum.class.fullname | enum类 | java枚举类型。数据库中为字符定义,enum.class.fullname为枚举类的完整类名。 |
Microsoft SQL Server | image | bytes | byte[] | 字节数组 |
Microsoft SQL Server | varbinary | bytes | byte[] | 字节数组 |
Oracle8i+ | oracle long类型 | Oracle.Long | java.lang.String | string字符型 |
Oracle8i+ | varchar2 | string | java.lang.String | 字符型 |
Oracle8i+ | nclob | clob | org.guzz.pojo.lob.TranClob | 大字符 |
Oracle8i+ | raw | bytes | byte[] | 字节数组 |