美文网首页Flutter中文社区DartVM服务器开发Flutter圈子
DartVM服务器开发(第十五天)--Jaguar_ORM一对一

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

作者: rhyme_lph | 来源:发表于2018-09-04 22:34 被阅读42次

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

    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服务器开发,请关注我,学习更多骚操作!

    相关文章

      网友评论

        本文标题:DartVM服务器开发(第十五天)--Jaguar_ORM一对一

        本文链接:https://www.haomeiwen.com/subject/ofinwftx.html