Mybatis框架 (详细介绍~)

本文详细介绍了Mybatis框架的配置结构,包括顶层配置如属性、设置、类型别名和环境配置,以及核心对象SqlSessionFactory、SqlSessionFactoryBuilder和SqlSession的使用。重点讲解了SQL映射文件、resultMap的使用,参数处理(注解、对象、Map和List),以及动态SQL标签如if、where、foreach和trim的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Mybatis中文网🧁

Mybatis概述🍭

 配置文档的顶层结构:

属性(properties)

设置(settings)

类型别名(typeAliases)

环境配置(environments)

映射器(mappers)

Mybatis的核心对象🧁

SqlSessionFactory

SqlSessionFactoryBuilder

SqlSession

SQL映射文件🧁

resultMap (结果映射)

参数

1、注解@Param

2、对象(实体类)

3、Map

4、List

动态 SQL

常用标签

if标签

where标签

foreach标签

set标签

trim标签


Mybatis中文网🧁

Mybatis中文网icon-default.png?t=N7T8https://mybatis.net.cn/

Mybatis概述🍭

        Mybatis框架是一个持久化层的、半自动化的ORM

  1. 持久化:程序数据在瞬时状态和持久状态转换的过程
  2.  ORM :对象关系映射(Object-Relational Mapper)

 配置文档的顶层结构:

  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事物管理器)
        • dataSource(数据源)
    • databaseldProvider(数据库厂商标识)
    • mapper(映射器)        

属性(properties)

<!--引入包含数据库连接参数的database.properties文件-->
<properties resource="database.properties"/>

设置(settings)

         这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

设置名描述有效值默认值
cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。
true | false
true
autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。NONE, PARTIAL, FULLPARTIAL
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未设置
<settings>
    <!--使用Log4j作为MyBatis框架的日志实现-->
    <setting name="logImpl" value="LOG4J"/>
    <!--开启自动映射-->
    <setting name="autoMappingBehavior" value="FULL"/>
</settings>

类型别名(typeAliases)

        类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

<settings>
    <!--使用Log4j作为MyBatis框架的日志实现-->
    <setting name="logImpl" value="LOG4J"/>
    <setting name="autoMappingBehavior" value="FULL"/>
</settings>

环境配置(environments)

        MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。

注:不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

        所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。

<environments default="development">
    <environment id="development">
        <!--配置事务管理器,采用JDBC事物,由应用自行管理事物-->
        <transactionManager type="JDBC"></transactionManager>
        <!--配置数据源,POOLED:MyBatis提供的数据源,JNDI:JNDI数据源-->
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"></property>
            <property name="url" value="${url}"></property>
            <property name="username" value="${username}"></property>
            <property name="password" value="${password}"></property>
        </dataSource>
    </environment>
</environments>

映射器(mappers)

         MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 

<mappers>
    <mapper resource="mapper/SysUserMapper.xml"/>
</mappers>

Mybatis的核心对象🧁

SqlSessionFactory

    作用域:全局                生命周期:与应用的生命周期相同

SqlSessionFactoryBuilder

     作用域:方法块                生命周期:方法执行完

SqlSession

      作用域:一次会话                生命周期:一次会话

SQL映射文件🧁

       MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。

SQL 映射文件的顶级元素:

  • cache – 该命名空间的缓存配置。
  • cache-ref – 引用其它命名空间的缓存配置。
  • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  • sql – 可被其它语句引用的可重用语句块。
  • insert – 映射插入语句。
  • update – 映射更新语句。
  • delete – 映射删除语句。
  • select – 映射查询语句。

resultMap (结果映射)

           用于将查询结果映射到Java对象或者其他数据结构中。(一般用于多张表)

resultMap元素的属性

  • id:resultMap的唯一标识
  • type:映射的结果类型

resultMap元素的子元素

  • id:指定和数据表主键字段对应的标识属性 设置此项可提高MyBatis性能
  • result:指定结果集字段和实体类属性的映射关系
  • association:映射“多对一”或“一对一”关系
  • collection:映射“一对多”关系
<resultMap id="userSysRole" type="SysUser">
    <!--主键的映射关系 column:列名(数据库列名) property:属性名(与实体类类名一致)-->
    <id property="id" column="id"></id>
    <result property="realName" column="realName"></result>
    <association property="sysRole" javaType="SysRole">
        <id property="id" column="rid"></id>
        <result property="roleName" column="roleName"></result>
    </association>
