Mybatis 杂记:
当数据库涉及到一对一时 Mybatis 的处理方法:
- 例如在 bean 类中定义如下两个类(Hus 和 Wife 类),在国内还是一夫一妻制的吧,2333(逃。。。)
然后需要做的就是在 Hus 和 Wife 类中各自写上另一方的引用!
public class Hus {
private long id;
private String name;
private int age;
private Wife wife;
//Getter and Setter
//toString
//Constuctor
}
public class Wife {
private long id;
private String name;
private int age;
private Hus hus;
//Getter and Setter
//toString
//Constuctor
}
- 在
Mapper
类中定义如下方法:
List<Hus> findHus_Wife();
- 重点就落在了
XXXMapper.XML
文件的编写上:
有 5 种编写的方式:
1.定义 select
标签,然后写好 SQL 语句:
<select id="findHus_Wifes" resultMap="hus_wife_model">
select a.ID,a.NAME,a.AGE, b.id ids,b.NAME names,b.AGE ages
from HUS a,WIFE b
where a.id=b.hus_id
</select>
注意: Hus 表和 Wife 表具有相同的列名 id 和 name,age,如不采用别名,Mybatis 会认为这里的参数为相同,故需要立别名来保证 Mybatis 查找到 Wife 表的内容!
定义 ResultMap
:
注意:其中 hus 和 wife 经过别名处理,请在 mybatis-config.xml 中定义别名!或在 type 内些上 bean 类的全限定名尚可。
<resultMap id="hus_wife_model" type="hus">
<id property="id" column="id"></id>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="wife.id" column="ids"/>
<result property="wife.name" column="names"/>
<result property="wife.age" column="ages"/>
</resultMap>
id
、 name
与 age
都是查询到的 Hus 表中的三个数据,当设计到 Wife 表时,第一后边的 column
属性要变成上方 SQL 语句中 ids
,names
和 ages
,第二 property 属性内要写成 wife.id
形式,wife 是 Hus 类中对 Wife 引用名,即第四条属性(Mybatis 会自动去搜寻 getWife()方法,并将其以去掉 get,并取后面字段小写的方式来获取属性名),获取到对象以后,.后写的就是 Wife 内的属性,取属性方式同理。
2.select 语句同上,重写 ResultMap
:
先写一个 type 为 Wife 的 ResultMap:
<resultMap id="wife_model1" type="wife">
<id property="id" column="ids"></id>
<result property="name" column="names"/>
<result property="age" column="ages"/>
</resultMap>
再写 type 为 Hus 的 ResultMap:
<association>
标签就可以用来关联一对一的映射关系,property
属性指向引用变量 wife,ResultMap
属性内填写的是 wife 的模板,也就是先为 Hus 类中第四个属性 wife 的引用书写模板,后在定义 Hus 的模板过程中再将刚才定义的 wife 的模板通过 association
标签引入,这样就达到了一对一关联的目的!
<resultMap id="hus_model2" type="hus">
<id property="id" column="id"></id>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="wife" resultMap="wife_model1"/>
</resultMap>
3.select
语句同上,重写 ResultMap
:
<resultMap id="mod1_hus" type="hus">
<id property="id" column="id"></id>
<result property="name" column="name" />
<result property="age" column="age" />
<association property="wife" javaType="wife">
<id property="id" column="ids"/>
<result property="name" column="names" />
<result property="age" column="ages"/>
</association>
</resultMap>
这次不同的是用了同一个 ResultMap
来定义模板,在 association
标签中写入的是 wife 内的三个属性,总的来讲和 2 中使用的方法类似,相当于把两个模板合二为一!
4.select
继续不变化,再次变化 resultMap
<resultMap id="mod3_hus" type="hus">
<id property="id" column="id"></id>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<resultMap id="mod3_hus_wife" type="hus" extends="mod3_hus">
<result property="wife.id" column="ids"/>
<result property="wife.name" column="names"/>
<result property="wife.age" column="ages"/>
</resultMap>
先定义一个 hus 的 resultMap
,然后再定义一个 resultMap
继承它!extends
表示从某个模板中把属性配置继承过来,类型一致。这样 mod3_hus_wife
中就有了继承的 hus 属性和新增的 wife 属性,也达到了我们所要的效果!
5.转变思想:
- 先编写一个
select
,作用是基于 hus_id 在 wife 表查询一行记录
<select id="selectWifeByhus_id" parameterType="Long" resultType="wife">
select id,name,AGE
from WIFE
where HUS_ID=#{id}
</select>
- 然后编写一个
resultMap
,association
中column
和select
填的是上面编写的select
和他需要传入的参数值,相当于取当前的 id 属性(即 hus 的 id 属性 hus_id)说去上面定义的select
中通过 hus_Id 查询到对应的 wife 属性,然后将其填入<association>
的子标签中!
<resultMap id="mod2_hus" type="hus">
<id property="id" column="id"></id>
<result property="name" column="name"/>
<result property="age" column="age"/>
<!-- column 表示基于该属性去查询 -->
<association property="wife" column="id" select="selectWifeByhus_id">
<id property="id" column="id"></id>
<result property="name" column="name"/>
<result property="age" column="age"/>
</association>
</resultMap>
这样我们的主 select
的作用就是从 Hus 中取出对应的值就好了!
<select id="findHus_Wife3" resultMap="mod2_hus">
select id,name,age
from HUS
</select>
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于