欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

程序员文章站 2022-04-02 10:19:38
文章目录:1.MyBatis的dao代理1.1 MyBatis提供代理1.2 使用MyBatis代理的要求1.3MyBatis代理的实现方式2.深入理解相关参数2.1 parameterType2.2 dao接口的方法形参列表中只有一个参数2.3dao接口的方法形参列表中有多个参数2.4dao接口的方法形参列表中使用entity实体类对象2.5dao接口的方法形参列表中使用自定义类对象写在结尾1.MyBatis的dao代理1.1 MyBat......

文章目录:

1.MyBatis的dao代理

1.1 MyBatis提供代理 

1.2 使用MyBatis代理的要求 

1.3 MyBatis代理的实现方式

2.深入理解相关参数

2.1 parameterType 

2.2 dao接口的方法形参列表中只有一个参数(重要!!!)

2.3 dao接口的方法形参列表中有多个参数(重要!!!)

2.4 dao接口的方法形参列表中使用entity实体类对象(重要!!!)

2.5 dao接口的方法形参列表中使用自定义类对象(重要!!!)

2.6 dao接口的方法形参列表中按位置传递参数(不推荐!!!)

2.7 dao接口的方法形参列表中按Map传递参数(不推荐!!!)

写在结尾


1.MyBatis的dao代理

1.1 MyBatis提供代理 

1.2 使用MyBatis代理的要求 

