• 5. Mapper XML文件详解


    1.CRUD标签

    1.1.select

    select – 书写查询sql语句

    select中的几个属性说明:
    id属性:当前名称空间下的statement的唯一标识。必须。要求id和mapper接口中的方法的名字一致。
    resultType:将结果集映射为java的对象类型。必须(和 resultMap 二选一)
    parameterType:传入参数类型。可以省略

    1.2.insert

    insert 的几个属性说明:

    id:唯一标识,随便写,在同一个命名空间下保持唯一,使用动态代理之后要求和方法名保持一致
    parameterType:参数的类型,使用动态代理之后和方法的参数类型一致
    useGeneratedKeys:开启主键回写
    keyColumn:指定数据库的主键
    keyProperty:主键对应的pojo属性名
    标签内部:具体的sql语句。

    1.3.update

    id属性:当前名称空间下的statement的唯一标识(必须属性);
    parameterType:传入的参数类型,可以省略。
    标签内部:具体的sql语句。

    1.4.delete

    delete 的几个属性说明:
    id属性:当前名称空间下的statement的唯一标识(必须属性);
    parameterType:传入的参数类型,可以省略。
    标签内部:具体的sql语句。

    2.#{}和${}

    场景:数据库有两个一模一样的表。历史表,当前表
    查询表中的信息,有时候从历史表中去查询数据,有时候需要去新的表去查询数据。
    希望使用1个方法来完成操作。

    <select id="queryUserByTableName" resultType="com.zpc.mybatis.pojo.User">
      select * from #{tableName}
    </select>
    /**
    * 根据表名查询用户信息(直接使用注解指定传入参数名称)
    *
    * @param tableName
    * @return
    */
    public List<User> queryUserByTableName(String tableName);

    测试输出:

    有问题,报语法错误:相当于执行了这样一条sql:

    select * from 'tb_user';

    显然表名多了引号。

    改正:

    <select id="queryUserByTableName" resultType="com.zpc.mybatis.pojo.User">
      select * from ${tableName}
    </select>

    注意:
    #{} 只是替换?,相当于PreparedStatement使用占位符去替换参数,可以防止sql注入。
    ${} 是进行字符串拼接,相当于sql语句中的Statement,使用字符串去拼接sql;$可以是sql中的任一部分传入到Statement中,不能防止sql注入。

    使用${} 去取出参数值信息,需要使用${value}
    #{} 只是表示占位,与参数的名字无关,如果只有一个参数,会自动对应。

    推荐:

    /**
    * 根据表名查询用户信息(直接使用注解指定传入参数名称)
    *
    * @param tableName
    * @return
    */
    public List<User> queryUserByTableName(@Param("tableName") String tableName);
    <select id="queryUserByTableName" resultType="com.zpc.mybatis.pojo.User">
        select * from ${tableName}
    </select>

    #{}多个参数时:

    /**
    * 登录(直接使用注解指定传入参数名称)
    *
    * @param userName
    * @param password
    * @return
    */
    public User login( String userName, String password);
    <select id="login" resultType="com.zpc.mybatis.pojo.User">
        select * from tb_user where user_name = #{userName} and password = #{password}
    </select>

    报错:

    org.apache.ibatis.exceptions.PersistenceException:
    ### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'userName' not found. Available parameters are [0, 1, param1, param2]
    ### Cause: org.apache.ibatis.binding.BindingException: Parameter 'userName' not found. Available parameters are [0, 1, param1, param2]

    解决方案一:

    <select id="login" resultType="com.zpc.mybatis.pojo.User">
        select * from tb_user where user_name = #{0} and password = #{1}
    </select>

    解决方案二:

    <select id="login" resultType="com.zpc.mybatis.pojo.User">
        select * from tb_user where user_name = #{param1} and password = #{param2}
    </select>

    最终解决方案:

    /**
    * 登录(直接使用注解指定传入参数名称)
    *
    * @param userName
    * @param password
    * @return
    */
    public User login(@Param("userName") String userName, @Param("password") String password);
    <select id="login" resultType="com.zpc.mybatis.pojo.User">
        select * from tb_user where user_name = #{userName} and password = #{password}
    </select>

    通常在方法的参数列表上加上一个注释@Param(“xxxx”) 显式指定参数的名字,然后通过${“xxxx”}或#{“xxxx”}
    sql语句动态生成的时候,使用${};
    sql语句中某个参数进行占位的时候#{}

    3.resultMap

    这里写图片描述
    这里写图片描述
    使用:
    这里写图片描述

    4.sql片段

    <sql id=””></sql>
    <include refId=”” />

    例如在UserMapper.xml中定义如下片段:

    <sql id="commonSql">
    id,
    user_name,
    password,
    name,
    age,
    sex,
    birthday,
    created,
    updated    
    </sql> 

    Sql片段也可以定义在单独的.xml文件中如:
    定义CommonSQL.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="CommonSQL">
    <sql id="commonSql">
    id,
    user_name,
    password,
    name,
    age,
    sex,
    birthday,
    created,
    updated    
    </sql>
    </mapper>

    使用:

    <select id="queryUserById" resultMap="userResultMap">
      select <include refid="CommonSQL.commonSql"></include> from tb_user where id = #{id}
    </select>
    <select id="queryUsersLikeUserName" resultType="User">
        select <include refid="CommonSQL.commonSql"></include> from tb_user where user_name like "%"#{userName}"%"
    </select>

    当然要完成这个功能还需要在全局配置文件mybatis-config.xml中引入该外部配置文件:

    <mappers>
      <mapper resource="CommonSQL.xml"/>
      <!-- 开启mapper接口的包扫描,基于class的配置方式 -->
      <package name="com.zpc.mybatis.mapper"/>
    </mappers>

     

  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/jvStarBlog/p/12735990.html
Copyright © 2020-2023  润新知