没有合适的资源?快使用搜索试试~ 我知道了~
首页Mabatis中动态sql语句的写法
资源详情
资源评论
资源推荐
动态 SQL 语句
有些时候�sql 语句 where 条件中 需要一些安全判断 例如按某一条件查询时如果传� �
入的参数是空 此时查询出的结果很可能是空的 也许我们需要参数为空时 是查出� � �
全部的
信息。使用 Oracle 的序列、mysql 的函数生成 Id。这时我们可以使用动态 sql。
下文均采用 mysql 语法和函数 例如字符串链接函数� CONCAT�。
3.1 selectKey 标签
在 insert 语句中 在� Oracle 经常使用序列、在 MySQL 中使用函数来自动生成插入表的
主键 而且需要方法能返回这个生成主键。使用� myBatis 的 selectKey 标签可以实现这
个效
果。
下面例子 使用� mysql 数据库自定义函数 nextval('student')�用来生成一个 key�并把
他
设置到传入的实体类中的 studentId 属性上。所以在执行完此方法后 边可以通过这个�
实体
类获取生成的 key。
XML 代码
<!-- 插入学生 自动主键-->
<insert id="createStudentAutoKey"
parameterType="liming.student.manager.data.model.StudentEntity"
keyProperty="studentId">
<selectKey keyProperty="studentId" resultType="String" order="BEFORE">
select nextval('student')
</selectKey>
INSERT INTO STUDENT_TBL(STUDENT_ID,
STUDENT_NAME,
STUDENT_SEX,
STUDENT_BIRTHDAY,
STUDENT_PHOTO,
CLASS_ID,
PLACE_ID)
VALUES (#{studentId},
#{studentName},
#{studentSex},
#{studentBirthday},
#{studentPhoto, javaType=byte[], jdbcType=BLOB,
typeHandler=org.apache.ibatis.#{classId},
#{placeId})
</insert>
调用接口方法 和获取自动生成� key
Java 代码
StudentEntity entity = new StudentEntity();
entity.setStudentName("黎明你好");
entity.setStudentSex(1);
entity.setStudentBirthday(DateUtil.parse("1985-05-28"));
entity.setClassId("20000001");
entity.setPlaceId("70000001");
this.dynamicSqlMapper.createStudentAutoKey(entity);
System.out.println("新增学生 ID: " + entity.getStudentId());
selectKey 语句属性配置细节�
属性 描述 取值 默认
keyProperty selectKey 语句生成结果需要设置的属性。
resultType 生成结果类型�MyBatis 允许使用基本的数
据类型 包括� String 、int 类型。
order 1 � BEFORE�会先选择主键� 然后设置
keyProperty�再执行 insert 语句�
2�AFTER�就先运行 insert 语句再运行
selectKey 语句。
BEFORE
AFTER
statementType MyBatis 支持 STATEMENT�PREPARED 和
CALLABLE 的语句形式�
对应 Statement �
PreparedStatement 和 CallableStatement 响应
STATEMENT
PREPARED
CALLABLE
3.2 if 标签
if 标签可用在许多类型的 sql 语句中 我们以查询为例。首先看一个很普通的查询� �
XML 代码
<!—1.查询学生 list�like 姓名 -->
<select id="getStudentListLikeName" parameterType="StudentEntity"
resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName ,
jdbcType=VARCHAR}),'%')
AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}
</select>
但是此时如果 studentName 或 studentSex 为 null�此语句很可能报错或查询结果为空。
此时我们使用 if 动态 sql 语句先进行判断 如果值为� null 或等于空字符串 我们就不�
进行此
条件的判断 增加灵活性。�
参数为实体类 StudentEntity。将实体类中所有的属性均进行判断 如果不为空则执行�
判
断条件。
XML 代码
<!-- 2 select - if(判断参数) - 将实体类不为空的属性作为 where 条件 -->
<select id="getStudentList_if" resultMap="resultMap_studentEntity"
parameterType="liming.student.manager.data.model.StudentEntity">
SELECT ST.STUDENT_ID,
ST.STUDENT_NAME,
ST.STUDENT_SEX,
ST.STUDENT_BIRTHDAY,
ST.STUDENT_PHOTO,
ST.CLASS_ID,
ST.PLACE_ID
FROM STUDENT_TBL ST
WHERE
<if test="studentName !=null ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName,
jdbcType=VARCHAR}),'%')
</if>
<if test="studentSex != null and studentSex != '' ">
AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}
</if>
<if test="studentBirthday != null ">
AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}
</if>
<if test="classId != null and classId!= '' ">
AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}
</if>
<if test="classEntity != null and classEntity.classId !=null and classEntity.classId AND
ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}
</if>
<if test="placeId != null and placeId != '' ">
AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}
</if>
剩余11页未读,继续阅读
wenalone
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0