前期工作
首先我们建立一张用户表,一张账户表,使用户表和账户表之间实现一对多的关系,用户表我们之前已经创好了是user,现在我们来创账户表,账户表的外键是用户表的id
然后我们把之前的动态sql项目拷贝一份,dao接口只留这些
把user实体类的成员名改成和表的列名一样,然后生成他们的get,set方法以及tostring
然后我们在java中建立账户实体类,同样的生成他们的get,set以及tostring方法
和user一样,Account我们也要写一个对应的接口,里面写上findAll方法
现在我们把IUserDao的xml配置拷贝一份放到相同路径,改掉名字信息
现在我们来写测试类,拷贝之前的测试类,只留下findAll方法并把相关变量名改了。
因为我们之前在全局配置里用了别名和导包,现在就不用配置可以直接运行了
一对一查询 方法一
如果现在要求在查询account的同时,得到当账户的所属用户信息。我们先想想sql语句怎么写,那是不是要根据account的uid,匹配user的id对吧
可以看到两个表的列名id重复了,我们再来取个别名
那在在这个表我们想要什么信息呢?因为两个id相同,我们只要一个就行,如果我们还需要用户名和地址,在mybatis怎么写呢?我们现在IAccountDao接口新增一个方法
因为我们的Account实体类是不带名称和地址信息,所以我们新建一个AccountUser类继承Account,这样就有了父类account的成员变量,我们再手动加上名称和地址即可,需要注意子类的tostring要多加个super.tostring调用父类的tostring
现在我们可以写xml配置了
然后我们来写测试类
run一下我们看看
我们可以看到它成功输出了account的信息和我们新加的名称和地址,中间的空格是我们tostring加的
一对一查询 方法二
上面这种方式在实际开发中是不常见的,因为你要得到其他信息还要多写个子类,很麻烦对不。现在来讲第二种方式。
从表的关系来看,用户和账户是一对多的,又因为java实体类和表是对应的,所以在实体类里要体现这个一对多关系。我们在account里加点改动,我们在account类里添加主表实体的引用,并添加get和set方法。这意味着得到account信息要同时封装它对应的user信息。
我们来到account的xml进行改动,复习一下column代表表的列名,property代表实体类的属性名,id是主键的映射,注意javatype指的是返回的类型,因为user有了别名我们就可以直接写user了。
这样用上这条sql语句,再用上刚定义的resultMap,我们就能进行user的封装
在测试类我们加上对user的输出
这样我们就很容易地实现了对user的封装