首页 > 其他分享 >深入理解参数-@Param和 对象作为参数重要

深入理解参数-@Param和 对象作为参数重要

时间:2022-11-06 22:22:05浏览次数:93  
标签:java name age Param 深入 student 参数 id

深入理解参数

1.parameterType

parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到mapper 文件的 sql 语句。

使用parameter的配置文件如下:

<?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="com.bjpowernode.dao.StudentDao">

    <!--
      parameterType : dao接口中方法参数的数据类型。
        parameterType它的值是java的数据类型全限定名称或者是mybatis定义的别名
        例如:parameterType="java.lang.Integer"
             parameterType="int"

        注意:parameterType不是强制的,mybatis通过反射机制能够发现接口参数的数类型。
        所以可以没有。 一般我们也不写。

        使用#{}之后, mybatis执行sql是使用的jdbc中的PreparedStatement对象
        由mybatis执行下面的代码:
         1. mybatis创建Connection , PreparedStatement对象
            String sql="select id,name, email,age from student where id=?";
            PreparedStatement pst = conn.preparedStatement(sql);
            pst.setInt(1,1001);

         2. 执行sql封装为resultType="com.bjpowernode.domain.Student"这个对象
            ResultSet rs = ps.executeQuery();
            Student student = null;
            while(rs.next()){
               //从数据库取表的一行数据, 存到一个java对象属性中
               student = new Student();
               student.setId(rs.getInt("id));
               student.setName(rs.getString("name"));
               student.setEmail(rs.getString("email"));
               student.setAge(rs.getInt("age"));
            }

           return student;  //给了dao方法调用的返回值
    -->
    <select id="selectStudentById" parameterType="int" resultType="com.bjpowernode.domain.Student">
        select id,name, email,age from student where id=${studentId}
    </select>

</mapper>

int 或 java.lang.Integer
hashmap 或 java.util.HashMap
list 或 java.util.ArrayList
student 或 com.bjpowernode.domain.Student

<select>,<insert>,<update>,<delete>都可以使用 parameterType 指定类型。
例如:
<delete id="deleteStudent" parameterType="int">
 delete from student where id=#{studentId}
</delete>
等同于
<delete id="deleteStudent" parameterType="java.lang.Integer">
 delete from student where id=#{studentId}
</delete>

2. MyBatis 传递参数

从 java 代码中把参数传递到 mapper.xml 文件。

3. 一个简单的参数

Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方法的参数名无关。

mapper 文件:

<select id="selectById" resultType="com.bjpowernode.domain.Student">

 select id,name,email,age from student where id=#{studentId}

</select>

\#{studentId} , studentId 是自定义的变量名称,和方法参数名无关。

测试方法:

@Test

**public void** testSelectById(){

 //**一个参数** 

 Student student = **studentDao**.selectById(1005);

 System.out.println("查询id是1005的学生:" +student);

}

4. 多个参数使用@Param

当 Dao 接口方法多个参数,需要通过名称使用参数。

在方法形参前面加入@Param(“自定义参数名”),

mapper 文件使用#{自定义参数名}。

    /**
     * 多个参数: 命名参数,在形参定义的前面加入 @Param("自定义参数名称")
     */
    List<Student> selectMultiParam(@Param("myname") String name,
                                   @Param("myage") Integer age);

mapper 文件内容如下:

    <!--多个参数,使用@Param命名-->
    <select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
         select id,name, email,age from student where name=#{myname} or age=#{myage}
    </select>

执行结果如下:

5. 多个参数-使用对象

使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。

语法格式: #{ property,javaType=java 中数据类型名,jdbcType=数据类型名称 }

javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{ property }

项目结构如下:

  1. 先创建一个对象

    package com.bjpowernode.vo;
    
    public class QueryParam {
    
        private String paramName;
        private Integer paramAge;
    
        public String getParamName() {
            return paramName;
        }
    
        public void setParamName(String paramName) {
            this.paramName = paramName;
        }
    
        public Integer getParamAge() {
            return paramAge;
        }
    
        public void setParamAge(Integer paramAge) {
            this.paramAge = paramAge;
        }
    }
    
    
  2. 在Dao接口中定义方法

        /**
         * 多个参数,使用java对象作为接口中方法的参数
         */
        List<Student> selectMultiObject(QueryParam param);
    
        List<Student> selectMultiStudent(Student student);
    
  3. 在mapper配置文件中配置其中参数必须和对象的属性名一样

    <select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
          select id,name, email,age from student where
           name=#{paramName}   or age=#{paramAge}
    </select>

    <select id="selectMultiStudent" resultType="com.bjpowernode.domain.Student">
         select id,name, email,age from student where name=#{name} or age=#{age}
    </select>
  1. 测试结果如下:

6. 多个参数按位置(由于用的不多,简单做个笔记)

    接口
    /**
     * 多个参数-简单类型的,按位置传值,
     * mybatis.3.4之前,使用 #{0} ,#{1}
     * mybatis。3.4之后 ,使用 #{arg0} ,#{arg1}
     */
    List<Student> selectMultiPosition( String name,Integer age);
    
    配置文件:
        <!--多个参数使用位置-->
    <select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">
          select id,name, email,age from student where
          name = #{arg0} or age=#{arg1}
    </select>

测试结果

7. 多个参数使用Map(了解)

接口
    /**
     * 多个参数,使用Map存放多个值
     */
    List<Student> selectMultiByMap(Map<String,Object> map);
    
配置文件:
    <!--多个参数,使用Map , 使用语法 #{map的key}-->
    <select id="selectMultiByMap" resultType="com.bjpowernode.domain.Student">
          select id,name, email,age from student where
          name = #{myname} or age=#{age1}
    </select>

测试如下:

8 . #和$

#****:占位符,告诉 mybatis 使用实际的参数值代替。并使用 PrepareStatement 对象执行 sql 语句, #{…}代替

sql 语句的“?”。这样做更安全,更迅速,通常也是首选做法,

$ 字符串替换,告诉 mybatis 使用$包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和${}的

内容连接起来。主要用在替换表名,列名,不同列排序等操作。

接下来两张图片解释

标签:java,name,age,Param,深入,student,参数,id
From: https://www.cnblogs.com/atao-BigData/p/16864374.html

相关文章