MyBatis基础用法--SQL映射文件

我就是我 2023-03-06 10:36 53阅读 0赞

目录

MyBatis中的CRUD

MyBatis中的参数处理

单个基本类型参数

多个基本类型参数

传入Map或POJO参数

集合类参数

#{}与${}取值对比

返回List和Map类型


在上一章《MyBatis基础用法—HelloWorld》中我们搭建了一个MyBatis的HelloWorld项目,对如何在项目中使用MyBatis有了一个初步的认识。

这一章我们延续上一章,对如何编写Mapper配置文件进行简单介绍,代码中所用到的ClassEntity和StudentEntity两个实体类请参照上一章节。

MyBatis中的CRUD

在MyBatis中,对数据进行CRUD使用以下四个标签:insertselectupdatedelete,对于增删改操作,MyBatis会将操作所影响的数据库记录条数封装为结果返回,可以返回如下类型:Long(long)Integer(int)Boolean(boolean)Void(void)

以对班级的CRUD为例:

  1. //新建班级
  2. public boolean insertClass(ClassEntity classEntity);
  3. <!-- useGeneratedKeys 使用主键自增策略 -->
  4. <!-- keyProperty 将获取到的自增主键值赋值给Java对象的classId属性 -->
  5. <!-- keyColumn 将获取到的自增主键值赋值给数据库的CLASS_ID字段 -->
  6. <insert id="insertClass" parameterType="org.mybatis.entity.ClassEntity"
  7. useGeneratedKeys="true" keyProperty="classId" keyColumn="CLASS_ID">
  8. insert into
  9. tbl_class(CLASS_NAME) values(#{className})
  10. </insert>
  11. //查询班级
  12. public ClassEntity selectClassById(Long classId);
  13. <select id="selectClassById" parameterType="long"
  14. resultType="org.mybatis.entity.ClassEntity">
  15. select CLASS_ID
  16. classId,CLASS_NAME className from tbl_class
  17. where
  18. CLASS_ID=#{classId}
  19. </select>
  20. //更新班级
  21. public int updateClass(ClassEntity classEntity);
  22. <update id="updateClass" parameterType="org.mybatis.entity.ClassEntity">
  23. update tbl_class set
  24. CLASS_NAME=#{className} where CLASS_ID=#{classId}
  25. </update>
  26. //删除班级
  27. public long deleteClassById(Long classId);
  28. <delete id="deleteClassById" parameterType="long">
  29. delete from tbl_class where CLASS_ID=#{classId}
  30. </delete>

MyBatis中的参数处理

单个基本类型参数

对于操作方法中传入单个基本类型参数的情况,例如上例中的查询班级方法,MyBatis不会做任何特殊处理,直接使用 #{ 任意变量名 } 均可获取到该参数的值。

多个基本类型参数

对于操作方法中传入多个基本类型参数的情况,例如下面这个根据班级Id和学生性别来统计学生人数的方法,MyBatis会自动将这些参数按照其传入的先后顺序封装到一个Map中,Map的keyparam1…paramN

  1. // 根据班级ID和学生的性别统计学生人数
  2. // @Param注解用来指定参数在Map中所对应的key
  3. public int selectCountByParams(@Param("classId") Long classId,
  4. @Param("studentGender") String studentGender);
  5. <select id="selectCountByParams" resultType="int">
  6. select
  7. count(STUDENT_ID) from tbl_student where CLASS_ID=#{classId} and
  8. STUDENT_GENDER=#{studentGender}
  9. </select>

这种情况,可以通过以下三种方式来获取参数值:
1.使用 #{ paramN } 来获取第N个参数的值;
2.使用 #{ n } 来获取索引为n的参数的值,此时 n 从 0 开始;
3.使用@Param注解来指定参数在Map中所对应的key,并使用 #{ key }来获取对应的值,如示例所示;

传入Map或POJO参数

在参数较多的情况下推荐将参数值放入Map或POJO中进行传参,例如之前的班级更新接口就传入了一个班级POJO对象,可以直接通过 #{ 属性名 }来获取对象的属性值。

如果传入的多个参数不是业务模型中的数据,没有与之对应的POJO,为了方便我们也可以将其封装到一个Map进行传参,使用 #{ key } 来进行取值,例如下面这个查询示例。

  1. // 传入map进行查询
  2. public List<StudentEntity> selectStudentByMap(Map<String, Object> map);
  3. <!-- 查询出一个班中指定性别的所有学生 -->
  4. <select id="selectStudentByMap" parameterType="map"
  5. resultType="org.mybatis.entity.StudentEntity">
  6. select STUDENT_ID
  7. studentId,STUDENT_NAME
  8. studentName,STUDENT_GENDER studentGender,
  9. STUDENT_BIRTHDAY
  10. studentBirthday,STUDENT_AGE studentAge,CLASS_ID
  11. classId from
  12. tbl_student where CLASS_ID =
  13. #{classId} and STUDENT_GENDER
  14. =#{studentGender}
  15. </select>

如果多个参数不是业务模型中的数据,却要经常用到,推荐创建一个TO(Transfer Object)数据传输对象来传参,例如分页查询中的分页TO。

集合类参数

如果方法中传入了集合类型(List、Set)或者数组类型的参数,MyBatis也会做特殊处理,将传入的集合或者数组封装到Map中,集合类型参数的key为collection,数组类型的key为array

此外List还可以使用 list 作为key来获取值,例如下面这个根据id集合来查询学生的接口。

  1. // 传入List进行查询
  2. public List<StudentEntity> selectStudentByList(List<Long> ids);
  3. <select id="selectStudentByList" parameterType="list"
  4. resultType="org.mybatis.entity.StudentEntity">
  5. select STUDENT_ID studentId,STUDENT_NAME studentName,STUDENT_GENDER
  6. studentGender,
  7. STUDENT_BIRTHDAY studentBirthday,STUDENT_AGE
  8. studentAge,CLASS_ID classId from
  9. tbl_student where STUDENT_ID in
  10. <foreach collection="list" index="index" item="item"
  11. open="(" close=")" separator=",">
  12. #{item}
  13. </foreach>
  14. </select>

#{}与${}取值对比

#{}是以预编译的形式将参数设置到sql语句中,可以有效地防止sql注入,一般情况下我们都应当使用#{}来取值。

${}多用于在某些原生jdbc不支持占位符的地方取值(比如:表名、排序字段),例如以下映射语句。

  1. <select id="selectClass" parameterType="string"
  2. resultType="org.mybatis.entity.ClassEntity">
  3. select CLASS_ID
  4. classId,CLASS_NAME className from ${ tableName }
  5. </select>

返回List和Map类型

使用MyBatis返回List类型的结果非常容易,只需将select标签中的resultType属性的值设置为List中将要存放的元素的类型即可,MyBatis会自动将查询结果中的每一条记录都自动映射成这种类型的对象。

  1. // 查询班级,返回ClassEntity的List集合
  2. public List<ClassEntity> selectClassReturnList();
  3. <select id="selectClassReturnList" resultType="org.mybatis.entity.ClassEntity">
  4. select
  5. CLASS_ID
  6. classId,CLASS_NAME className from tbl_class
  7. </select>
  8. // 查询班级,返回Map的List集合
  9. public List<Map<String, Object>> selectClassReturnListOfMap();
  10. <select id="selectClassReturnListOfMap" resultType="map">
  11. select
  12. CLASS_ID
  13. classId,CLASS_NAME className from tbl_class
  14. </select>

如果想要把返回的对象集合封装到一个Map中,类似Map这种类型,可以使用@MapKey注解来指定使用对象中的哪一个属性值来作为Map的key。

  1. // 查询班级,返回Map
  2. @MapKey("classId")
  3. public Map<Long, ClassEntity> selectClassReturnMap();
  4. <select id="selectClassReturnMap" resultType="org.mybatis.entity.ClassEntity">
  5. select
  6. CLASS_ID
  7. classId,CLASS_NAME className from tbl_class
  8. </select>
  9. // 按ID查询班级,返回Map
  10. public Map<String, Object> selectClassByIdReturnMap(Long classId);
  11. <select id="selectClassByIdReturnMap" parameterType="long"
  12. resultType="map">
  13. select CLASS_ID
  14. classId,CLASS_NAME className from tbl_class
  15. where
  16. CLASS_ID=#{classId}
  17. </select>

发表评论

表情:
评论列表 (有 0 条评论,53人围观)

还没有评论,来说两句吧...

相关阅读