• MyBatis学习:MyBatis框架下执行SQL语句传递实体类参数


    1、本篇博客的背景和目的

    目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,建立了使用MyBatis和MySQL的Maven项目,解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。记录了dao层接口的实现以及为什么要实现它。记录了MyBatis动态代理和使用动态代理的要求以及使用了动态代理生成的实现类,记录了parameterType属性和它的使用。记录了MyBatis框架下执行SQL语句传递简单类型参数的方法。本篇博客记录传递实体类参数。

    2、我的上一篇博文

    上一篇博客记录的是关于传递简单类型参数的内容,感兴趣的读者可以前往查阅,链接如下所示:

    MyBatis学习:MyBatis框架下执行SQL语句传递基本类型参数_你是我的日月星河的博客-CSDN博客https://blog.csdn.net/weixin_46281472/article/details/126085102

    3、为什么会有传递实体类参数这个需求?

    原因一:实际业务需求的需要。比如说吧,对于一个系统,刚有用户注册,也就是提供了用户名和密码。之后他要修改个人资料,包括年龄,电话,邮箱,真实姓名,昵称等信息。编辑完以后保存,程序在后端是需要使用insert语句将数据写入到数据库的。由于字段比较多,如果使用上一篇博文中的一个参数一个参数表示的话,那么dao层接口方法该有多长啊!!!实在很麻烦!!那么可以将这些字段封装到一个类中,也就是创建一个这个类的对象,然后将这个对象直接作为参数传递给SQL语句就可以了。

    原因二:即使实际业务中没有上述所说的需求。那么当一条SQL语句中需要的参数太多的时候,我们也是可以将这些参数封装在一个类中,然后组成一个对象传递给SQL语句,尽管在业务逻辑上它们彼此之间没有关联。

    4、使用要求和示例代码

    使用要求只有一条:要求封装到一起组成的类中全部的属性都有get( )和set( )方法。MyBatis在背后是会调用get和set方法的。

    使用方法:封装成一个实体类以后,在mapper.xml文件中SQL语句的占位符处,直接使用实体类的属性名就可以引用传过来的对象实参

    dao层接口方法代码:

    1. package com.dcy.dao;
    2. import com.dcy.domain.Student;
    3. import org.apache.ibatis.annotations.Param;
    4. import java.util.List;
    5. public interface StudentDao {
    6. public Student selectById(Integer id);
    7. public List selectStudents();
    8. //测试将许多参数封装到一个实体类中
    9. public int insertStudent(Student student);
    10. //测试多个简单变量的情况
    11. public ListselectStudentByAgeOrEmail(@Param(value = "age")int age,@Param(value = "email")String email);
    12. }

    上面的代码可以看到,将一个Student类型的对象作为了形参。

    mapper.xml文件代码:

    1. mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.dcy.dao.StudentDao">
    5. <select id="selectById" resultType="com.dcy.domain.Student" parameterType="int">
    6. select id,name,email,age from student where id=#{studentId}
    7. select>
    8. <insert id="insertStudent" parameterType="com.dcy.domain.Student">
    9. insert into student values (#{id},#{name},#{email},#{age})
    10. insert>
    11. <select id="selectStudents" resultType="com.dcy.domain.Student">
    12. select * from student
    13. select>
    14. <select id="selectStudentByAgeOrEmail" resultType="com.dcy.domain.Student">
    15. select * from student where age=#{age} or email=#{email}
    16. select>
    17. mapper>

    最后的Student实体类和Main方法中的测试代码我就不粘贴了。Student实体类中注意所有属性都要有get和set方法。

    5、如果参数是两个或多个实体类对象怎么办呢?

    发挥一下想象,结合本篇博文和上一篇博文的内容,按照逻辑,MyBatis框架会怎么处理这种情况呢?

    是不是可以用上一篇博文中的@Param注解,然后在mapper.xml文件中使用  变量名.属性名  的形式引用实体类对象中的属性呢?

    确实是这样的!!!

    下面直接粘贴代码:

    dao层次接口中的方法如下所示:

    1. //测试多个实体类参数变量的情况
    2. public ListselectByMany(@Param(value = "student1")Student student1,@Param(value = "student2")Student student2);

    mapper.xml文件中的对应SQL标签代码:

    1. <select id="selectByMany" resultType="com.dcy.domain.Student">
    2. select * from student where age=#{student1.age} or age=#{student2.age}
    3. select>

    Main方法中的测试代码:

    1. package com.dcy;
    2. import com.dcy.dao.StudentDao;
    3. import com.dcy.domain.Student;
    4. import com.dcy.utils.MyBatisUtil;
    5. import org.apache.ibatis.session.SqlSession;
    6. import java.util.List;
    7. public class starter03 {
    8. public static void main(String[] args) {
    9. //测试多个实体类对象对象作为参数
    10. SqlSession sqlSession= MyBatisUtil.getSqlSession();
    11. StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
    12. Student student1=new Student();
    13. student1.setAge(21);
    14. Student student2=new Student();
    15. student2.setAge(25);
    16. List studentList = studentDao.selectByMany(student1, student2);
    17. System.out.println(studentList);
    18. }
    19. }

    程序运行结果正确,这里就不放运行结果了。

    6、我的下一篇博文

  • 相关阅读:
    3BHE003855R0001 UNS2882A 用于嵌入式/工业用途的人工智能盒
    大数据基础
    OpenHarmony系统编译环境
    【C语言】通讯录《静态内存版本》
    Empire(四)会话管理
    Prometheus 与 VictoriaMetrics对比
    leetcode53 -- 最大数组和
    宏定义_可变参数
    我这两年的CSDN博客创作经历
    各种类别免费、热门api接口分享
  • 原文地址:https://blog.csdn.net/weixin_46281472/article/details/126089273