mybatis的XML使用记录

mac2022-06-30  26

一. 前言

小熙之前使用的是mybatis的注解开发,加上通用mapper开发效率简直不要太快。目前工作因为业务复杂,功能需求大多相似和重复等,所以一直使用的是XML开发,使用了一段时间其动态的灵活性和一些特殊的玩法,让小熙大开眼界,其实每种方法都有其独特的优势,只是所需发挥的场景不尽相同而已,下面就来分享下吧。

二. Mybatis 来源简介

MyBatis 本是 Apache 的一个开源项目——iBatis,2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为 MyBatis。

MyBatis 是一个基于 Java 的持久层框架。MyBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。

MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

三. XML 常用标签属性简介

查询语句SQL

<select id="getNos" resultMap="CreditCertificationNo"> SELECT cca.ID, cca.NO FROM CREDIT_CERTIFICATION_APPLY cca WHERE TO_CHAR(cca.APPLY_DATE_TIME,'dd') = TO_CHAR(sysdate,'dd') </select> <resultMap id="CreditCertificationNo" type="com.supwisdom.eams.creditcertification.certification.model.domain.model.CreditCertificationApplyModel" autoMapping="true"> <id property="id" column="id"/> <id property="no" column="NO"/> </resultMap>

这里小熙没有举例多表连接(例如左连接,老生常谈的使用),而选取了一个日期函数转换的新奇玩法分享下。 (注意:这里的resultMap映射结果集其中的映射要全有,不然会报错,小熙出现过一次这个错误尴尬了好一会)

插入语句SQL

<insert id="insertStudentRangeProperty"> INSERT INTO CERTIFICATION_STUDENT_RANGE(CREDIT_CE_SWITCH_ID, MUST_IN_SCHOOL, MUST_ZAI_JI, RANGE_TYPE ) VALUES (#{switchId},#{studentRange.mustInSchool}, #{studentRange.mustZaiJi},#{studentRangeType}) </insert>

更新语句SQL

<update id="updateStudentRangeProperty"> update CERTIFICATION_STUDENT_RANGE set MUST_IN_SCHOOL = #{studentRange.mustInSchool}, MUST_ZAI_JI = #{studentRange.mustZaiJi} where CREDIT_CE_SWITCH_ID = #{switchId} and RANGE_TYPE = #{studentRangeType} </update>

删除语句SQL

<delete id="deleteStdBlacks"> DELETE FROM CERTIFICATION_STD_BLACK WHERE CREDIT_CE_SWITCH_ID = #{switchId} AND RANGE_TYPE = #{studentRangeType} AND student_id IN <foreach collection="studentIds" index="index" item="studentId" open="(" separator="," close=")"> #{studentId} </foreach> </delete>

四. 特殊玩法

一次插入多条数据 (Oracle数据库例子)

(1)mapper 接口抒写:

int insertStdWhite(@Param("switchId") Long switchId, @Param("studentIds") Long[] studentIds, @Param("studentRangeType") String studentRangeType);

(2)XML 抒写

<insert id="insertStdWhite"> INSERT ALL <foreach collection="studentIds" item="studentId"> INTO CERTIFICATION_STD_WHITE (CREDIT_CE_SWITCH_ID, STUDENT_ID, RANGE_TYPE) VALUES (#{switchId}, #{studentId}, #{studentRangeType}) </foreach> select * from dual </insert>

不同于普通的插入, insert all into 表示多表插入,这里的表也可以是同一张表,所以就可以造成一张表插入多条数据的情况,而后面那个查询伪表的含义,个人理解是多表各自插入后返回子查询的一条记录即可,这项看起来就相当于对一张表进行多条数据的插入。

(注意:一次多个表多条数据插入也是可以的,同样在中间 foreach 循环即可)

<insert id="insertStudentRangeSet"> INSERT all <foreach collection="studentRange.cultivateTypeAssocSet" item="cultivateTypeAssoc"> INTO CERTIFICATION_CULTIVATE_TYPE (CREDIT_CE_SWITCH_ID, CULTIVATE_TYPE_ID, RANGE_TYPE) VALUES (#{switchId}, #{cultivateTypeAssoc.id}, #{studentRangeType}) </foreach> <foreach collection="studentRange.stdStatusAssocSet" item="stdStatusAssoc"> INTO CERTIFICATION_STD_STATUS (CREDIT_CE_SWITCH_ID, STD_STATUS_ID, RANGE_TYPE) VALUES (#{switchId}, #{stdStatusAssoc.id}, #{studentRangeType}) </foreach> select * from dual </insert>

一次插入多条数据 (MySQL数据库例子)

INSERT INTO book(id, bookname, price) VALUES (9, 'newBook', 2), (10, 'newBook', 3),(11, 'newBook', 4),(12, 'newBook', 5);

其实MySQL的多条插入要比Oracle的简单的多,就是在正常的插入值后面接着写就好了。当然小熙这是直接在数据库写的语句,您也可以在注解上拼接动态SQL标签或者关联动态sql类。

按序插入和获取 (Oracle数据测试, MySQL加上动态标签同理)

小熙在开发时,有一个需求要按序插入按序取出,如果要从前台开始记录顺序的话,中间太麻烦。所以小熙利用 list 集合的有序性直接在数据库层操作,如下所示。

(1) 插入

<insert id="insertOtherAchievement"> INSERT ALL <foreach collection="otherAchievementIds" item="otherAchievementId" index="index"> INTO CE_OTHER_ACHIEVEMENT (CREDIT_CE_APPLY_ID, OTHER_ACHIEVEMENT_ID, INDEX_NO) VALUES (#{applyId}, #{otherAchievementId}, #{index}) </foreach> select * from dual </insert>

注意到小熙的这次的多条插入多了一个属性: index,这也是小熙联想到之前写 JSTL 表达式的时候的联想,这个属性的含义代表从零开始计数的数字,完全可以按此来排序。

(2) 获取

<select id="getOtherAchievementAssocList" resultMap="otherAchievementApply.OtherAchievementApplyAssoc"> SELECT * FROM CE_OTHER_ACHIEVEMENT WHERE CE_OTHER_ACHIEVEMENT.CREDIT_CE_APPLY_ID = #{applyId} ORDER BY CE_OTHER_ACHIEVEMENT.INDEX_NO DESC </select>

如上例所示,根据 index 插入的字段排序取出即可,这里小熙是降序取出,升序是 ASC

查询数据库中所有表名 (1) Mysql

show tables;

(2)Oracle

SELECT DISTINCT a.OWNER 用户名, a.TABLE_NAME 表名 FROM sys.all_col_comments a, sys.dba_objects b WHERE a.table_name=b.object_name AND b.object_type='TABLE' AND a.OWNER = 'TEST' ORDER BY a.OWNER, a.TABLE_NAME;

注意: 其中 a.OWNER 条件是过滤不是设置内容用户的表名,如果不加这个过滤条件则查全部用户下所有表的名称。

这里小熙选择只显示 TEST 用户下所有的表名。

后续如果还有其他特殊的玩法再更新。

最新回复(0)