MyBatis ORM映射与关联查询详解
一 ,MyBatis的ORM映射
MyBatis是一个流行的Java持久层框架,它简化了数据库操作,通过对象关系映射(ORM)和结果映射机制将数据库表与Java对象关联起来。
ORM映射的核心是将数据库表和列映射到Java对象的属性和类。
在数据库中经常出现 user_name,user_id,这种名称,但是在java当中,连接数据库时候写SQL语言,经常使用这类名称。
MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系,二者不同时无法自动ORM

1 列的别名
一可以在写SQL语句的时候写出别名,但是属性多的时候这样也不是很方便
<select id="findAll" resultType="com.hg.pojo.Role" >
select id, role_name as roleName, role_desc as roleDesc from role
</select>
2 结果映射
可以通过 <resultMap>元素在XML文件中实现
<!--
id:和select查询标签的返回值保持一致
type: 映射实体的全类名
-->
<resultMap id="findAll2ResultMap" type="com.hg.pojo.Role">
<!--
描述主键字段的映射关系:
property:实体类的属性
column:数据表字段名称
-->
<id property="id" column="id" />
<!--
描述非主键字段的映射关系:
property:实体类的属性
column:数据表字段名称
-->
<result property="roleName" column="role_name" />
<result property="roleDesc" column="role_desc" />
</resultMap>
<select id="findAll2" resultMap="findAll2ResultMap" >
select * from role
</select>
二,MyBatis的配置文件
1,properties
用于加载外部配置文件(如 .properties 或 .yml),或直接在配置中定义键值对。这些属性可在整个配置文件中通过 ${key} 引用。
eg


传递时使用 ${ } 包括起来
2,typeAliases
为Java类设置简称,简化映射文件(如Mapper XML)中的类型引用。
定义别名
查询名称

3,Mappers
注册Mapper接口或XML文件的位置,使MyBatis能够找到SQL映射定义。
<!-- ===================== MyBatis 映射器(mappers)配置 ===================== -->
<!-- 作用:指定MyBatis去哪里找SQL映射文件/接口,是MyBatis核心配置之一 -->
<!-- 方式1:指定单个XML映射文件(最常用) -->
<!-- 适用场景:仅需配置少数几个XML映射文件时 -->
<!-- 路径规则:使用resource属性,路径以classpath(类路径)为根,用/分隔包名,必须指定到具体.xml文件 -->
<!-- 注意:XML文件的namespace需与对应Mapper接口全类名一致,否则无法绑定 -->
<mapper resource="com/yunkukukukuku/Mapper/UserMapper.xml"/>
<!-- 方式2:指定单个Mapper接口(无XML文件时使用,如注解开发) -->
<!-- 适用场景:使用注解(如@Select/@Insert)替代XML写SQL时,直接配置接口类 -->
<!-- 路径规则:使用class属性,值为Mapper接口的全类名(包名+类名) -->
<!-- 注意1:若接口有对应的XML文件,XML文件需与接口同包、同名(如UserMapper接口对应UserMapper.xml) -->
<!-- 注意2:不能和XML文件混用此方式(除非满足同名同包规则),否则会找不到SQL -->
<mapper class="com.yunkukukukuku.Mapper.UserMapper"></mapper>
<!-- 方式3:批量扫描指定包下的所有Mapper(推荐批量配置时使用) -->
<!-- 适用场景:需要配置多个Mapper接口/XML文件,希望简化配置时 -->
<!-- 路径规则:使用package属性,值为Mapper接口/XML文件所在的包名(批量扫描整个包) -->
<!-- 核心要求:① Mapper接口名必须与对应的XML文件名完全一致 ② 接口和XML必须在同一个包下 -->
<!-- 优势:无需逐个配置,新增Mapper后无需修改此处配置,减少维护成本 -->
<package name="com.yunkukukukuku.Mapper"/>

三,MyBatis的关联查询
-
实体间的关系(拥有 has、属于 belong)
-
OneToOne:一对一关系(account → user)
-
OneToMany:一对多关系(user → account)
-
ManyToMany:多对多关系(user ←→ role)
-
-
什么是关联查询
当访问关系的一方时,如果需要查看与之关联的另一方数据,则必须使用表链接查询,将查询到的另一方数据,保存在本方的属性中
-
关联查询的语法
指定“一方”关系时(对象),使用
< association javaType="" >指定“多方”关系时(集合),使用
< collection ofType="" >
一对一查询
表一
表二

表二是表一的属性;
如何查询表一的所有数据
可以通过
<mapper namespace="com.yunkukukukuku.Mapper.AccountMapper">
<!-- 结果映射-->
<resultMap id="SelectoneResultMap" type="com.yunkukukukuku.pojo.Account">
<!-- Account 的主键 -->
<id property="id" column="id"/>
<result property="uid" column="uid"/>
<association property="user" javaType="com.yunkukukukuku.pojo.User">
<id property="id" column="id"/>
</association>
</resultMap>
<select id="Selectone" parameterType="int" resultMap="SelectoneResultMap" >
select a.id aid ,a.uid ,a.money ,u.* from account a,user u
where a.uid = u.id and a.id = #{id}
</select>
一对多
<resultMap id="UserparameterMap" type="com.yunkukukukuku.pojo.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<!--
一对多查询:
property="accountList":User的属性名
ofType="com.hg.pojo.Account":"accountList"泛型的全类名
别名 ofType="Account"
-->
<collection property="accounts" ofType="com.yunkukukukuku.pojo.Account">
<id property="id" column="aid"/>
<result property="uid" column="uid"/>
</collection>
</resultMap>
<!-- column="role_name" mysql的字段
property="roleName" java的属性 -->
多对多
方法一
<!-- column="role_name" mysql
property="roleName" java -->
<resultMap id="SelectManyToManyResultMap" type="com.yunkukukukuku.pojo.Role">
<id property="id" column="id"/>
<result column="role_name" property="roleName"/>
<collection property="users" ofType="com.yunkukukukuku.pojo.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</collection>
</resultMap>
<select id="SelectManyToMany" parameterType="int" resultMap="SelectManyToManyResultMap">
select * from role r
left join user_role ur on r.id = ur.rid
left join user u on u.id =ur.uid
where ur.id = #{id}
</select>
方法二


UserMapper.xml当中内容
property="accountList":User的属性名
ofType="com.hg.pojo.User":"accountList"泛型的全类名
select="com.hg.mapper.AccountMapper.findAccountByUid":要执行的sql语句
column="id":参数,注意和column保持一直
fetchType="lazy":lazy代表懒加载,eager代表饿加载

AccountMapper接口

AccountMapper.xml

text测试类

更多推荐




所有评论(0)