java开发之Java ORM 框架推荐( 二 )


4.1 命名约定4.1.1 类名与表名缺省情况下,ObjectiveSQL 以驼峰与下划线的形式对Java 元素与数据库元素进行互相转换,示例如下:
1)Java 定义如下:
class Member {private String memberNo;private String name;}2)数据库表定义如下:
create table members (member_no varchar not null,name varchar);

类名:Member 在数据库中对应的名称为 members,而字段名memberNo 对应的列名为 member_no,而字段名name 没有任何变化
4.1.1 关联对象1)Java 定义如下:
class Member {private String memberNo;private String name;@Relation(relationType = RelationType.HAS_MANY)private List<Order> orders;}class Order {private String no;private Long memberId;@Relation(relationType = RelationType.BELONGS_TO)private Member member;}2)数据库表定义如下:
create table members (member_no varchar not null,name varchar);create table members (member_no varchar not null,member_id int(10) not null,name varchar);通过上面的结构定义,可以看出几个关键特征:
  • 用于承载HAS_MANY 关联对象的实例变量members 是由类型转换成复数,而BELONGS_TO 与HAS_ONE则为单数
  • Order 类中存在一个外键对应的实例变量memberId,同时在表中也存在一个member_id与其对应
  • 其它规则与类与表转换的规则一致
注意:所有类名在转换为复杂时,遵循英文的规律,例如:person 对应 pepole
4.2 领域模型定义@DomainModelpublic class Member {@Size(min = 5, max = 20)private String no;@Queryableprivate String name;private Integer gender;private String mobile;@Transientprivate String otherInfo;@Relation(relationType = RelationType.HAS_MANY)private List<Order> orders;}
ObjectiveSQL 会根据上述模型定义,自动生成基础的SQL 编程相关方法和SQL 抽象模型定义
4.3 数据查询Member.countAll();Member.count("name = ?", "braisdom");Member.queryByPrimaryKey(1);Member.queryFirst("id > ?", 1);Member.query("id > ?", 1);Member.queryAll();4.4 数据更新Member.create(newMember);Member.create(newMember, true); // Create a member without validatingMember.create(Member.newInstanceFrom(memberHash));Member.create(new Member[]{newMember1, newMember2, newMember3}, false);Member.update(1L, newMember, true); // Update a member by primary key and skip validationgMember.update("name = ?", "name = ?", newName, oldName);Member.destroy(1L); // Delete a member by primary keyMember.destroy("name = ?", "Mary");4.5 事务4.5.1 基于Annotation 的事务// The method will be executed in a database thransaction@Transactionalpublic static void makeOrder(Order order, OrderLine... orderLines) throws SQLException {Order.create(order, false);OrderLine.create(orderLines, false);}4.5.2 手动事务管理// Transaction executing manuallyDatabases.executeTransactionally(((connection, sqlExecutor) -> {Member.update(1L, newMember, true);Member.update("name = ?", "name = ?", newName, oldName);return null;}));4.6 关联对象查询Member.queryAll(Member.HAS_MANY_ORDERS);Member.queryFirst("id > ?", Member.HAS_MANY_ORDERS, 1);Member.query("id > ?", Member.HAS_MANY_ORDERS, 1);Member.queryByPrimaryKey(1, Member.HAS_MANY_ORDERS);Member.queryByName("braisdom", Member.HAS_MANY_ORDERS);
上述代码中的 Member.HAS_MANY_ORDERS 属性为ObjectiveSQL 自动生成,在特殊情况下,可以基于
com.github.braisdom.objsql.relation.Relationship 自定义关联关系的构建逻辑 。
4.7 分页查询// Create a Page instance with current page and page sizePage page = Page.create(0, 10);PagedList<Member> members = Member.pagedQueryAll(page, Member.HAS_MANY_ORDERS);PagedList<Member> members = Member.pagedQuery(page, "name = ?", "braisdom");4.8 Query 接口编程Query query = Member.createQuery();query.project("name").groupBy("name").having("COUNT(*) > 0").orderBy("name DESC");List<Member> members = query.execute(Member.HAS_MANY_ORDERS);// Paged querying with querying dynamicallyPaginator paginator = Databases.getPaginator();Page page = Page.create(0, 10);PagedList<Member> pagedMembers = paginator.paginate(page, query, Member.class, Member.HAS_MANY_ORDERS);
针对SQL 中的分组和排序,需要通过Query 接口完成,同时Query 接口也可以进行分页和关联对象查询 。
4.9 ValidationObjectiveSQL Validation 内部集成了Jakarta Bean Validation
详细使用方法请参考:


推荐阅读