一 ,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测试类

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