文章目录:

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();
    }

    @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();
    }

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

2.深入理解相关参数

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();
    }

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();
    }

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();
    }

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();
    }

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

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();
    }

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();
    }

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();
    }

 

写在结尾

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