DartVM服务器开发(第十五天)--Jaguar_ORM一对一

上一篇文章中讲解了如何使用数据库中的增删查改,今天,我们来学习一下如何一对一,学会了一对一之后,就会发现,一对多跟多对多都不在话下,现在我们开始吧!

1.新建需要的实体类

经过上一篇文章的学习,我们在此基础上,更改我们的User类,变成下面的形式

class User{
  @PrimaryKey()
  int id;//id号
  @Column(length: 20,isNullable: false)
  String username;//用户名
  @Column(length: 30,isNullable: false)
  String password;//密码
  @Column(isNullable: false)
  int role;
  @Column(length: 11,isNullable: true)
  String phoneNumber;//电话号码
  @Column(length: 30,isNullable: true)
  String email;//邮箱
  @HasOne(AvatarBean)
  Avatar avatar;

//表名
  static const String tableName='_user';

//用于接收json对象
  static User forMap(Map map) =>new User()
    ..username=map['username']
    ..password=map['password']
    ..role=810
    ..phoneNumber=map['phonenumber']
    ..email=map['email'].toString().replaceAll('@', '#');//格式化输入

  @override
  String toString() =>"User(id:$id,username:$username,password:$password,role:$role,phoneNumber:$phoneNumber,email:$email,avatar:${avatar.avatar},avatarPath:${avatar.avatarPath})";
}

上面的@Column中可以设置的参数为

参数

介绍

name

在数据库中的字段名,默认变量名

isNullable

是否可以为空

uniqueGroup

唯一组名

auto

自动

length

长度

HasBean绑定一个bean 下面我们来新建Avatar这个类,从意思上,该实体类为用户的头像

class Avatar{
  @PrimaryKey()
  int id;//id
  @BelongsTo(UserBean)
  int userId;//对应的用户id
  @Column(isNullable: true,length: 100)
  String avatar;//图片地址
  @Column(isNullable: true,length: 200)
  String avatarPath;//图片路径
  static const String tableName='_avatar';
  @override
  String toString() =>"Avatar(id:$id,userId:$userId,avatar:$avatar,avatarPath$avatarPath)";
}

上面的@belongsTo(Type)表示外键于bean,一般外键到 id字段,可以使用refcol字段设置

2.新建Bean

@GenBean()
class AvatarBean extends Bean<Avatar> with _AvatarBean{
  AvatarBean(Adapter adapter) : super(adapter);
  @override
  String get tableName => Avatar.tableName;
}

然后运行脚本命令pub run build_runner build

成功.png

可以看到,我们成功的运行了脚本命令,并且没有任何的异常

3.修改Bean

这里介绍一下,脚本命令只是简单的为我们生成了脚本,我们还需要去修改bean,跟xxx.jorm.dart 我们可以看到运行脚本后,UserBeanAvatarBean有红色的下划线,我们可以改成这个样子

@GenBean()
class UserBean extends Bean<User> with _UserBean{
//new
  UserBean(Adapter adapter) : _avatarBean=new AvatarBean(adapter) ,super(adapter);

  @override
  String get tableName => User.tableName;

//new
  final AvatarBean _avatarBean;
  @override
  AvatarBean get avatarBean => _avatarBean;
}

@GenBean()
class AvatarBean extends Bean<Avatar> with _AvatarBean{
  AvatarBean(Adapter adapter) : super(adapter);

  @override
  String get tableName => Avatar.tableName;

//new
  @override
  UserBean get userBean => null;
}

这里,我们可以删除掉AvatarBean下面的userBean,在源码中可以看到,该userBean只是在创建表的时候获取User这个实体类的表名字,直接改成我们需要的就可以了,但是我们也考虑到,当我们再次建立其它表时,xxx.jorm.dart文件会重新复原,所以,我们这里只需要复制xxx.jorm.dartAvatarBean创建表的方法,然后重写就可以了

@GenBean()
class AvatarBean extends Bean<Avatar> with _AvatarBean{
  AvatarBean(Adapter adapter) : super(adapter);

  @override
  String get tableName => Avatar.tableName;

  @override
  Future<void> createTable() {
    final st = Sql.create(tableName);
    st.addInt(id.name, primary: true, isNullable: false);
    st.addInt(userId.name,
//更改userBean.tableName为User.tableName
        foreignTable: User.tableName, 
        foreignCol: 'id', isNullable: false);
    st.addStr(avatar.name, length: 100, isNullable: true);
    st.addStr(avatarPath.name, length: 200, isNullable: true);
    return adapter.createTable(st);
  }
  @override
  UserBean get userBean => null;
}

