Mybatis学习笔记,mybatis中占位符的使用和传参的方法

一、占位符的使用

#{}占位符

  • 底层是由jdbc中PrepareStatement对象实现
  • mybatis的底层会把#{}占位符替换成jdbc占位符中?的形式,可以防止发生sql注入,它是安全的,但是他不能表示表名和列名

${}占位符

  • 底层是由jdbc中Statement对象实现的
  • mybatis的底层会把${}占位符变成字符串拼接的形式,他不会对传入的参数做出类型的改变,使用起来不安全,有sql注入的风险,常常在确保安全的情况下使用或用来表示表名、列名

使用方法

这两个占位符的使用方法都是一样的,只是有上边那些不同
使用示例

<select id="selectStudentById" parameterType="int" resultType="org.example.demain.Student">
        select id,name,email,age from student where id=#{id}
</select>

二、Mybatis的5种传参方法

1、一个简单类型的参数

Mapper标签中的代码为

 <select id="selectStudentById" parameterType="int" resultType="org.example.demain.Student">
        select id,name,email,age from student where id=#{id}
    </select>

dao接口的方法名设置为

package org.example.dao;

import org.apache.ibatis.annotations.Param;
import org.example.demain.Student;

import java.util.List;

public interface StudentDao {
    Student selectStudentById(Integer id);
}

测试类中的代码为

package org.example;


import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MybatisUtils;
import org.example.dao.StudentDao;
import org.example.demain.Student;
import org.junit.Test;

import java.util.List;

public class MyTest {

   @Test
    public void testtwo(){
//       首先获取SqlSession对象
       SqlSession session= MybatisUtils.getSqlSession();
//       利用getMapper获取mybatis在内存中创建的StudentDao接口的实现类
       StudentDao stu=session.getMapper(StudentDao.class);
//       调用实现类方法获取查询的返回对象
       Student student=stu.selectStudentById(1003);
//       输出返回对象
       System.out.println(student);
//       释放资源
       session.close();
   }
}

测试结果

在这里插入图片描述

2、多个简单类型的参数

@Param注解

@Param注解是专门用来对传入的参数命名的,命名好的参数可以被占位符识别

具体使用

  • 首先使用@Param注解在dao接口的方法中命名好传入的参数
package org.example.dao;

import org.apache.ibatis.annotations.Param;
import org.example.demain.Student;

import java.util.List;

public interface StudentDao {
    Student selectaaa(@Param("id1") Integer id, @Param("ema1") String email);
}
  • 然后在Mapper文件的占位符中配置,占位符中需要传入的名字就可以直接在{}中写我们定义好的名字
<select id="selectaaa"  resultType="org.example.demain.Student">
        select id,name,email,age from student where id=#{id1} and email=#{ema1}
</select>
  • 测试类跟之前的一样
package org.example;


import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MybatisUtils;
import org.example.dao.StudentDao;
import org.example.demain.Student;
import org.junit.Test;

import java.util.List;

public class MyTest {
   @Test
   public void testone(){
//       首先获取SqlSession对象
      SqlSession session= MybatisUtils.getSqlSession();
//       利用getMapper获取mybatis在内存中创建的StudentDao接口的实现类
      StudentDao stu=session.getMapper(StudentDao.class);
//       调用实现类方法获取查询的返回对象
      Student student=stu.selectaaa(1003,"wangwu@126.com");
//       输出返回对象
      System.out.println(student);
//       释放资源
      session.close();
   }
}
  • 测试结果
    在这里插入图片描述

3、实体类传参

  • 如果需要传入的参数特别特别特别特别的多的话,使用@Param注解命名可能会很麻烦,所以我们就用到了实体类传参
  • 实体类传参的步骤就是需要创建一个传参类,他的属性就是需要传入的参数,生成该类的getter和setter方法,该类的需要使用的属性名需要和sql语句占位符中的名字一样,在运行过程mybatis会通过反射机制调用该类的getter方法,自动匹配与占位符名字相同的类属性进行传参
  • 测试的时候先生成类的实例对象,然后利用setter给该类属性赋值,然后把该类的实例对象传参

首先创建一个传参类,生成它的getter和setter方法

package org.example.demain;

public class clq {
    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    private Integer age;
}

dao接口设置

package org.example.dao;

import org.apache.ibatis.annotations.Param;
import org.example.demain.Student;
import org.example.demain.clq;

import java.util.List;

public interface StudentDao {
    List<Student> selectbbb(clq a);
}

mapper文件设置

 <select id="selectbbb"  resultType="org.example.demain.Student">
        select id,name,email,age from student where id=#{id} or age=#{age}
  </select>

测试类

package org.example;


import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MybatisUtils;
import org.example.dao.StudentDao;
import org.example.demain.Student;
import org.example.demain.clq;
import org.junit.Test;

import java.util.List;

public class MyTest {
   @Test
   public void Testthree(){
//       首先获取SqlSession对象
      SqlSession session= MybatisUtils.getSqlSession();
//       利用getMapper获取mybatis在内存中创建的StudentDao接口的实现类
      StudentDao stu=session.getMapper(StudentDao.class);
//       调用实现类方法获取查询的返回对象
      clq cl1=new clq();
      cl1.setId(1001);
      cl1.setAge(21);
      List<Student> student=stu.selectbbb(cl1);
//       输出返回对象
      System.out.println(student);
//       释放资源
      session.close();
   }
}

测试结果

在这里插入图片描述

4、位置传参和map传参

这两个不常用,也不多做赘述,需要的时候查网上资料


版权声明:本文为weixin_47544732原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。