Source 组件介绍
Source 主要为数据源提供简易的操作接口,使底层的具体数据源(传统数据库、文件系统、内存数据库、缓存)对上层是透明的。Source 提供两种类型的数据源:DataSource 和 CacheSource。DataSource 为数据库或内存数据库,提供类似JPA、Hibernate的接口与功能。CacheSource 为缓存数据提供类似Memcached、Redis的接口和功能。两者也提供了异步接口(基于远程模式Service)。
DataSource 入门
DataSource:
与JPA相比,DataSource有以下几个特点:
1、简易的过滤查询接口,但仅支持简单的表关联查询。
2、分布式的主键的分布式自增策略。
3、动态更新变更后的数据库连接参数。
4、读写分离的简易配置。
5、进程间的缓存会自动同步。
为了降低学习成本,DataSource重用了JPA里的部分注解与配置文件,使用方法基本相同,与JPA用法唯一区别是注解只能标记于字段,不能标记在方法上。
| 注解类名 | 功能描述 |
|---|---|
| javax.persistence.Cacheable | 标记Entity类是否需要缓存,与JPA用法一致 |
| javax.persistence.Column | 标记字段,只使用其name()、insertable()、updatable()属性 |
| javax.persistence.Entity | JPA的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&autoReconnectForPools=true&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>