ssm合集---04 mybatis 传入参数(#和$的区别)

 传入参数: 从java代码中把数据传入到mapper文件的sql语句中。

# 和  $ 的区别

一.深入理解参数

(1)parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,

         因为 MyBatis 可以推断出具体传入语句的参数,默认值为未设置(unset)。

         接口中方法的参数从 java 代码传入到 mapper 文件的 sql 语句。

         例如:

<select id="selectStudentById" parameterType="java.lang.Integer" resultType="com.zsz.domain.Student">
    select id,name,email,age from student where id=#{id}
</select>

(2) MyBatis 传递参数 :从 java 代码中把参数传递到 mapper.xml 文件。
1.  一个简单参数  :     
         Dao 接口中方法的参数只有一个简单类型( java 基本类型和 String ),占位符 #{ 任意字符 }(一般都是见名知意) ,和方
         法的参数名无关。
接口方法:
/**
     * 一个简单类型的参数:
     * 简单类型:mybatis把java的基本数据类型和String都叫做简单数据类型。
     *
     * 在mapper文件中想要获取简单数据类型的值我们使用的是#{任意字符}
     *
     *
     */
    public Student selectStudentById(Integer id);

mapper 文件:

<select id="selectStudentById" parameterType="java.lang.Integer" resultType="com.zsz.domain.Student">
    select id,name,email,age from student where id=#{id}
</select>




 <!--
           parameterType:表示dao接口中方法参数的数据类型。
           parameterType它的值是java数据类型全限定名称或者是mybatis定义的别名
           例如:parameterType="java.lang.Integer"(全限定名称)
                parameterType="int"(mybatis定义的别名)
                parameterType不是强制的,mybatis通过反射能够发现接口参数的数据类型。
                所以可以没有,一般我们也不写。

                使用#{}之后,mybatis执行sql是使用jdbc中的PreparedStatement对象
                由mybatis执行下面的代码:

                1.mybatis创建Connection和PrepareStatement对象
                  String sql=" select id,name,email,age from student where id=?";
                  PreparedStatement pst=con.preparedStatement(sql);
                  pst.setInt(1,1001);

                2.执行sql封装为resultType=“com.zsz.domain.Student”这个对象
                  Result re=ps.executeQuery();
                  Student student=null;
                  while(rs.next()){
                     //从数据库取表的一行数据,存到一个java对象的属性中
                     student=new Student();
                     student.setId(rs.getInt("id"));
                     ...
                  }
                  return student;//赋给了dao方法调用的返回值
    -->

测试方法:

 @Test
    public void testSelectStudentById(){

        SqlSession sqlSession= MybatisUtils.getSqlSession();
        StudentDao dao=sqlSession.getMapper(StudentDao.class);

        //调用dao的方法来执行数据库的操作
         Student student= dao.selectStudentById(61005);
        System.out.println("student="+student);


    }
2. 1    多个参数 - 使用 @Param
Dao 接口方法多个参数,需要通过名称使用参数。在方法形参前面加入@Param(“ 自定义参数名 ”) , mapper 文件使用 #{ 自定义参数名 }
接口方法:
/**
     * 多个参数:命名参数,在形参定义的前面加入@Param("自定义参数名称")
     *
     */

    List<Student> selectMultiParam(@Param("myname")String name,
                                   @Param("myage")Integer age);

mapper文件:

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

测试方法:

 @Test
    public void testselectMultiParam(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        List<Student> studentList = dao.selectMultiParam("张三", 20);
        for (Student student:studentList) {
            System.out.println("学生="+student);
        }
        sqlSession.close();

    }
2.2    多个参数 - 使用对象
(这里创建vo包,之后在包中创建对应的实体类)
多个参数,使用java对象的属性值,作为参数实际值
    使用对象语法:#{属性名,javaType=类型名称,jdbcType=数据类型} 很少用。
    javaType:指java中的属性的数据类型。
    jdbcType:在数据库中的数据类型。
    例如:#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
    我们使用的是简化的方式:#{属性名}  javaType和jdbcType的值mybatis反射可以获取,不用提供。
接口方法:
/**
     * 多个参数:使用java对象作为接口中方法的参数
     *
     */
    List<Student> selectMultiObject(QueryParam queryParam);

mapper文件:

<!--
<select id="selectMultiObject" resultType="com.zsz.domain.Student">
    select id,name,email,age from student where name =#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
                                                or age=#{paramAge,javaType=java.lang.Integer,jdbcType=Integer}
</select>
-->




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

测试方法:

 @Test
    public void testSelectMultiObject(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        QueryParam queryParam=new QueryParam();
        queryParam.setParamAge(20);
        queryParam.setParamName("李四");
        List<Student> studentList = dao.selectMultiObject(queryParam);
        for (Student student:studentList) {
            System.out.println("学生="+student);
        }
        sqlSession.close();

    }
2.3  多个参数 - 按位置(了解)
参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是 #{arg0}, 第二个是 #{arg1}
注意: mybatis-3.3 版本和之前的版本使用 #{0},#{1} 方式, 从 mybatis3.4 开始使用 #{arg0} 方式。
2.4  多个参数 - 使用 Map(了解)
Map 集合可以存储多个值,使用 Map mapper 文件一次传入多个参数。 Map 集合使用 String key
Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值。

3.# 和  $

      select id,name, email,age from student where id=#{studentId}
      # 的结果: select id,name, email,age from student where id=? 


       select id,name, email,age from student where id=${studentId}
      $ 的结果:select id,name, email,age from student where id=1001

      String sql="select id,name, email,age from student where id=" + "1001";
      使用的Statement对象执行sql, 效率比PreparedStatement低。


      $:可以替换表名或者列名, 你能确定数据是安全的。可以使用$


      # 和 $区别
      1. #使用 ?在sql语句中做站位的, 使用PreparedStatement执行sql,效率高
      2. #能够避免sql注入,更安全。
      3. $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
      4. $有sql注入的风险,缺乏安全性。
      5. $:可以替换表名或者列名
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值