MyBatis的xml中的key动态变量如何指定

时间:2024-5-24    作者:老大夫    分类: SSM


输入的key

  1. 场景一:传入的是单个简单类型 key 随便写
  2. 场景二:传入的是实体对象 key如何写?
    key=属性名即可
  3. 场景三:传入的是多个零散简单类型 key如何写?
    可不可以随便写? 不可以
    按照形参name获取? 也不可以
    方案一:注解指定 @Param注解 指定多个简单参数的key,key = @Param("指定的key")
    方案二:mybatis默认机制
    arg0 arg1 ...... 从左到右
    (name,salary) name -> key =arg0 salary -> key =arg1
    param1 param2 ......
    (name,salary) name -> key =param1 salary -> key =param2
  4. 场景四:传入Map key如何写?
    key=Map的key即可

举例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mapper.EmployeeMapper">

    <!--
        #{ key }  : 占位符 + 赋值  emp_id = ?   ?=赋值
        ${ key }  : 字符串拼接   " emp_id = "  +  id

        推荐使用#{}  防止sql注入
        总结: 动态值 使用 #{} , 列名,表名,写成${ }
        ?  只能替代值的位置,不能代替容器名(列名、表名、sql关键字)  emp_id = ?  不能写 ? = ?
        sql  select *  from  表  where  列名动态 ${ColumName} = 值动态 #{ColumValue}
    -->

    <select id="queryById" resultType="com.atguigu.pojo.Employee">
        select emp_id empId,emp_name empName,emp_salary empSalary
            from t_emp where emp_id = #{empId}
    </select>

    <!--
           场景一:传入的是单个简单类型  key 随便写
     -->

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

    <select id="queryBySalary" resultType="com.atguigu.pojo.Employee">
        select emp_id empId,emp_name empName,emp_salary empSalary
        from t_emp where emp_salary = #{empSalary}
    </select>

    <!--
            场景二:传入的是实体对象  key如何写?
            key=属性名即可
     -->

    <insert id="insert">
        insert into t_emp (emp_name , emp_salary) values (#{empName},#{empSalary});
    </insert>

    <!--
            场景三:传入的是多个零散简单类型  key如何写?
            可不可以随便写?  不可以
            按照形参name获取?  也不可以
            方案一:注解指定  @Param注解  指定多个简单参数的key,key = @Param("指定的key")
            方案二:mybatis默认机制
                    arg0 arg1 ......  从左到右
                    (name,salary) name -> key =arg0  salary -> key =arg1
                    param1  param2 ......
                    (name,salary) name -> key =param1  salary -> key =param2
     -->

    <select id="queryByNameAndSalary" resultType="com.atguigu.pojo.Employee">
        select emp_id empId,emp_name empName,emp_salary empSalary
        from t_emp where emp_name = #{name} and emp_salary = #{salary}
    </select>

    <!--
            场景四:传入Map  key如何写?
            key=Map的key即可
     -->

    <insert id="insertEmpMapper" >
        insert into t_emp (emp_name , emp_salary) values (#{name},#{salary});
    </insert>

</mapper>

指定返回的类型

  1. DML语句不需要指定返回的类型,都是int型数据,rows影响行数。
  2. 场景二:返回单个指定简单类型 指定ResultType的写法 返回的数据类型
    resultType就两种
    第一种是类的全限定符号,自己引用的类
    第二种是别名简称 string double .....

          扩展:给自己的类定义别名
            第一种:在mybatis-config.xml中定义别名使用标签<typeAliases>
            第二种:批量定义 <package name="com.atguigu.Employee"/>
                   并且可以在类上使用注解@Aliase 再重新自定义别名
  3. 场景三:返回值是map类型
    resultType就设置map,列名为key,返回值为值
    当没有实体类来接收值的时候我们可以使用map来接收值
    key->查询的列 value->查询的值
  4. 返回集合List类型
    返回时是集合:resulType要指定的是泛型 不是list
    为什么?
    因为mybatis查询时是调用ibatis,而ibatis查询就两种方法
    一是 selectOne 本质也是selectList
    二是 selectList 本身就是按照List类型去查询的
  5. 返回主键值:获取插入的主键
    1.自增长主键回显 mysql auto_increment
    useGeneratedKeys="true" 标识想要数据库自动增长的主键值
    keyColumn="emp_id" 是主键的列值
    keyProperty="empId" 接收主键列值的属性
    2.非自增长主键回显
    在sql语句前加上
    插入之前先执行一段sql语句,生成一个主键值
    order="BEFORE|AFTER" 在语句前还是后执行
    resultType="string" 返回值类型
    keyProperty="tId" 主键的值返回给谁 select REPLACE(UUID(),'-','');
  6. 自定义映射:ResultMap
    当列名和属性名不一致时如何解决
    方案一:起别名
    方案二:开启驼峰式映射
    方案三:ResultMap自定义映射 resultType和ResultMap只能二选一

举例说明:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mapper.EmployeeMapper">

    <!--
        DML
    -->
    <delete id="deleteById">
        delete from t_emp where emp_id = #{empId}
    </delete>

    <!--
        场景一:返回单个指定简单类型  指定ResultType的写法  返回的数据类型
             resultType就两种
                第一种是类的全限定符号
                第二种是别名简称 string  double  .....

              扩展:给自己的类定义别名
                第一种:在mybatis-config.xml中定义别名使用标签<typeAliases>
                第二种:批量定义 <package name="com.atguigu.Employee"/>
                       并且可以在类上使用注解@Aliase 再重新自定义注解
        场景二: 返回单个自定义类型
                resultType指定返回值类型
                第一种,全限定类名
                第二种,别名
                查询,返回单个实体类型,要求列名和属性名一致!
                这样才可以进行实体类的映射

                但是可以进行映射,设置支持驼峰式自动映射!
                 emp_id ==> empId
                开启驼峰式映射
                <setting name="mapUnderscoreToCamelCase" value="true"/>
        场景三: 返回值是map类型
                resultType就设置map,列名为key,返回值为值
                当没有实体类来接收值的时候我们可以使用map来接收值
                key->查询的列  value->查询的值

        场景四: 返回集合List类型
                返回时是集合:resulType要指定的是泛型 不是list
                为什么?
                    因为mybatis查询时是调用ibatis,而ibatis查询就两种方法
                    一是 selectOne 本质也是selectList
                    二是 selectList  本身就是按照List类型去查询的
        场景五: 返回主键值:获取插入的主键
                1.自增长主键回显 mysql  auto_increment
                useGeneratedKeys="true" 标识想要数据库自动增长的主键值
                keyColumn="emp_id" 是主键的列值
                keyProperty="empId" 接收主键列值的属性
                2.非自增长主键回显
                在sql语句前加上
                 插入之前先执行一段sql语句,生成一个主键值
               order="BEFORE|AFTER" 在语句前还是后执行
               resultType="string" 返回值类型
               keyProperty="tId" 主键的值返回给谁
                <selectKey order="BEFORE" resultType="string" keyProperty="tId">
                    select REPLACE(UUID(),'-','');
                </selectKey>

        自定义映射:ResultMap         
                当列名和属性名不一致时如何解决
                    方案一:起别名
                    方案二:开启驼峰式映射
                    方案三:ResultMap自定义映射  resultType和ResultMap只能二选一
                           ResultType按照规则自动映射,按照是否开启驼峰式映射,自己映射属性和列名!只能映射一层结构!
                           深层次的对象无法映射,也就是无法进行多表查询
                            Order                   数据库
                                orderId                 order_id
                                orderName               order_name
                                orderItem orderItem
                                            itemId          item_id
                      声明ResultMap就是自定义映射规则,
                            id标识 ->select resultMap=“标识”
                            type  ->具体返回值类型  全限定符或者别名  集合只写泛型
                                    id 是主键的映射关系
                                    result 是普通列的映射关系

                        <resultMap id="tMap" type="com.atguigu.pojo.Teacher">
                            <id column="t_id" property="tId"></id>
                            <result column="t_name" property="tName"></result>
                        </resultMap>
                        <select id="queryById"  resultMap="tMap">
                            select * from teacher where t_id = #{tId}
                                select t_id tId,t_name tName from teacher where t_id = #{tId}
                        </select>
    -->
    <select id="queryNameById" resultType="java.lang.String">
        select emp_name from t_emp where emp_id = #{empId}
    </select>

    <select id="querySalaryById" resultType="java.lang.Double">
        select emp_salary from t_emp where emp_id = #{empId}
    </select>

    <select id="queryById" resultType="com.atguigu.pojo.Employee">
        select emp_id empId,emp_name empName,emp_salary empSalary
        from t_emp where emp_id = #{empId}
    </select>
    <!-- Map<String,Object> selectEmpNameAndMaxSalary(); -->
    <!-- 返回工资最高的员工的姓名和他的工资 -->
    <select id="selectEmpNameAndMaxSalary" resultType="map">
        SELECT
        emp_name 员工姓名,
        emp_salary 员工工资,
        (SELECT AVG(emp_salary) FROM t_emp) 部门平均工资
        FROM t_emp WHERE emp_salary=(
        SELECT MAX(emp_salary) FROM t_emp
        )
    </select>
    <select id="queryNamesBySalry" resultType="string">
        select emp_name from t_emp where emp_salary > #{salary}
    </select>

    <select id="queryAll" resultType="com.atguigu.pojo.Employee">
        select * from t_emp
    </select>

    <!-- 场景五 -->
    <insert id="insertEmp" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">
        insert into t_emp (emp_name,emp_salary)
         value(#{empName},#{empSalary})
    </insert>

</mapper>


扫描二维码,在手机上阅读

推荐阅读: