# activerecord-solon-plugin
#### 介绍
此说明文档中的示例及源码来自于专有Demo:https://gitee.com/gollyhu/activerecord-solon-plugin-demo
#### 使用说明
1. 配置示例
```yaml
demo.db1:
schema: rock
jdbcUrl: jdbc:mysql://localhost:3306/jfinal_demo?useSSL=false
driverClassName: com.mysql.jdbc.Driver
username: root
password: 123456
demo.db2:
schema: rock
jdbcUrl: jdbc:mysql://localhost:3306/jfinal_demo?useSSL=false
driverClassName: com.mysql.jdbc.Driver
username: root
password: 123456
```
2. 启动示例
``` java
/**
* 启动应用
*/
public class DemoApp {
public static void main(String[] args) {
Solon.start(DemoApp.class, args, app -> {
app.onEvent(ActiveRecordPlugin.class, arp -> {
if (Solon.cfg().isDebugMode() || Solon.cfg().isFilesMode()) {
arp.setDevMode(true); // 启用开发模式
arp.setShowSql(true); // 启用SQL输出
}
});
});
}
}
```
3. 数据源配置示例
``` java
/**
* 配置数据源
*/
@Configuration
public class Config {
@Bean(name="db1", typed=true) // typed=true 为默认数据源
public DataSource db1(@Inject("${demo.db1}") HikariDataSource dataSource) {
return dataSource;
}
@Bean("db2") // 指定ActiveRecord数据源名称为db2
public DataSource db2(@Inject("${demo.db2}") HikariDataSource dataSource) {
return dataSource;
}
}
```
4. 应用示例
```java
@Controller
@Mapping("/blog")
public class BlogController {
@Inject
BlogService blogService;
@Mapping("/add")
public ModelAndView add(Context ctx) {
return new ModelAndView("/blog/add.html");
}
@Mapping("/delete/{id}")
public void delete(Context ctx, Integer id) {
this.blogService.deleteById(id);
ctx.redirect("/blog");
}
@Mapping("/edit/{id}")
public ModelAndView edit(Context ctx, Integer id) {
ModelAndView mav = new ModelAndView("/blog/edit.html");
mav.put("blog", this.blogService.findById(id));
return mav;
}
@Mapping
public ModelAndView index(Context ctx) {
return this.index(ctx, 1);
}
@Mapping("/{pageNumber}")
public ModelAndView index(Context ctx, Integer pageNumber) {
ModelAndView mav= new ModelAndView("/blog/blog.html");
mav.put("blogPage", this.blogService.paginate(pageNumber, 10));
return mav;
}
/**
* save 与 update 的业务逻辑在实际应用中也应该放在 serivce 之中,
* 并要对数据进正确性进行验证,在此仅为了偷懒
*/
@NotEmpty({"title", "content"})
@Mapping("/save")
public void save(Context ctx, @Validated Blog blog) {
this.blogService.save(blog);
ctx.redirect("/blog");
}
/**
* save 与 update 的业务逻辑在实际应用中也应该放在 serivce 之中,
* 并要对数据进正确性进行验证,在此仅为了偷懒
*/
@NotEmpty({"id", "title", "content"})
@Mapping("/update")
public void update(Context ctx, @Validated Blog blog) {
this.blogService.update(blog);
ctx.redirect("/blog");
}
}
```
#### 代码生成
1. 代码生成器
```java
/**
* 代码生成器
*/
public class _Generator {
public static void main(String[] args) {
// 获取数据源
DataSource ds1 = getDataSource1();
DataSource ds2 = getDataSource2();
System.out.println("Start generate...\n");
// 默认数据源
SolonGenerator generator = new SolonGenerator(ds1, "cn.hg.solon.plugin.activerecord.demo.common");
// 排除表
generator.addBlacklist("blog2");
// 指定自定义Model基类
generator.setBaseModelClassName(BaseModel.class.getName());
// 生成
generator.generate();
// ds2数据源
SolonGenerator generator2 = new SolonGenerator(ds2, "cn.hg.solon.plugin.activerecord.demo.common");
// 排除表
generator2.addBlacklist("blog");
// 非默认数据一定要指定数据源Bean名称
generator2.setDataSourceBeanName("db2");
// 指定自定义Model基类
generator2.setBaseModelClassName(BaseModel.class.getName());
// 生成
generator2.generate();
System.out.println("\nFinished generate.");
}
private static DataSource getDataSource1() {
HikariCpPlugin plugin = new HikariCpPlugin("jdbc:mysql://localhost/jfinal_demo?useSSL=false", "root", "123456");
plugin.start();
return plugin.getDataSource();
}
private static DataSource getDataSource2() {
HikariCpPlugin plugin = new HikariCpPlugin("jdbc:mysql://localhost/jfinal_demo?useSSL=false", "root", "123456");
plugin.start();
return plugin.getDataSource();
}
}
```
2. 代码结构
![image-20220922110620463](doc/images/image-20220826105434208.png)
![image-20220922110848784](doc/images/image-20220826110214601.png)
3. 代码示例
- Mapper
```java
@Namespace("BlogMapper")
public interface BlogMapper {
......
// isUpdate = true 表示接口为非查询接口
@Sql(value = "{DELETE FROM `blog` WHERE `id` = #para(id)}", isUpdate = true)
long deleteById(Object id);
......
@Sql("{ SELECT * FROM `blog` }")
List<Blog> findAll();
@Sql("findByModel")
List<Blog> findBy(Blog model);
@Sql("findByMap")
List<Blog> findBy(Map<String, ?> map);
@Sql("findByModel")
List<Blog> findBy(Blog model, String orderColumn, String orderDirection);
@Sql("findByMap")
List<Blog> findBy(Map<String, ?> map, String orderColumn, String orderDirection);
......
}
@Namespace("Blog2Mapper")
public interface Blog2Mapper {
......
// isUpdate = true 表示接口为非查询接口
@Sql(value = "{DELETE FROM `blog2` WHERE `id` = #para(id)}", isUpdate = true)
long deleteById(Object id);
......
@Sql("{ SELECT * FROM `blog2` }")
List<Blog2> findAll();
@Sql("findByModel")
List<Blog2> findBy(Blog2 model);
@Sql("findByMap")
List<Blog2> findBy(Map<String, ?> map);
@Sql("findByModel")
List<Blog2> findBy(Blog2 model, String orderColumn, String orderDirection);
@Sql("findByMap")
List<Blog2> findBy(Map<String, ?> map, String orderColumn, String orderDirection);
......
}
```
- BaseModel
```java
public abstract class BaseBlog<M extends BaseBlog<M>> extends Model<M> implements IBean {
......
}
public abstract class BaseBlog2<M extends BaseBlog2<M>> extends Model<M> implements IBean {
......
}
```
- Model
```java
@Db(DbKit.MAIN_CONFIG_NAME)
@Table(name = "blog", primaryKey = "id")
public class Blog extends BaseBlog<Blog> {
public static final Blog DAO = new Blog().dao();
}
@Db("db2") // 生成此对象时指定了数据源名称为"db2"
@Table(name = "blog2", primaryKey = "id")
public class Blog2 extends BaseBlog2<Blog2> {
public static final Blog2 DAO = new Blog2().dao();
}
```
- SQL
```sql
BlogMapper.sql 文件
#namespace("BlogMapper")
#sql("countBy") ### 统计满足条件的记录数
SELECT COUNT(*) FROM `blog` #@whereFor()
#end
#sql("de
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Java 新的生态,更小、更快、更简单! (890个子文件)
fifuNine.drl 0B
.gitignore 305B
introspectionQuery.gqls 2KB
book.gqls 468B
product.gqls 391B
course.gqls 203B
queryBookById.gqls 159B
queryInstructorOneToOne.gqls 142B
queryInstructorOneToMany.gqls 140B
mutationRemoveProduct.gqls 133B
subscriptionProduct.gqls 116B
mutationAddProduct.gqls 114B
base.gqls 56B
index.html 15KB
easypoi-preview.html 2KB
index.html 1KB
com.fujieid.jap.ids.service.IdsClientDetailService 62B
ConcurrentReferenceHashMap.java 37KB
ReflectionUtils.java 36KB
ObjectUtils.java 33KB
Assert.java 31KB
DataChangeRecorderInnerInterceptor.java 31KB
SqlToyLazyDaoImpl.java 29KB
TenantLineInnerInterceptorTest.java 22KB
Db.java 22KB
BeanSearcherProperties.java 22KB
BeanSearcherConfiguration.java 19KB
PaginationInnerInterceptor.java 19KB
DemoWithDockerTests1.java 18KB
SqlToyContextBuilder.java 18KB
DemoSimpleTests.java 18KB
LightDaoImpl.java 18KB
BaseMultiTableInnerInterceptor.java 17KB
IService.java 16KB
SqlToyContextProperties.java 15KB
IllegalSQLInnerInterceptor.java 15KB
ProtoMsg.java 15KB
AbstractChainWrapper.java 14KB
ForestBeanBuilder.java 14KB
TestConsumers.java 13KB
SimpleQuery.java 13KB
MybatisAdapterDefault.java 12KB
OptimisticLockerInnerInterceptor.java 12KB
GraphqlWebsocket.java 11KB
TenantLineInnerInterceptor.java 11KB
ForestConfigurationProperties.java 11KB
ServiceImpl.java 10KB
SqlHelper.java 10KB
ConsumerAggregator.java 10KB
PulsarFluxConsumer.java 10KB
BatchMappingDataFetcher.java 9KB
KieTemplate.java 9KB
IdsClientDetailServiceImpl.java 9KB
SaTokenDaoRedissonJackson.java 9KB
Model.java 8KB
DefaultBatchLoaderRegistry.java 8KB
SaTokenDaoOfRedissonJackson.java 8KB
MybatisEnumTypeHandlerTest.java 8KB
PulsarProperties.java 8KB
SqlToyCRUDServiceForSolon.java 8KB
DubboReferenceAnno.java 8KB
Page.java 7KB
SqlRunner.java 7KB
DubboServiceAnno.java 7KB
DefaultExecutionGraphQlResponse.java 7KB
MapperMethodInvoker.java 7KB
ServiceAnno.java 7KB
ServiceAnno.java 7KB
ReferenceAnno.java 7KB
ReferenceAnno.java 7KB
SaTokenInterceptor.java 7KB
GraphQlWebSocketMessage.java 6KB
AjCaptchaProperties.java 6KB
AbstractGraphQlResponse.java 6KB
MybatisPlusInterceptor.java 6KB
JdbcUtils.java 6KB
MybatisRuntimeNativeRegistrar.java 6KB
PulsarConsumer.java 6KB
DdlHelper.java 6KB
JpaTranSessionFactory.java 6KB
BlockAttackInnerInterceptor.java 6KB
JobManager.java 6KB
SaTokenFilter.java 6KB
DataPermissionInterceptor.java 6KB
IEasyPoiWpsConvertService.java 6KB
XPluginImp.java 6KB
InsertBatchSomeColumn.java 6KB
ArgumentMethodArgumentResolver.java 6KB
PowerJobProperties.java 6KB
DialectModel.java 5KB
MapperContextParser.java 5KB
BatchLoaderRegistry.java 5KB
IEasyPoiWpsViewService.java 5KB
EasyPoiWpsUtil.java 5KB
ReactorContextManager.java 5KB
DefaultSchemaResourceGraphQlSourceBuilder.java 5KB
MutationAndSubscriptionTest.java 5KB
XPluginImp.java 5KB
UrlBuildService.java 5KB
PaginationInnerInterceptorTest.java 5KB
共 890 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6818
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功