zoukankan      html  css  js  c++  java
  • 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>

     

  • 相关阅读:
    STM32CubeMX 使用
    Zookeeper集群搭建
    golang zookeeper监听事件报错
    git push 报错
    springboot使用postgresql模式下数据库表找不到
    不要在循环中访问数据库,这样会严重影响数据库性能
    SQL查询效率(Oracle)
    游标 数据集 效率比较
    oracle 视图
    INDEX SKIP SCAN 和 INDEX RANGE SCAN以及索引会失效
  • 原文地址:https://www.cnblogs.com/jvStarBlog/p/12735990.html
Copyright © 2011-2022 走看看