DartVM服务器开发(第十五天)--Jaguar_ORM一对一
2018-09-04 本文已影响42人
rhyme_lph
上一篇文章中讲解了如何使用数据库中的增删查改,今天,我们来学习一下如何一对一,学会了一对一之后,就会发现,一对多跟多对多都不在话下,现在我们开始吧!
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
可以看到,我们成功的运行了脚本命令,并且没有任何的异常
3.修改Bean
这里介绍一下,脚本命令只是简单的为我们生成了脚本,我们还需要去修改bean
,跟xxx.jorm.dart
我们可以看到运行脚本后,UserBean
跟AvatarBean
有红色的下划线,我们可以改成这个样子
@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.dart
中AvatarBean
创建表的方法,然后重写就可以了
@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
已经成功添加了一条数据,在看看
_avatar
表头像表.png
ok,我们是成功的插入了两条数据的!一对一就到这里了,还有一对多,多对多也是同样的操作,大家应该get到吧!好了,今天的内容就到这里了,明天见!
如果想继续学习DartVM服务器开发,请关注我,学习更多骚操作!