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 对应 pepole4.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 自动生成,在特殊情况下,可以基于4.7 分页查询
com.github.braisdom.objsql.relation.Relationship 自定义关联关系的构建逻辑 。
// 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
详细使用方法请参考:
推荐阅读
- Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架
- Java高级用法,写个代理侵入你 ?
- 七种能开运、旺财的花草
- Android开发:当前项目以Module形式引用别的项目的步骤
- Linux内核:虚拟地址到物理地址,是什么时候开始映射
- 阿里架构师整理的 Netty 学习笔记之:Java NIO 网络编程
- Javascript的New、Apply、Bind、Call知多少
- 专门针对chrome谷歌浏览器而开发的一款访问插件
- 纯前端生成设置头像 - 基于Vue3、Ts、Vite
- 冬藏是立冬还是冬至?
