网站首页 > 博客文章 正文
简易ORM框架
- 此框架主要为在使用Spring框架的以下用户考虑:
- 喜欢JPA注解,但讨厌hibernate和spring data jpa效率低下的.同时又不想失去sql灵活性的.
- 喜欢Mybatis的直接,但对mybatis的易用性和可维护性提出质疑的.
- 此框架在hibernate和mybatis做了折中,并且执行性能超过两者.
- 此框架主要基于ef-orm框架理念
- 使用jpa注解,但不完全实现jpa规范,单表增,删,改比较方便,同时对级联也做了支持,但不实现延迟加载功能,必须手动调用,才能加载级联对象(此处主要降低jpa实现复杂度).
- jpa支持注解如下: @Column,@Table,@Entity,@Id,@OneToOne,@OneToMany,@ManyToMany,@ManyToOne.@JoinColumn,@JoinTable,@Version
- 使用了代码增强技术,增强了实体类.需要继承DBObject类.并使用配置实现代码增强.继承DBObject类的java bean 只要调用set方法即可精确修改数据库对象.
- 支持级联配置
- 支持Map格式的数据对象返回.
- 支持使用模板写sql,主要使用jetbrick-template实现.
- 支持对象操作的乐观锁功能.
- 支持实体对象生成功能
- 不支持一级,二级缓存(Spring cache已经足够好)
- 整合支持querydsl,jooq用法,提高系统可维护性.能降低80%~90%的sql硬编码.极大提高系统的可维护性.
- 支持mybatis的resultMap,但无需编写xml,只需使用@Column注解和数据库字段映射即可,对于一条sql语句对应一个主类带子类对象,使用@OneToOne注解标记即可实现主类、子类的组装.
- 此框架为整合性框架,感谢ef-orm,jfinal,BeetlSQL,Nutz,mybatis,jetbrick-orm
快速预览
- spring 环境下
@Bean
public OrmConfig getOrmConfig(DaoTemplate dt) {
OrmConfig config = new OrmConfig();
config.setPackagesToScan(StringUtils.split("db.domain",","));
config.setDbClient(dt);
config.setUseTail(true);
config.setFastBeanMethod(false);
config.init();
return config;
}
@Bean(name="daoTemplate")
public DaoTemplate geDaoTemplate(DataSource ds) {
DaoTemplate dt = new DaoTemplate(ds);
return dt;
}
- spring boot直接配置 application.properties中配置
#jpa实体类所在的包
smallorm.packages=db.domain
...
spring boot中的main方法启动中加入增强的代码
public static void main(String[] args) throws Exception {
//jpa实体类所在的包
new EntityEnhancerJavassist().enhance("db.domain");
SpringApplication.run(SefApplication.class, args);
}
引入spring-boot-jdbc-starter
3.编写jpa实体类
package db.domain;
import sf.database.DBCascadeField;
import sf.database.DBField;
import sf.database.annotations.Comment;
import sf.database.annotations.FetchDBField;
import sf.database.annotations.Type;
import sf.database.jdbc.extension.ObjectJsonMapping;
import sf.database.DBObject;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.*;
@Entity
@Table(name = "wp_users")
@Comment("用户表")
public class User extends DBObject {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "login_name", length = 60, nullable = false)
private String loginName;// 登陆名
@Column(length = 64)
private String password;
@Column(length = 50)
private String nicename;
@Column(length = 100)
private String email;
@Column(length = 100)
private String url;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Date registered;
/**
* 激活码
*/
@Column(name = "activation_key", length = 60, nullable = false)
private String activationKey;
@Column
private int status;
@Column(name = "display_name", length = 250)
@Enumerated(EnumType.STRING)
private Names displayName;
@Column
private Boolean spam;
@Column
private boolean deleted;
@Column(precision = 10,scale = 5)
private BigDecimal weight;
@Transient
private boolean lock;
@Column(name = "maps",length = 1500)
@Type(ObjectJsonMapping.class)
private Map<String,String> maps;
@ManyToMany
@Transient
@OrderBy("id asc,role desc")
@JoinTable(name = "user_role", joinColumns = {
@JoinColumn(name = "user_id", referencedColumnName = "id")}, inverseJoinColumns = {
@JoinColumn(name = "role_id", referencedColumnName = "id")})
private List<Role> roles;
@OrderBy
@Transient
@FetchDBField({"id","key"})
@OneToMany(targetEntity = UserMeta.class)
@JoinColumn(name = "id", referencedColumnName = "userId")
private Set<UserMeta> userMetaSet = new LinkedHashSet<UserMeta>();
public enum Names {
zhangshang, lisi
}
/**
* 普通字段
*/
public enum Field implements DBField {
id, loginName, password, nicename, email, url, registered, activationKey, status, displayName,maps, spam, deleted,weight;
}
/**
* 级联字段
*/
public enum CascadeField implements DBCascadeField {
roles, userMetaSet
}
public User() {
}
... get set方法
}
在dao中引入
@Resource
private DaoTemplate dt;
以daoTemplate操作sql方法.
- 插入对象
User user = dt.selectOne(new User());
User u = new User();
u.setLoginName(UUID.randomUUID().toString());
u.setDeleted(false);
u.setCreated(new Date());
u.setActivationKey("23k4j2k3j4i234j23j4");
//插入对象,生成的语句为:insert into wp_users(activation_key,created,deleted,login_name) values(?,?,?,?)
int i = dt.insert(u);
- 执行原生sql
String sql = "select * from wp_users";
List<User> list = dt.selectList(User.class, sql);
- 执行模板sql
#tag loadSql("queryUserByName")
#[[
select * from wp_users
#tag where()
#if(id)
and id=${p(id)}
#end
#if(username)
and login_name=${p(username)}
#end
#if(nicename)
and nicename=${p(nicename)}
#end
#end
]]#
#end
java代码
Map<String, Object> query = new HashMap<>();
query.put("id", 1);
List<User> list2 = dt.selectListTemplate(User.class, "queryUserByName", query);
- 执行Querydsl
SQLRelationalPath<User> q = QueryDSLTables.relationalPathBase(User.class);
SQLQuery<User> query = new SQLQuery<User>();
query.select(q).from(q).where(q.string(User.Field.displayName).isNotNull())
.orderBy(new OrderSpecifier<>(Order.ASC, q.column(User.Field.id)));
Page<User> page = dt.sqlQueryPage(query, 2, 3);
- 执行jooq代码
JooqTable<?> quser = JooqTables.getTable(User.class);
JooqTable<?> qrole = JooqTables.getTable(Role.class);
Select<?> query = DSL.select(quser.fields()).from(quser, qrole).where(quser.column(User.Field.id).eq(1));
User u = dt.jooqSelectOne(query);
更新内容:
orms是一个全功能orm工具, 同时具有Hibernate与Mybatis的优点。该框架主要适合使用Spring,Spring boot用户
- 开发效率全面拥抱JPA注解,并通过对注解的扩展和JPA实体类的增强,及其方便的完成单表增删改查功能.数据模型支持Pojo,Map/List支持自动建表功能.创建完成JPA实体类,运行即可创建数据库表支持级联功能,但不实现延迟加载功能(通过手动调用,才能加载级联对象,此处主要降低jpa级联实现的复杂度).支持Map格式的数据对象返回(由于不区分字段大小写,要求数据库设计对字段大小写不敏感).支持乐观锁功能.支持SQL查询转换为实体对象功能支持类似mybatis的resultMap,但无需编写xml映射,实体类只需使用@Column注解和数据库字段对应即可,对于sql语句返回值映射到对象有子类的情况,使用@SmallResults注解标记即可实现主类、子类的组装.支持实体类中的类似mybatis Example查询集成支持querydsl,jooq用法,能降低80%~90%的sql硬编码.极大提高系统的可维护性.SQL 模板基于enjoy实现,更容易写和调试,以及扩展可以针对单个表(或者视图)代码生成pojo类
- 维护性使用类型安全的查询,当修改数据库表字段时,可以通过编译提示方便修改类字段.避免mybatis修改数据库字段带来的调试风险.无缓存功能,避免hibernate,mybatis带来的缓存一致性问题.SQL 以enjoy模板管理,支持自定义文件位置,方便程序开发和数据库SQL调试。可以自动将sql文件映射为dao接口类
- 其他基于JPA实体类加枚举字段的理念开发而成.JPA注解支持如下: @Column,@Table,@Entity,@Id,@OneToOne,@OneToMany,@ManyToMany,@ManyToOne.@JoinColumn,@JoinTable,@Version,@MapKey,@SqlResultSetMapping,SqlResultSetMappings使用了代码增强技术,增强了实体类.能精确修改数据库对象(需要继承DBObject类.并使用插件实现代码增强.继承DBObject类的java bean 只要调用普通的set方法即可).支持主从数据库配置,和支持分库分表的中间件如sharding-jdbc和mycat性能远超Hibernate,MyBatis支持跨数据库平台,开发者所需工作减少到最小,目前跨数据库支持mysql,postgres,oracle,sqlserver,sqllite.支持脱离Spring环境独立运行.主要基于jdbc实现,极其轻量.几乎全部功能都采用单例模式实现.此为融合性orm,感谢ef-orm,jfinal,BeetlSQL,Nutz,mybatis,jetbrick-orm最低要求jdk8,兼容jdk11.源码请使用jdk8编译
sorms 1.0.10 更新内容如下:
一:功能优化
- 新增:JPA @Converter注解,方便实体类字段转换.
- 新增:@SmallResults注解:结果集描述,主要用于SQL结果集映射到对象中的子对象.
- 优化Example类支持select,from和 addCriteria添加自定义sql片段支持in传入数组或集合.支持动态表名设置
- 优化DBContext类支持动态表名支持多数据源设置支持事务关闭支持设置是否使用tail支持设置是否保留DBObject中的updateMap
- 优化模板书写page和pageTag区别:#page为函数调用,#pageTag需要使用#end标签pageIgnore和pageIgnoreTag区别:#pageIngore为函数调用,#pageIgnoreTag需要使用#end标签in标签:支持数组类型传入.
- 优化jooq和querydsl使用支持动态表名
- 文档完善使用说明相关文档描述
- 版本升级:spring boot,fastjson,javassit升级到最新.
二:bug修复
- DBClient.update(T obj)无法更新主键的问题.
- 使用enhanceASM代码增强报错的问题
- 使用javassit代码增强时,如果存在跨jar包引用会找不到依赖类的问题
欢迎使用,欢迎吐槽!
maven 依赖:
<dependency>
<groupId>com.github.atshow</groupId>
<artifactId>sorm</artifactId>
<version>1.0.10</version>
</dependency
猜你喜欢
- 2024-10-24 持久层框架JPA与Mybatis该如何选型
- 2024-10-24 hibatis--mybatis,自动生成SQL, 通用Mapper, 通用Dao
- 2024-10-24 Elasticsearch 6.0.0官方参考指南翻译
- 2024-10-24 推荐一个高效美观易用的服务器运维工具
- 2024-10-24 Java 操作之RestHighLevelClient查询详解
- 2024-10-24 如何在 Elasticsearch 上应用机器学习排序插件
- 2024-10-24 「开源资讯」Apache Solr 8.6.0 发布,Java 全文搜索服务器
- 2024-10-24 最轻量级的Kubernetes云原生日志框架Loki
- 2024-10-24 ElasticSearch学习系列 - (3) Python操作es
- 2024-10-24 全功能orm工具sorms 1.0.10 发布,合使用Spring,Spring boot用户
你 发表评论:
欢迎- 05-30springboot 集成redisson 以及分布式锁的使用
- 05-30去哪儿技术面:10亿数据如何最快速插入MySQL?
- 05-30redis介绍
- 05-30redission YYDS
- 05-30手把手教你springboot集成mybatis
- 05-30mybatis根据表逆向自动化生成代码:自动生成实体类、mapper文件
- 05-30越来越大的微信小程序
- 05-30SpringBoot之数据访问——访问SQL数据库!
- 422℃用AI Agent治理微服务的复杂性问题|QCon
- 420℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 401℃初次使用IntelliJ IDEA新建Maven项目
- 401℃Maven技术方案最全手册(mavena)
- 394℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 390℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 389℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 384℃IT全明星|IntelliJ IDEA学习笔记(四、idea中怎么创建maven项目)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)