MyBatis日常笔记记录04--三种传递参数方法

1.在dao包下创建StudentDao接口,接口里面的方法

public interface StudentDao {
    /*方式一:
    * 一个简单类型的参数
    * 简单类型:mybatis把java的基本数据类型和String都叫简单数据类型
    * 在mapper文件获取简单数据类型的一个参数的值,使用#{任意字符}
    * */
    public Student selectStudentById(Integer id);

    /*方式二:
    * 多个参数 : 命名参数,在形参定义的前面加入@Param("自定义参数名称")
    * */

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

    /*方式三:
    * 多个参数 : 使用java对象作为接口中方法的参数
    * */
    List<Student> selectMultiObject(QueryParam param);
    List<Student> selectMultiStudent(Student student);

其中,方式二中的参数需要自己新建java类来定义

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.编写mapper映射文件内容

 

<?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.example.dao.StudentDao">

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

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

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

        2.执行sql封装为resultType="com.example.domain.Student"这个对象
          ResultSet rs = pst.executeQuery();
          Student student = null;
          while(rs!=null){
            //从数据库取表的一行数据,存到一个Java对象中
            student = new Student();
            student.setId(rs.getInt(id));
            student.setName(rs.getName(name));
            student.setEmail(rs.getEmail(email));
            student.setAge(rs.getAge(age));
          }

          return student;

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

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

<!--多个参数,使用java对象的属性值,作为参数实际值
    使用对象的语法 : #{属性名,javaType=类型名称,jdbcType=数据类型} 很少有
                    javaType:指java中的属性数据类型
                    jdbcType:指在数据库中的数据类型
                    例如:#{paramName,javaType=java.lang.String,jbcType=VARCHAR}
        <select id="selectMultiObject" resultType="com.example.domain.Student">
        select id,name,email,age from student where
        name=##{paramName,javaType=java.lang.String,jbcType=VARCHAR}
        or age=#{paramAge,javaType=java.lang.Integer,jbcType=INTEGER}
    </select>

    我们使用的简化方式:#{属性名}  ,javaType ,jdbcType的值mybatis反射能获取,不用提供
    -->
    <select id="selectMultiObject" resultType="com.example.domain.Student">
        select id,name,email,age from student where
        name=#{paramName}
        or age=#{paramAge}
    </select>
    <select id="selectMultiStudent" resultType="com.example.domain.Student">
        select id,name,email,age from student where
            name=#{name}
            or age=#{age}
    </select>


</mapper>

 

3.编写测试类

 

public class TestMyBatis {

    @Test
    public void testSelectStudents() {
        /*
         * 使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口)
         * getMapper能获取dao接口对应的实现类对象
         *
         * */

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

        Student student = dao.selectStudentById(1002);
        System.out.println(student);
    }


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

        List<Student> students = dao.selectMultiParam("李四", 20);

        for (Student stu : students) {
            System.out.println("学生:" + stu);
        }
        sqlSession.close();
    }

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

        QueryParam param = new QueryParam();
        param.setParamName("张三");
        param.setParamAge(21);

        List<Student> students = dao.selectMultiObject(param);

        for (Student stu : students) {
            System.out.println("学生:" + stu);
        }
        sqlSession.close();
    }

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

        Student student = new Student();
        student.setName("张三");
        student.setAge(21);

        List<Student> students = dao.selectMultiStudent(student);

        for (Student stu : students) {
            System.out.println("学生:" + stu);
        }
        sqlSession.close();
    }

 

posted @ 2021-07-05 16:15  Brack_Pearl  阅读(72)  评论(0编辑  收藏  举报