4.尝试

一切准备就绪,我们添加一条请求地址,然后当请求该地址时,插入相关的数据

final PgAdapter pgAdapter =
new PgAdapter('rhymedb', username: 'postgres', password: '123456');
main() async {
  await pgAdapter.connect();
  UserBean userBean = new UserBean(pgAdapter);
  AvatarBean avatarBean = new AvatarBean(pgAdapter);
  await avatarBean.drop();
  await userBean.drop();

  await userBean.createTable();
  await avatarBean.createTable();

    new Jaguar()
    ..get('/api/test/Avatar', (ctx) async {
      UserBean bean = new UserBean(pgAdapter);

      await bean.insert(new User()
        ..id = 3
        ..role=810
        ..username = 'rhyme'
        ..password = '123456'
        ..phoneNumber = '159xxxxxxxx'
        ..email = 'rhymelph#gmail.com'
        ..avatar = (new Avatar()
          ..id = 1
          ..avatar = 'http://localhost:8080/static/admin.png'
          ..avatarPath = 'static/admin.png')
      ,cascade: true);

      return Response('Success');
    })
    ..serve(logRequests: true);

我们在浏览器上面输入地址:http://localhost:8080/api/test/Avatar 请求一下

成功.png

我们再来看看数据库

用户表.png

已经成功添加了一条数据,在看看_avatar

头像表.png

ok,我们是成功的插入了两条数据的!一对一就到这里了,还有一对多,多对多也是同样的操作,大家应该get到吧!好了,今天的内容就到这里了,明天见!

如果想继续学习DartVM服务器开发,请关注我,学习更多骚操作!

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1gbiv22grrpr2

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT杂记

关于MySQL DNS解析探究之二:unauthenticated user

把这篇没写完的文章写完,2015年的事就不留到2016了 开启DNS解析 mysql> show variables like 'skip_name_resol...

2838
来自专栏xingoo, 一个梦想做发明家的程序员

如何在Elasticsearch中安装中文分词器(IK+pinyin)

如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题——中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照...

4567
来自专栏Golang语言社区

H5本地存储详细使用教程--上

H5本地存储有两个API,一个是Web Storage,还有一个是Web SQL。不管是哪一个,都是基于JavaScript语言来使用,接下来我就教你怎么使用H...

8167
来自专栏乐沙弥的世界

Oracle 外部表

外部表只能在Oracle 9i 之后来使用。简单地说,外部表,是指不存在于数据库中的表。通过向Oracle提供描述外部表的元数据,我们

982
来自专栏battcn

一起来学SpringBoot | 第八篇:通用Mapper与分页插件的集成

在一起来学SpringBoot | 第七篇:整合Mybatis一文中,我们介绍了 Mybatis这款优秀的框架,顺便提及了民间大神开发的两款插件( 通用Mapp...

1382
来自专栏Android知识点总结

SpringBoot-07-之数据库JPA(CRUD)

1302
来自专栏Spark学习技巧

实战phoenix

一 安装部署 1, 下载 http://archive.apache.org/dist/phoenix/ 本文下载的是apache-phoenix-4.12....

39710
来自专栏Java帮帮-微信公众号-技术文章全总结

Jdbc知识点全整理,你值得拥有 ​(2)

1 DAO模式 DAO(Data Access Object)模式就是写一个类,把访问数据库的代码封装起来。DAO在数据库与业务逻辑(Service)之间。 l...

3354
来自专栏杨建荣的学习笔记

通过错误的sql来测试推理sql的解析过程(r7笔记第31天)

在学习Oracle的时候,必然会接触到sql解析的过程。这个过程大体是这样的步骤。 1.对sql的文法检查,查看是否有文法错误,比如from,select拼写错...

3434
来自专栏程序员的SOD蜜

TOP语句放到表值函数外,效率异常低下的原因分析

SQLSERVER的表值函数是SQLSERVER 2005以来的新特性,由于它使用比较方便,就像一个单独的表一样,在我们的系统中大量使用。有一个获取客户数据的S...

2129

扫码关注云+社区

领取腾讯云代金券