Mybatis学习笔记一(简介及动态sql)

Mybatis简介

MyBatis是一款优秀的基于ORM的半自动轻量级持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO为数据库中的记录。对开发人员而言,核心sql还是需要自己优化,sql和java编码分开,功能边界清晰,一个专注业务,一个专注数据。

 

架构设计

MyBatis的功能架构分为三层:

(1)API接口层: 提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

  MyBatis和数据库的交互有俩种方式:

  a.使用传统的MyBatis提供的API;

  b.使用Mapper代理的方式

(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

(3)基础支撑层: 负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是公用的东西,将他们抽取出来作为最基础的组件,为上层的数据处理层提供最基础的支撑。

 

总体流程:

(1)加载配置并初始化

触发条件:加载配置文件

配置来源于俩个地方,一个是配置文件(主配置文件conf.xml, mapper文件*.xml), 一个是Java代码中的注解,将主配置文件内容解析封装到Configuration, 将sql的配置信息加载成为一个mappedstatement对象,存储在内存之中。

(2)接收调用请求

触发条件:调用Mbatis提供的API

传入参数:为SQL的ID和传入参数对象

处理过程:将请求传递给下层的请求处理层进行处理。

(3)处理操作请求

触发条件:API接口层传递请求过来。

传入参数:为SQL的ID和传入参数对象

处理过程:

  (a)根据SQL的ID查找对应的MappedStatement对象。

  (b)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。

  (c)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。

  (d)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。

  (e)释放连接资源

(4)返回处理结果

将最终的处理结果返回。

配置文件分析

核心配置文件层级关系

数据库环境配置

 

 动态sql标签

where if 条件
<select id="findByCondition" parameterType="user" resultType="user"> 
select * from User
    <where>
        <if test="id!=0">
            and id=#{id}
        </if>
        <if test="username!=null">
            and username=#{username}
        </if>
    </where>
</select>
        
 for each

foreach标签主要有以下参数:
item :循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details,在list和数组中是其中的对象,在map中是value。
index :在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。
open :表示该语句以什么开始
close :表示该语句以什么结束
separator :表示元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。

<select id="findByIds" parameterType="list" resultType="user"> 
    select * from User
    <where>
        <foreach collection="array" open="id in(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </where>
</select>
        

 批量插入

<!--动态Sql: foreach标签, 批量插入-->
        <insert id="dynamicSqlInsertList" useGeneratedKeys="true" keyProperty="id">
            insert into users (name, age, county, date)
            values
            <foreach collection="list" item="user" separator="," >
                (#{user.name}, #{user.age}, #{user.county}, #{user.date})
            </foreach>
        </insert>

 

 choose、when、otherwise 标签
 <!--动态Sql: choose、when、otherwise 标签-->
    <select id="dynamicSql2" resultType="com.lks.domain.User">
        select * from users
        <where>
            <choose>
                <when test="name != null and name != ''">
                    AND name = #{name}
                </when>
                <when test="county != null and county != ''">
                    AND county = #{county}
                </when>
                <otherwise>
                    AND id = #{id}
                </otherwise>
            </choose>
        </where>
    </select>

 

set标签

使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,在进行表单更新的操作中,哪个字段中有值才去更新,如果某项为 null 则不进行更新,而是保持数据库原值。

<!--动态Sql: set 标签-->
    <update id="updateSet" parameterType="com.lks.domain.User">
        update users
        <set>
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="county != null and county != ''">
                county = #{county},
            </if>
        </set>
        where id = #{id}
    </update>

 

trim标签

trim 是一个格式化标签,可以完成< set > 或者是 < where > 标记的功能。主要有4个参数:
① prefix:前缀

② prefixOverrides:去掉第一个and或者是or

③ suffix:后缀

④ suffixOverrides:去掉最后一个逗号,也可以是其他的标记

<!--动态Sql: trim 标签-->
    <select id="dynamicSqlTrim" resultType="com.lks.domain.User">
        select * from users
        <trim prefix="where" suffix="order by age" prefixOverrides="and | or" suffixOverrides=",">
            <if test="name != null and name != ''">
                AND name = #{name}
            </if>
            <if test="county != null and county != ''">
                AND county = #{county}
            </if>
        </trim>
    </select>

 

posted on 2020-08-27 16:43  lvguoliang(学无止境)  阅读(243)  评论(0)    收藏  举报