mybatis的 Mapper.xml语法

一、select

XML 复制代码
<mapper namespace="mapper接口类">
    <!-- 注意:mapper接口不能重载,因为mapper.xml根据方法名识别。 无法识别重载方法-->
    <select id="mapper接口的方法名" resultType="返回值类型">
        select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_id=#{empId}
    </select>
</mapper>

示例:

XML 复制代码
<mapper namespace="com.gcy.mapper.EmployeeMapper">
    <!-- 注意:mapper接口不能重载,因为mapper.xml根据方法名识别。 无法识别重载方法-->
    <select id="queryById" resultType="com.gcy.pojo.Employee">
        select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_id=#{empId}
    </select>
</mapper>
java 复制代码
public interface EmployeeMapper {
    Employee queryById(Integer id);
}

二、 #{key} 和 ${key} 的区别;传入对象、map时的取值规则;@Param的使用时机

java 复制代码
<mapper namespace="com.xx.mapper.EmployeeMapper(mapper接口类的全路径)">

    <!--
      #{key}和${key}的区别:
      #{ key }:占位符 + 赋值    sql先添加占位符,emp_id=?  然后给?占位符取值。
      ${key}:字符串拼接, "emp_id=" + id
      推荐使用#{key} 防止【sql注入攻击】的问题
      ? 只能替代值的位置,不能替代容器名(标签,列名,sql关键字) emp_id=?  不能写成?=?

      方法名(cName,cValue)
      select * from t_emp where 列名是动态的${cName} = 动态列值#{cValue}

      总结:动态值使用#{key}。 动态的列名、容器名 关键字用 ${key}
    -->
    <select id="queryById" resultType="com.xxx.pojo.Employee(返回值类型)">
        select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_id=${empId}
    </select>


    <!-- 场景1:传入的单个简单类型,key随便写一般情况下推荐使用参数名-->
    <delete id="deleteById">
        delete from t_emp where id = #{id}
    </delete>
    
    <select id="queryBySalary" resultType="com.xxx.pojo.Employee">
        select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_salary=${salary}
    </select>

    <!-- 场景2:传入的是一个实体对象
               key=实体对象的变量名
    -->
    <insert id="insertEmp">
        insert into t_emp (emp_name,emp_salary) values (#{empName},#{empSalary})
    </insert>


    <!-- 场景3:传入多个简单类型数据如何取值 key
               不能随便写
               不能按照形参名称取值
               方案1:注解指定 @param注解 指定多个简单参数的key  key = Param("value值") 【推荐】
               方案2:mybatis默认机制
                   arg0 arg1.. 形参从左到右依次对应 arg0 arg1..
                     (name,salary)  emp_name = #{arg0}   emp_salary = #{arg1}
                   param1,param2..
                     (name,salary)  emp_name = #{param1}   emp_salary = #{param2}
    -->
    <select id="queryByNameAndSalary" resultType="com.gcy.pojo.Employee">
        select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_name=#{a} and emp_salary=#{b}
    </select>

    <!-- 场景4:传入map 如何指定key的值
               key = map的key即可
    -->
    <insert id="insertEmpMap">
        insert into t_emp(emp_name,emp_salary) values (#{name},#{salary})
    </insert>

</mapper>
java 复制代码
public interface EmployeeMapper {
    Employee queryById(int id);

    int deleteById(int id);

    Employee queryBySalary(Double salary);

    int insertEmp(Employee employee);

    List<Employee> queryByNameAndSalary(@Param("a") String name, @Param("b") Double salary);

    int insertEmpMap(Map map);
}

三、给自己声明的pojo类起别名;开启驼峰映射;返回集合或者map;设置主键回显。

XML 复制代码
<mapper namespace="com.gcy.mapper.EmployeeMapper">


    <delete id="deleteById">
        delete from t_emp where emp_id = #{id}
    </delete>


    <!--
        场景1:返回单个简单类型如何指定 resultType的写法。 返回值的数据类型
              resultType语法:
                 -类的全限定符
                 -别名简称
                     mybatis给我们提供了72种默认的别名。都是常用的Java数据类型
                     基本数据类型 int double -> _int _double
                     包装数据类型 Integer Double -> int double
                     集合容器类型 Map List HashMap -> map list hashMap
                  扩展:如果没有提供,需要自己定义别名 或者写类的全限定符
                  给自己声明的类如何定义别名
                     1、给自己的类定义别名,在查询返回结果集中指定返回值类型使用
                     在mybatis-config.xml中配置
                     <typeAliases>
                         <typeAlias type="com.gcy.pojo.Employee" alias="employee"/>
                     </typeAliases>

                     2、批量设置别名:在mybatis-config.xml中配置
                      <typeAliases>
                          批量将包下的类定义别名,别名为类的首字母小写
                          <package name="com.gcy.pojo"/>
                      </typeAliases>
                      
                      3、扩展:如果不想使用批量的别名,可以在单个类上使用注解单独指定别名!
                      @Alias("empe")
                      
                      4、ssm整合的时候,还可以通过配置统一给pojo类设置别名:
                         //指定pojo包下的所有类的别名为首字母小写的类名。
                         sqlSessionFactoryBean.setTypeAliasesPackage("com.xx.pojo");

    -->
    <select id="queryNameById" resultType="string">
        select emp_name from t_emp where emp_id = #{id}
    </select>

    <select id="querySalaryById" resultType="double">
        select emp_salary from t_emp where emp_id = #{id}
    </select>


    <!--
          场景2:返回单个自定义类的类型
          默认要求:
              查询,返回单个实体类型,要求列名和属性名要一致。
              这样才可以进行实体类的属性映射。

          但是可以进行设置,设置支持驼峰式自动映射。
             emp_id -> empId   ==empId
          mybatis-config.xml中设置
          <setting name="mapUnderscoreToCamelCase" value="true"/>
         ssm整合时也可以在配置类中开启驼峰映射:configuration.setMapUnderscoreToCamelCase(true); //开启驼峰映射
    -->
    <select id="queryById" resultType="employee">
        select * from t_emp where emp_id = #{id}
    </select>


    <!-- 场景3. 返回map
              当没有实体类可以使用接值的时候
              可以使用map接收数据!
              key -> 查询的列
              value ->查询的值
    -->
    <select id="queryEmployeeByIdAsMap" resultType="map">
        select emp_id,emp_name,emp_salary from t_emp where emp_id = #{id}
    </select>


    <!--
        场景4. 返回的是集合类型如何指定
        切记:返回的是集合类型 resultType不需要指定集合类型,只需要指定泛型即可
        mybatis -> ibatis -> selectOne 方法查单个 底层调用的是  selectList方法, 直接返回集合。
    -->
    <select id="queryNameBySalary" resultType="string">
        select emp_name from t_emp where emp_salary = #{salary}
    </select>

    <select id="queryAll" resultType="employee">
        select * from t_emp
    </select>


    <!--
        场景5:主键回显
             1.自增长主键回显
             useGeneratedKeys="true" 返回数据库自增长主键的值
             keyColumn="emp_id" 主键列名
             keyProperty="empId" 对象中与主键列名对应的字段名。

    -->
    <insert id="insertEmp" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">
        insert into t_emp (emp_name,emp_salary) values (#{empName},#{empSalary});
    </insert>
</mapper>
java 复制代码
public interface EmployeeMapper {

    int deleteById(Integer id);
    String queryNameById(Integer id);
    Double querySalaryById(Integer id);

    Employee queryById(Integer id);

    Map<String, Object> queryEmployeeByIdAsMap(Integer id);

    List<String> queryNameBySalary(Double salary);

    List<Employee> queryAll();

    int insertEmp(Employee employee);
}

四、resultMap用法

1、association属性

XML 复制代码
<!--  自定义映射关系,定义嵌套对象的映射关系  -->
    <resultMap id="orderMap" type="order">
<!--    第一层属性 order对象    -->
<!--     order的主键 id标签   -->
        <id column="order_id" property="orderId"/>
<!--    普通列    -->
        <result column="order_name" property="orderName"/>
        <result column="customer_id" property="customerId"/>

<!--    给对象属性赋值  一对一的对象属性赋值
          property  对象属性名
          javaType  对象类型
    -->
        <association property="customer" javaType="customer">
            <id column="customer_id" property="customerId"/>
            <result column="customer_name" property="customerName"/>
        </association>
    </resultMap>
    <select id="queryOrderById" resultMap="orderMap">
        select * from t_order tor join t_customer tc on tor .customer_id = tc.customer_id
        where tor.order_id = #{id};
    </select>
java 复制代码
@Data
public class Order {
    private Integer orderId;
    private String orderName;
    private Integer customerId;
    private Customer customer;
}

2、collection属性

XML 复制代码
<!--
    默认情况下,resultMap会自动映射单层的result标签[列名和属性名相同,或者开启驼峰式映射开关]
    对于嵌套association|collection mybatis就不会自动映射result标签 列名 和属性名
-->
    <resultMap id="customerMap" type="customer">
        <id column="customer_id" property="customerId"/>
<!--        <result column="customer_name" property="customerName"/>-->

<!--        <association property="" javaType=""  一对一的对象属性赋值-->
<!--        给集合属性赋值 用<collection标签
                property 集合属性名
                ofType  集合的泛型类型
-->
        <collection property="orderList" ofType="order">
            <id column="order_id" property="orderId"/>
<!--            <result column="order_name" property="orderName"/>-->
<!--            <result column="customer_id" property="customerId"/>-->
        </collection>
    </resultMap>
    <select id="queryList" resultMap="customerMap">
        select * from t_order tor join t_customer tc on tor .customer_id = tc.customer_id;
    </select>
</mapper>
java 复制代码
@Data
public class Customer {
    private Integer customerId;
    private String customerName;
    List<Order> orderList;
}
相关推荐
小蒜学长1 小时前
基于SpringBoot 框架的自媒体新闻系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·mysql数据库·自媒体新闻管理系统
9624561 小时前
补打一条卡,为什么要从前一天重新算:人工补录与实时重算业务复盘
java·mysql·kafka
Java后端的Ai之路1 小时前
01、Java并发编程:学习攻略如何才能学好并发编程?
java·开发语言·学习
ScilogyHunter1 小时前
Hercules系列安全MCU功能安全原理详解
java·单片机·安全·hercules
步行cgn1 小时前
为什么既要 web.xml 又要 springmvc.xml?能不能只配一个?
xml·前端·hive
m0_639906942 小时前
MyBatis 实现分页查询|逻辑分页、物理分页、PageHelper 原理
mybatis
博风2 小时前
eclipse中配置maven,以及在本地使用maven。
java·eclipse·maven
云-缩影2 小时前
实际项目中怎么选排序算法:从面试题到工程落地
java·算法·排序算法
追星星の人2 小时前
java web项目(eclipse软件)全流程备份
java·servlet