mapper映射文件***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接口的动态代理方式开发(主流的Dao开发方式),开发规范是:-->
<!--1. 映射文件中配置的namespace必须是接口的类的全限定名-->
<!--2. 映射文件中配置的id必须和接口的方法名一致-->
<!--3. 映射文件中配置的parameterType必须和接口的方法参数类型一致-->
<!--4. 映射文件中配置的resultType必须和接口的方法返回值类型一致-->
<mapper namespace="com.mybatis.dao.UserDao">
    <!-- 一般情况下,一个数据库表有一个对应的Mapper.xml映射 -->
    <!-- id在编写的时候和数据库表名有关系 -->
<!-- ////////////////////////////////- -分割线- -////////////////////////////////////////// -->
    <!-- 根据id查询用户 -->
    <!-- select:用户查询操作,标签内部配置的是sql语句 -->
    <!-- id:statement的id,或者叫做sql的id -->
    <!-- parameterType:参数的数据类型 -->
    <!-- 参数的参数类型应该是全路径类型java.lang.Integer,但是mybatis提供了全路径的简写方式 -->
    <!-- resultType:设置返回值的数据类型(类型的全路径) -->
    <!-- #{id}:相当于操作数据库的?占位符,传输单个简单类型值,{}里面是任意值,但是不能空着不写 -->
    <select id="queryUserById" parameterType="int" resultType="com.crud.pojo.User">
      SELECT * FROM USER where id = #{id}
    </select>


    <!-- 根据用户名模糊查询出多个用户数据,方法一 -->
    <!-- 返回的结果是List集合,ResultType里面应该配置集合中的元素 -->
    <!-- 日志的输出内容 -->
    <!--Preparing: SELECT * FROM `user` WHERE username LIKE ?-->
    <!--Parameters: %丽%(String)-->
    <select id="queryUserByName" parameterType="string" resultType="com.crud.pojo.User">
      SELECT * FROM USER WHERE username LIKE #{username}
    </select>

    <!-- 根据用户名模糊好擦U型你出多个用户数据,方法二 -->
    <!-- #{username} == ${value} -->
    <!-- ${value}:就是sql语句的拼接,传输单个简单类型值,只能是value这个字符串 -->
    <select id="queryUserByName2" parameterType="string" resultType="com.crud.pojo.User">
        SELECT * FROM USER WHERE username LIKE '%${value}%'
    </select>

    <!-- 保存用户数据 -->
    <!-- parameterType:参数类型,如果是简单数据类型,可以简写,如果是自定义对象,写全限定路径 -->
    <!-- 如果参数类型不是简单数据类型,,#{}里面的值不能乱写,应该和pojo的属性名对应 -->
    <!-- mybatis根据pojo的属性名把属性值进行注入 -->
    <insert id="saveUser" parameterType="com.crud.pojo.User">
        -- 需要用户保存成功后,返回自增主键
        -- 使用selectKey:里面需要填写查询语句:select last_insert_id(); 也就是查询最后一个插入的id
        -- keyProperty:pojo的哪个属性是主键
        -- keyColumn:数据库查询结果的哪个属性是主键
        -- resultType:返回主键的数据类型
        -- order:查询主键应该在插入sql之前执行还是之后执行,AFTER:之后,BEFORE:之前
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            SELECT last_insert_id()
        </selectKey>
        INSERT INTO USER (
        username,
        birthday,
        sex,
        address
        )
        values(
        #{username},
        #{birthday},
        #{sex},
        #{address}
        )
    </insert>


    <!-- 更新用户数据 -->
    <!-- parameterType:请求参数类型 -->
    <update id="updateUser" parameterType="com.crud.pojo.User">
        UPDATE `user` SET username=#{username} WHERE id = #{id}
    </update>

    <!-- 根据id删除用户 -->
    <delete id="deleteUserbyId" parameterType="int">
        DELETE FROM user WHERE id = '${value}'
        -- DELETE FROM user WHERE id = #{id}
    </delete>
    <!-- 查询所有数据,desc查询不到 -->
    <!-- 如果pojo的属性名,和数据库查询的结果的列名不一致,数据库就不能成功映射到pojo的数据中 -->
    <!-- 原来的开发方式,就是使用resultType的开发方式,把查询结果的值通过名字注入进来,pojo的属性名和列名要保持一致 -->
    <!-- 如果属性名和列名不一致,只能使用resultMap -->
    <select id="queryUserTypeAll" resultType="usertype">
        SELECT * FROM usertype
    </select>


    <!-- 配置resultMap -->
    <!-- id:就是resultMap的名字,通过id进行使用 -->
    <!-- type:这里虽然是使用的resultMap,但是最终数据还是要映射到pojo中,所以type就是返回的pojo类型 -->
    <!-- autoMapping:如果数据库的列名和pojo的属性名一致就实现自动映射 -->
    <resultMap id="userTypeResultMap" type="usertype" autoMapping="true">
        <!-- id:配置主键,必须设置 -->
        <!-- property:配置pojo的哪个属性是主键 -->
        <!-- column:配置数据库的哪一列是主键 -->
        <!-- result:配置主键外的其他属性 -->
        <id property="t_id" column="t_id"/>
        <result property="desc" column="t_explain"/>
    </resultMap>

    <!-- 查询所有数据,解决desc不能查询数据的问题 -->
    <!-- 使用resultMap -->
    <select id="queryUserTypeAllResultMap" resultMap="userTypeResultMap">
      SELECT * FROM usertype
    </select>

    <!-- 根据用户名和性别查询用户 -->
    <!-- 如果sex没有,sql语句会执行sex=null的查询,就造成查询结果不符合业务需求,业务是如果sex=null就不查询sex-->
    <!-- 需要使用动态sql解决这个问题 -->
    <!-- if标签:动态sql判断,可以在test里面填写判断条件,mybatis会根据判断的结果,决定是否在sql中显示if标签内的sql代码 -->
    <!-- where标签:1:自动添加where关键词2:自动去掉where后面的第一个and关键词 -->
    <select id="queryUserByUsernameAndSex" parameterType="user" resultType="user">
        SELECT <include refid="fields"/> FROM user
        <where>
            <if test="sex != '' and sex != null">
                AND sex = #{sex}
            </if>
            <if test="username != null and username != ''">
                AND username LIKE #{username}
            </if>
        </where>
    </select>

    <!-- 如果多个功能的sql语句,有一段sql是相同的,最好把sql片段提取出来,只有一个地方编写管理,降低维护成本 -->
    <!-- 使用sql片段,其实就是sql标签,使用sql标签可以提高代码的复用性 -->
    <!-- id:sql片段的名字,哪里需要哪里使用,就在哪里引用id -->
    <sql id="fields">
        id,username,birthday,sex,address
    </sql>

    <select id="queryUserByQueryVo" parameterType="queryvo" resultType="user">
        SELECT <include refid="fields"/> FROM USER
        <where>
            -- 目标:拼接sql片段,id in (1,3,5,6)
            -- collection:就是存放参数的集合,填写pojo的参数名
            -- item:就是遍历集合的变量,用来存放当前遍历的是哪个值,相当于for(User user : list)中到的user,item的值是任意的
            -- open:sql片段的开始的部分,不包括集合的值
            -- close:sql片段结束的部分
            -- separator:遍历的多个值中间用什么进行隔离
            -- index:步增值
            <foreach collection="ids" item="item" open="id in (" close=")" separator="," index="1">
                #{item}
            </foreach>
        </where>
    </select>

    <!-- 一对一查询,查询账户和对应的用户数据,方法一 -->
    <select id="qeuryAccountUserAll" resultType="accountuser">
        SELECT a.*, u.username, u.address FROM account a LEFT JOIN user u ON a.uid = u.id
    </select>

    <!--配置一对一查询方案二的ResultMap-->
    <!--type就是最终需要映射的pojo,返回值就是这个pojo-->
    <!--第一个层级resultMap下的直接子元素是配置的返回结果account的pojo数据-->
    <!--autoMapping:配置自动映射,如果名字一样,就能把值映射成功-->
    <resultMap id="accountResultMap" type="account" autoMapping="true">
        <!--配置的Account的主键-->
        <id property="id" column="id"/>

        <result property="uid" column="uid"/>
        <result property="money" column="money"/>

        <!--association:用于配置一对一关联查询的,property就是返回结果account的pojo对应的哪一个属性-->
        <!--javaType:就是这个属性的类型,必须写全限定名,也可以使用别名-->
        <association property="user" javaType="user" autoMapping="true">
            <!--在这里面配置的是user这个pojo的相关数据-->
            <!--配置的User的主键-->
            <!--property就是pojo的属性名,column查询数据库结果的列-->
            <id property="id" column="uid"/>

            <!--配置的User除主键以外的属性-->
            <result property="username" column="username"/>
            <result property="address" column="address"/>
        </association>
    </resultMap>

    <!--一对一查询,查询账号和对应的用户数据,方案二(使用ResultMap)-->
    <select id="queryAccountAll" resultMap="accountResultMap">
        SELECT a.*,u.username,u.id,u.address FROM account a LEFT JOIN `user` u ON a.UID=u.id
    </select>
    
    <!-- 配置ResultMap -->
    <resultMap id="resultMap" type="user" autoMapping="true">
        <id property="id" column="id"/>

        <!-- 配置一对多的管理查询 -->
        <!-- javaType:属性的类型,这里使用的是list集合,可以省略该配置 -->
        <!-- ofType:就是集合里面的元素 -->
        <collection property="accounts" javaType="list" ofType="Account" autoMapping="true">
            <id property="id" column="aid"/>
        </collection>
    </resultMap>

    <!--查询所有的用户数据,使用一对多的方式,查询该用户的所有账号信息-->
    <select id="queryUserAll" resultMap="resultMap">
        SELECT a.*,u.username,u.address FROM account a LEFT JOIN `user` u ON a.UID=u.id
    </select>

    <!-- <cache/> 表示在这个映射文件的范围开启二级缓存 -->
    <!-- 添加这个标签后,在需要使用二级缓存的地方添加useCache="true"这个配置 -->
    <cache/>
    <!-- 根据id查询用户数据 -->
    <!-- 这里是给账户延时加载用户使用的 -->
    <!-- 账户在延时加载的时候,账户会把用户的id也就是uid传过来 -->
    <!-- 这里就可以通过uid查询到所对应的用户 -->
    <select id="queryUserById" parameterType="int" resultType="user" useCache="true">
        SELECT * FROM user where id = #{id}
    </select>

    <!-- 配置resultMap -->
    <resultMap id="map" type="user" autoMapping="true">
        <id property="id" column="id"/>

        <result property="username" column="username"/>
        <result property="birthday" column="birthday"/>
        <result property="sex" column="sex"/>
        <result property="address" column="address"/>

        <collection property="accounts"
                    ofType="account"
                    column="id"
                    select="com.mybatis_4_2.mapper.AccountMapper.queryAccountById">
        </collection>
    </resultMap>
    <!-- 查询所有用户数据,使用延时加载获取账户数据 -->
    <select id="queryUserAll" resultMap="map">
        SELECT * FROM user
    </select>
</mapper>
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