1.3 MyBatis代理的实现方式

    @Test
    public void testSelectById() {
        //1.获取SqlSession
        SqlSession session = MyBatisUtil.getSqlSession();
        //2.获取dao的代理
        StudentDao studentDao=session.getMapper(StudentDao.class);
        Student student=studentDao.selectById(1001);
        System.out.println("student = " + student);
        //3.关闭SqlSession对象
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

    @Test
    public void testSelectStudents() {
        SqlSession session=MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        //com.sun.proxy.$Proxy == StudentDaoImpl
        System.out.println("studentDao === " + studentDao.getClass().getName());
        List<Student> students=studentDao.selectStudents();
        students.forEach( stu-> System.out.println("stu = " + stu));
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

StudentDao studentDao=session.getMapper(StudentDao.class);
//等同于
StudentDao studentDao=new StudentDaoImpl();

2.深入理解相关参数

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

2.1 parameterType 

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;

import java.util.List;

/**
 *
 */
public interface StudentDao {

    Student selectById(Integer id);

}
    <!--
        parameterType: 指定dao接口形参的类型
        这个属性的值可以使用 java 类型的全限定名称或者 mybatis定义的别名

        mybatis执行的sql语句:select id,name,email,age from student where id=?
        ? 是占位符,使用jdbc中的PreparedStatement执行这样的sql语句
        PreparedStatement pst=conn.preparedStatement("select id,name,email,age from student where id=?");
        给 ? 位置赋值
        参数Integer:执行pst.setInt(1,1001);  对应了mybatis中的 parameterType="java.lang.Integer"
        参数String:执行pst.setString(1,"1001");

        第一个用法:java类型的全限定名称 parameterType="java.lang.Integer"
        第二个用法:mybatis定义的java类型的别名 parameterType="intinteger"

        mybatis通过反射机制可以获取 dao 接口方法的参数类型,即parameterType可以不写
    -->
    <select id="selectById" parameterType="integer"
            resultType="com.bjpowernode.entity.Student">
        select id,name,email,age from student where id=#{studentId}
    </select>
    @Test
    public void testSelectById() {
        //1.获取SqlSession
        SqlSession session = MyBatisUtil.getSqlSession();
        //2.获取dao的代理
        StudentDao studentDao=session.getMapper(StudentDao.class);
        Student student=studentDao.selectById(1003);
        System.out.println("student = " + student);
        //3.关闭SqlSession对象
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

2.2 dao接口的方法形参列表中只有一个参数(重要!!!)

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;

import java.util.List;

/**
 *
 */
public interface StudentDao {

    //dao接口的方法形参是一个简单类型
    //简单类型:java基本数据类型和String
    Student selectByEmail(String email);

}
    <!--
        dao接口是一个简单类型的参数(java 基本类型和 String)
        mapper文件获取这个参数值:使用 #{任意字符}
    -->
    <select id="selectByEmail" resultType="com.bjpowernode.entity.Student">
        select id,name,email,age from student where email=#{studentEmail}
    </select>
    @Test
    public void testOneParameter() {
        SqlSession session=MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        Student student=studentDao.selectByEmail("zhangsan@qq.com");
        System.out.println("email === " + student);
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

2.3 dao接口的方法形参列表中有多个参数(重要!!!)

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 *
 */
public interface StudentDao {

    /*
     *  多个简单类型的参数
     *  使用 @Param 命名参数,注解都是mybatis提供的
     *  位置:在形参定义的前面
     *  属性:value 自定义的参数名称
     */
    List<Student> selectByNameOrAge(@Param("myname") String name,
                                    @Param("myage") Integer age);

}
    <!--
        多个简单类型的参数
        当你使用了 @Param 命名后,例如 @param("myname")
        在mapper中,使用 #{命名的参数},即 #{myname}
    -->
    <select id="selectByNameOrAge" resultType="com.bjpowernode.entity.Student">
        select id,name,email,age from student where name=#{myname} or age=#{myage}
    </select>
    @Test
    public void testSelectByNameOrAge() {
        SqlSession session=MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        List<Student> students=studentDao.selectByNameOrAge("张三",20);
        students.forEach( stu-> System.out.println("stu = " + stu));
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

2.4 dao接口的方法形参列表中使用entity实体类对象(重要!!!)

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;

import java.util.List;

/**
 *
 */
public interface StudentDao {

    /*
     *  一个java对象作为参数(对象有属性,每个属性有set、get方法)
     */
    List<Student> selectByObject(Student student);

}
<!--
    一个java对象作为方法的参数,使用对象的属性作为参数值
    简单的语法:#{属性名},mybatis调用此属性的getXXX()方法
-->
<select id="selectByObject" resultType="com.bjpowernode.entity.Student">
    select id,name,email,age from student where name=#{name} or age=#{age}
</select>

<!--
    也可以写成下面这种复杂的更详细的格式:
    javaType=java中数据类型名
    jdbcType=数据库中数据类型名称
-->
<select id="selectByObject" resultType="com.bjpowernode.entity.Student">
    select id,name,email,age
    from student
    where name=#{name,javaType=java.lang.String,jdbcType=VARCHAR} or
          age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}
</select>
    @Test
    public void testSelectByObject() {
        SqlSession session=MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        Student student=new Student();
        student.setName("张三");
        student.setAge(20);
        List<Student> students=studentDao.selectByObject(student);
        students.forEach( stu-> System.out.println("stu = " + stu));
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

2.5 dao接口的方法形参列表中使用自定义类对象(重要!!!)

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

package com.bjpowernode.vo;

/**
 *
 */
public class QueryParam {
    private Object p1;
    private Object p2;

    public Object getP1() {
        return p1;
    }

    public void setP1(Object p1) {
        this.p1 = p1;
    }

    public Object getP2() {
        return p2;
    }

    public void setP2(Object p2) {
        this.p2 = p2;
    }
}
package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;
import com.bjpowernode.vo.QueryParam;

import java.util.List;

/**
 *
 */
public interface StudentDao {

    List<Student> selectByQueryParam(QueryParam param);
}
<select id="selectByQueryParam" resultType="com.bjpowernode.entity.Student">
    select id,name,email,age from student where name=#{p1} or age=#{p2}
</select>
    @Test
    public void testSelectByObject2() {
        SqlSession session=MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        QueryParam param=new QueryParam();
        param.setP1("李四");
        param.setP2(15);
        List<Student> students=studentDao.selectByQueryParam(param);
        students.forEach( stu-> System.out.println("stu = " + stu));
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

2.6 dao接口的方法形参列表中按位置传递参数(不推荐!!!)

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;

import java.util.List;

/**
 *
 */
public interface StudentDao {

    //使用位置获取参数
    List<Student> selectByPosition(String name,Integer age);

}
<!--
    使用位置获取参数值,dao接口方法是多个简单类型的参数
    语法:#{arg0},#{arg1}...
-->
<select id="selectByPosition" resultType="com.bjpowernode.entity.Student">
    select id,name,email,age from student where name=#{arg0} or age=#{arg1}
</select>
    @Test
    public void testSelectByPosition() {
        SqlSession session=MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        List<Student> students=studentDao.selectByPosition("张三",15);
        students.forEach( stu-> System.out.println("stu = " + stu));
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

2.7 dao接口的方法形参列表中按Map传递参数(不推荐!!!)

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;

import java.util.List;
import java.util.Map;

/**
 *
 */
public interface StudentDao {

    //使用Map作为参数
    List<Student> selectStudentByMap(Map<String,Object> map);
}
<!--
    使用Map传递参数
    在mapper文件中,获取map的值,是通过key获取的,语法:#{key}
-->
<select id="selectStudentByMap" resultType="com.bjpowernode.entity.Student">
    select id,name,email,age from student where name=#{myname} or age=#{myage}
</select>
    @Test
    public void testSelectByMap() {
        SqlSession session=MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        Map<String,Object> map=new HashMap<>();
        map.put("myname","张三");
        map.put("myage",20);
        List<Student> students=studentDao.selectStudentByMap(map);
        students.forEach( stu-> System.out.println("stu = " + stu));
        session.close();
    }

MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)

 


写在结尾

本文地址:https://blog.csdn.net/weixin_43823808/article/details/114260491

相关标签: # MyBatis