-
OneToOne:一对一关系(Passenger— Passport)
-
OneToMany:一对多关系(Employee — Department)
-
ManyToMany:多对多关系(Student — Subject)
*** 注意:设计数据库时,表与表的主外键关系知道就行了不要写出来,但是pojo里要在加外键的id用以get、set**
MyBatis的总结:
1,,每添加一个mapper.xm文件就要遭config.xml里面注册,同时在mapper里面进行关联。
2,一对一查询时新的结果集使用 <association property=“passport” select=“com.qf.dao.PassportDao.selectPassportById” column=“pid” javaType=“passport”>====结果是一个对象用association
一对多和多对多都是用<collection property=“addresses” select=“com.qf.dao.AddressDao.selectAddressesByUid” column=“id” ofType=“address”>
3,多对多查询只有连接查询没有分布查询。====结果是一个集合用collection
一对一:
1.分步查询:先查出user在由user的pid查
`
方法一:分布查
/select * from t_users where id=?;===user(pid)
select * from t_passport where id=user.getPid();===Passport
user.setPassport(Passport);/
select * from t_users where id=#{id};
</select>
<resultMap id="resultNewMap" type="user">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="password" property="password"></result>
<result column="sex" property="sex"></result>
<result column="pid" property="pid"></result>
<association property="passport" select="com.qf.dao.PassportDao.selectPassportById" column="pid" javaType="passport">
<id column="pid" property="id"></id>
<result column="nationality" property="nationality"></result>
</association>
</resultMap>`
<!--mapper就是映射文件的根目录 namespace:命名空间,是映射的dao接口的全限路劲-->
<mapper namespace="com.qf.dao.PassportDao">
<select id="selectPassportById" parameterType="int" resultType="passport">
select * from t_passport where id=#{id}
</select>
2.连接查询:
`
SELECT
*
FROM
t_users u
LEFT JOIN t_passport p ON u.pid = p.id1
WHERE
u.id = #{id}
<result column="birthday" property="birthday"></result>
<result column="registTime" property="registTime"></result>
<!-- 因为是连接查询,一次查询得到的结果集已经有我想要的数据了,所以不需要新的查询了-->
<association property="passport" javaType="passport">
<id column="id1" property="id"></id>
<result column="nationality" property="nationality"></result>
</association>
</resultMap>`
一对多:
1.分布查询
`
/select * from t_users where id=?;===user(pid)
select * from t_passport where id=user.getPid();===Passport
user.setPassport(Passport);/
select * from t_users where id=#{id};
</select>
<resultMap id="resultNewMap" type="user">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="password" property="password"></result>
<result column="sex" property="sex"></result>
<result column="pid" property="pid"></result>
<association property="passport" select="com.qf.dao.PassportDao.selectPassportById" column="pid" javaType="passport">
<id column="pid" property="id"></id>
<result column="nationality" property="nationality"></result>
</association>
</resultMap>
`
<!--mapper就是映射文件的根目录 namespace:命名空间,是映射的dao接口的全限路劲-->
<mapper namespace="com.qf.dao.AddressDao">
<select id="selectAddressesByUid" parameterType="int" resultType="address">
select * from address where uid=#{id}
</select>
2.连接查询;
`
SELECT
*
FROM
t_users u
LEFT JOIN t_passport p ON u.pid = p.id1
WHERE
u.id = #{id}
<result column="birthday" property="birthday"></result>
<result column="registTime" property="registTime"></result>
<!-- 因为是连接查询,一次查询得到的结果集已经有我想要的数据了,所以不需要新的查询了-->
<association property="passport" javaType="passport">
<id column="id1" property="id"></id>
<result column="nationality" property="nationality"></result>
</association>
</resultMap>
`
多对多
<!-- 多对多查询:只有连接查询没有分布查询-->
<select id="selectUserByName" parameterType="String" resultMap="ManyToManyResult">
SELECT u.id,u.`name`,u.`password`,u.sex,u.birthday,u.registTime,u.pid,r.id rid,r.rname from t_users u
LEFT JOIN user_role ur
on u.id=ur.uid
LEFT JOIN role r
on ur.rid=r.id
where u.name=#{name}
</select>
<resultMap id="ManyToManyResult" type="user">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="password" property="password"></result>
<result column="sex" property="sex"></result>
<result column="pid" property="pid"></result>
<collection property="roles" ofType="role">
<id column="rid" property="id"></id>
<result column="rname" property="rname"></result>
</collection>
</resultMap>
懒加载:只和分布查询有关系
首先:mabatis.config.xml配置文件中增加一个setting;
然后写分布查询语句;
最后写测试方法。
lazyLoadingEnabled:懒加载:当用户用不到第二步sql语句相关的属性值就不会执行第二条语句,当用户用到了第二条sql语句有关的属性时,才会去执行第二条sql。
aggressiveLazyLoading:积极的懒加载;当用户暂时没用到第二条sql语句相关的属性值时,那么此时不会走运行第二条语句,只有在不忙的时候,他才会执行。
<!-- 懒加载的配置-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>