</resultMap>
<select id="getUserListByRoleId" parameterType="java.lang.Integer" resultMap="userSysRole">
    select u.*,r.id as rid,r.roleName from t_sysuser u,t_sysrole r
        where u.roleId=#{roleId} and u.roleId = r.id
</select>

参数

1、注解@Param

         使用 @param注解 为参数命名   (Mapper接口

/**
* 根据ID查询用户信息
* @param id
* @return
*/
User searchById(@Param("id") Integer id);

       Mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.SysUserDemoMapper">
    <sql id="baseColumn">
        u.id,u.account,u.realName,u.roleId,r.roleName,u.sex,(YEAR(NOW())-YEAR(u.birthday)) age,u.phone
    </sql>
    <select id="searchById" resultType="User">
        select
            <include refid="baseColumn"></include>
        from t_sysuser u,t_sysrole r
        where u.roleId=r.id
        and u.id=#{id}
    </select>
</mapper>

注:如果入参的列名,在实体类里面没有就需要自己指定(必须要跟@Param和#{属性}一样)

2、对象(实体类)

<insert id="addUser" parameterType="User">
     INSERT INTO `t_sysuser`
     (`account`, `realName`, `sex`, `birthday`, `phone`, `roleId`)
     VALUES (#{account}, #{realName}, #{sex}, #{birthday},#{phone}, #{roleId});
</insert>

3、Map

<select id="searchByIdMap" resultType="User" parameterType="java.util.Map">
    select
    <include refid="baseColumn"></include>
        from t_sysuser u,t_sysrole r
        where u.roleId=r.id
        and u.id=#{id}
</select>

注:key值必须要和#{属性}相同

4、List

<insert id="batchInsert" parameterType="java.util.List">
    INSERT INTO user (id, name, age) VALUES
    <foreach collection="list" item="user" separator=",">
        (#{user.id}, #{user.name}, #{user.age})
    </foreach>
</insert>

动态 SQL

         动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

常用标签

  •   if
  •   where
  •   choose
  •   foreach
  •   set
  •   trim

if标签

       if 标签通常用于 WHERE 语句、UPDATE 语句、INSERT 语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。if可以和很多的标签一起使用!

<select id="selectByIdAndRealName" resultType="SysUser">
    SELECT * FROM t_sysuser 
    <if test="id != null"> /*如果传入进来的id不等于空*/
        where id=#{id}
    </if>
    <if test="realName != null">
        and realName like concat('%',#{realName},'%')
    </if>
</select>

where标签

        以上面的示例为例。当我们不传入id (id为空),realName给张。那么,这时的sql语句就有问题少了where,所以,接下来就需要用到我们的where标签。

<select id="selectByIdAndRealName" resultType="SysUser">
    SELECT * FROM t_sysuser
    <where>
        <if test="id != null"> /*如果传入进来的id不等于空*/
            id=#{id}
        </if>
        <if test="realName != null">
            and realName like concat('%',#{realName},'%')
        </if>
    </where>
</select>

注:where标签会自动帮我们加上where,智能处理and、or等关键字  (第一个if的and不能加上)

foreach标签

       oreach 标签主要用于构建 in 条件,只要看见in就要马上想到foreach。可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。

collection参数名称

item元素别名

open起始位置的拼接字符

separator元素之间的连接符

close末尾位置的拼接字符

index:当前元素位置下标(一般用不上)

<select id="selectByAddress" resultType="SysUser">
    SELECT * FROM t_sysuser
    where address in
    <foreach collection="addressList" item="address" open="(" separator="," close=")">
        #{address}
    </foreach>
</select>

set标签

       更新用户表数据时,除重新赋值的属性外,其他属性的值都更新为null,简化SQL语句中set子句处理,智能忽略更新语句尾部多出来的逗号。

<update id="updateById" parameterType="SysUser">
    update t_sysuser
    <set>
        <if test="account !=null">
            account=#{account},
        </if>
        <if test="realName !=null">
            realName=#{realName},
        </if>
        <if test="sex !=null">
            sex=#{sex}
        </if>
    </set>
    where id=#{id}
</update>

trim标签

        添加前后缀,智能忽略标签前后多余的and、or或逗号等字符

prefix添加前缀

suffix添加后缀

prefixOverrides忽略前缀

suffixOverrides忽略后缀

<update id="updateById" parameterType="SysUser">
    update t_sysuser
    <trim prefix="set" suffix="where id=#{id}" suffixOverrides=",">
        <if test="account !=null">
            account=#{account},
        </if>
        <if test="realName !=null">
            realName=#{realName},
        </if>
        <if test="sex !=null">
            sex=#{sex}
        </if>
    </trim>
</update>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值