Source 组件介绍

         Source 主要为数据源提供简易的操作接口,使底层的具体数据源(传统数据库、文件系统、内存数据库、Memcached/Redis缓存)对上层是透明的。其提供两种类型的数据源:DataSource 和 CacheSource。DataSource 为数据库或内存数据库,提供类似JPA、Hibernate的接口与功能。CacheSource 为缓存数据提供类似Memcached、Redis的接口和功能。两者也提供了异步接口(基于远程模式Service)。

DataSource 入门

        与JPA相比,DataSource有以下几个特点:
                 1、简易的过滤查询接口,但仅支持简单的表关联查询。
                 2、分布式的主键的分布式自增策略。
                 3、动态更新变更后的数据库连接参数。
                 4、读写分离的简易配置。
                 5、进程间的缓存会自动同步。
        为了降低学习成本,DataSource重用了JPA里的部分注解与配置文件,使用方法基本相同,与JPA用法唯一区别是注解只能标记于字段,不能标记在方法上。

注解类名功能描述
javax.persistence.Cacheable标记Entity类是否需要缓存,与JPA用法一致
javax.persistence.Column标记字段,只使用其name()、insertable()、updatable()属性
javax.persistence.EntityJPA的Entity类必须标记为@Entity, 而RedKale不强制要求,所以该注解一般无用
javax.persistence.GeneratedValue仅用于标记主键是否为数据库自增长,其内值的两属性废弃
javax.persistence.GenerationType被@GeneratedValue的属性引用,在RedKale内不被使用到
javax.persistence.Id标记主键字段,与JPA用法一致
javax.persistence.Table标记表的别名,与JPA用法一致
javax.persistence.Transient标记是否为表对应的字段,与JPA用法一致
以下是RedKale自定义的注解
@VirtualEntity用于非数据库表对应的Entity类,且仅用于开启缓存模式的DataSource
@DistributeGenerator标记主键是否采用分布式自增长策略,不能与@GeneratedValue同用
@DistributeTables当多个表的主键唯一性公用时需要该注解
@FilterColumn用于FilterBean过滤类的字段设置
@FilterJoinColumn用于FilterBean过滤类的关联表字段设置
@FilterGroup用于FilterBean过滤类的过滤条件分组设置

        DataSource提供的接口分几种系列:

系列方法功能描述
insert插入数据
delete删除数据
update更新数据
updateColumnXXX更新数据的部分字段
getNumberResult统计查询,用于查询字段的总和、最大值、平均值等数据
queryColumnXXX单个字段数据查询和字段的统计查询
find查找单个对象
queryList查询对象的List集合
querySheet查询对象的Sheet页式集合
directXXX直接运行SQL语句,用于复杂的关联查询与更新

未完待续……

persistence.xml 配置说明

<!-- 其配置算是标准的JPA配置文件的缩略版 -->
<persistence>	
    <!-- 系统基本库 -->
    <persistence-unit name="demouser">
        <!-- 为NONE表示不启动缓存,@Cacheable 失效; 非NONE值(通常用ALL)表示开启缓存。 -->
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/dbuser?characterEncoding=utf8"/>
            <!-- 
                javax.persistence.jdbc.driver在JPA的值是JDBC驱动,RedKale有所不同,值应该是javax.sql.DataSource的子类。 
                为了兼容用户习惯,RedKale内置常见JDBC驱动到javax.sql.DataSource的映射关系:
                                       com.mysql.jdbc.Driver  ——————  com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
                                     org.mariadb.jdbc.Driver  ——————  org.mariadb.jdbc.MySQLDataSource
                             oracle.jdbc.driver.OracleDriver  ——————  oracle.jdbc.pool.OracleConnectionPoolDataSource
                com.microsoft.sqlserver.jdbc.SQLServerDriver  ——————  com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource
                因此 com.mysql.jdbc.Driver 会被自动转换成 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
            -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="123456"/>
        </properties>
    </persistence-unit>
    <!-- IM消息库 -->
    <persistence-unit name="demoim">
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties>
            <!-- jdbc:mysql://127.0.0.1:3306/dbim?autoReconnect=true&amp;autoReconnectForPools=true&amp;characterEncoding=utf8 -->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/dbim?characterEncoding=utf8"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="123456"/>
        </properties>
    </persistence-unit>
</persistence>