文档章节

MyBatis SQL注解 动态SQL语句

重城重楼
 重城重楼
发布于 2017/09/11 09:42
字数 1281
阅读 77
收藏 0
点赞 0
评论 0

有时候,我们需要在输入的标准下,创建动态的查的语言。MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建立动态语言和让MyBatis执行这些语言。

现在让我们来看一下如何使用@ SelectProvider来创建简单的SELECT映射的例子。创建一个TutorDynaSqlProvider.java类,带有findTutorByIdSql()的方法。

 

PS:  mysql数据进行batch处理的时候,数据库链接一定要修改增加rewriteBatchedStatements=true

 

[java] view plain copy

  1. package com.owen.mybatis.sqlproviders;  
  2. import org.apache.ibatis.jdbc.SQL;  
  3. public class TutorDynaSqlProvider  
  4. {  
  5. public String findTutorByIdSql(int tutorId)  
  6. {  
  7. return "SELECT TUTOR_ID AS tutorId, NAME, EMAIL FROM TUTORS  
  8. WHERE TUTOR_ID="+tutorId;  
  9. } }  

 

创建接口类TutorMapper.java.

[java] view plain copy

  1. @SelectProvider(type=TutorDynaSqlProvider.class,  
  2. method="findTutorByIdSql")  
  3. Tutor findTutorById(int tutorId);  

这里我们声明了@ SelectProvider去声明类和方法名,这个将会在SQL声明中执行。但是会用String来构造查询语句时,是困难的,也是容易出错了。所以MyBatis提供了SQL公用方法构造方法,不需要写出完整的String语句。让我们来看一下如何使用org.apache.ibatis.jdbc.SQL的公用方法。

[java] view plain copy

  1. package com.owen.mybatis.sqlproviders;  
  2. import org.apache.ibatis.jdbc.SQL;  
  3. public class TutorDynaSqlProvider  
  4. {  
  5. public String findTutorByIdSql(final int tutorId)  
  6. {  
  7. return new SQL() {{  
  8. SELECT("tutor_id as tutorId, name, email");  
  9. FROM("tutors");  
  10. WHERE("tutor_id="+tutorId);  
  11. }}.toString();  
  12. } }  

在SQL公用的函数中,我们需要构造适当的前缀和需要 的后缀。动态语句的SQL方法可以包含下面的任一参数:

1)        没有参数

2)        与同类型的接口方法的参数一样

3)        java.util.Map

如果SQL的查询不能够提供所依赖的参数,你可以使用无参的SQL方法。

[java] view plain copy

  1. public String findTutorByIdSql()  
  2. {  
  3. return new SQL() {{  
  4. SELECT("tutor_id as tutorId, name, email");  
  5. FROM("tutors");  
  6. WHERE("tutor_id = #{tutorId}");  
  7. }}.toString();  
  8. }  

这里我们并没有在我们的方法中定义参数,所以是一个无参的方法。

如果一个映射的接口方法只有一个参数,我们可以如下定义SQL的方法:

[java] view plain copy

  1. Tutor findTutorById(int tutorId);  

这里的findTutorById(int)的方法拥有一个输入的参数是int的类型。我们可以把findTutorBySql(int)方法作为SQL提供的方法。

[java] view plain copy

  1. public String findTutorByIdSql(final int tutorId)  
  2. {  
  3. return new SQL() {{  
  4. SELECT("tutor_id as tutorId, name, email");  
  5. FROM("tutors");  
  6. WHERE("tutor_id="+tutorId);  
  7. }}.toString();  
  8. }  

如果Mapper的接口拥有多个参数,我们可以运用java.util.Map的参数类型作为SQL方法提供。所以所有输入的参数都必须是map的类型,并且带有param1、param2等作为key的值,而输入的参数是value的值。你也可以输入的参数为0,1,2,3等作为key值。

[java] view plain copy

  1. @SelectProvider(type=TutorDynaSqlProvider.class,  
  2. method="findTutorByNameAndEmailSql")  
  3. Tutor findTutorByNameAndEmail(String name, String email);  
  4. public String findTutorByNameAndEmailSql(Map<String, Object> map)  
  5. {  
  6. String name = (String) map.get("param1");  
  7. String email = (String) map.get("param2");  
  8. //you can also get those values using 0,1 keys  
  9. //String name = (String) map.get("0");  
  10. //String email = (String) map.get("1");  
  11. return new SQL() {{  
  12. SELECT("tutor_id as tutorId, name, email");  
  13. FROM("tutors");  
  14. WHERE("name=#{name} AND email=#{email}");  
  15. }}.toString();  
  16. }  

SQL公用的方法也提供了多样的方法,如JOINS,ORDER_BY,GROUP_BY等。让我们来看一下使用LEFT_OUTER_JOIN的例子:

[java] view plain copy

  1. public class TutorDynaSqlProvider  
  2. {  
  3. public String selectTutorById()  
  4. {  
  5. return new SQL() {{  
  6. SELECT("t.tutor_id, t.name as tutor_name, email");  
  7. SELECT("a.addr_id, street, city, state, zip, country");  
  8. SELECT("course_id, c.name as course_name, description,  
  9. start_date, end_date");  
  10. FROM("TUTORS t");  
  11. LEFT_OUTER_JOIN("addresses a on t.addr_id=a.addr_id");  
  12. LEFT_OUTER_JOIN("courses c on t.tutor_id=c.tutor_id");  
  13. WHERE("t.TUTOR_ID = #{id}");  
  14. }}.toString();  
  15. } }  
  16. public interface TutorMapper  
  17. {  
  18. @SelectProvider(type=TutorDynaSqlProvider.class,  
  19. method="selectTutorById")  
  20. @ResultMap("com.owen.mybatis.mappers.TutorMapper.TutorResult")  
  21. Tutor selectTutorById(int tutorId);  
  22. }  

这里并没有使用一对多的注解,我们可以基于XML来配置<resultMap>和映射@ResultMap.

[html] view plain copy

  1. <mapper namespace="com.owen.mybatis.mappers.TutorMapper">  
  2. <resultMap type="Address" id="AddressResult">  
  3. <id property="id" column="addr_id"/>  
  4. <result property="street" column="street"/>  
  5. <result property="city" column="city"/>  
  6. <result property="state" column="state"/>  
  7. <result property="zip" column="zip"/>  
  8. <result property="country" column="country"/>  
  9. </resultMap>  
  10. <resultMap type="Course" id="CourseResult">  
  11. <id column="course_id" property="id"/>  
  12. <result column="course_name" property="name"/>  
  13. <result column="description" property="description"/>  
  14. <result column="start_date" property="startDate"/>  
  15. <result column="end_date" property="endDate"/>  
  16. </resultMap>  
  17. <resultMap type="Tutor" id="TutorResult">  
  18. <id column="tutor_id" property="id"/>  
  19. <result column="tutor_name" property="name"/>  
  20. <result column="email" property="email"/>  
  21. <association property="address" resultMap="AddressResult"/>  
  22. <collection property="courses"  
  23. resultMap="CourseResult"></collection>  
  24. </resultMap>  
  25. </mapper>  

使用这个动态的SQL语句,将会查找到教师的信息连带着教师的地址和教授的课程信息。

1. @InserProvider

我们可以创建动态的INSERT查询,使用@Insertprovider.

[java] view plain copy

  1. public class TutorDynaSqlProvider  
  2. {  
  3. public String insertTutor(final Tutor tutor)  
  4. {  
  5. return new SQL() {{  
  6. INSERT_INTO("TUTORS");  
  7. if (tutor.getName() != null) {  
  8. VALUES("NAME", "#{name}");  
  9. }  
  10. if (tutor.getEmail() != null) {  
  11. VALUES("EMAIL", "#{email}");  
  12. }  
  13. }}.toString();  
  14. } }  
  15. public interface TutorMapper  
  16. {  
  17. @InsertProvider(type=TutorDynaSqlProvider.class,  
  18. method="insertTutor")  
  19. @Options(useGeneratedKeys=true, keyProperty="tutorId")  
  20. int insertTutor(Tutor tutor);  
  21. }  

2. @UpdateProvider

     我们可以创建动态的UPDATE语句使用@UpdateProvider。

[java] view plain copy

  1. public class TutorDynaSqlProvider  
  2. {  
  3. public String updateTutor(final Tutor tutor)  
  4. {  
  5. return new SQL() {{  
  6. UPDATE("TUTORS");  
  7. if (tutor.getName() != null) {  
  8. SET("NAME = #{name}");  
  9. }  
  10. if (tutor.getEmail() != null) {  
  11. SET("EMAIL = #{email}");  
  12. }  
  13. WHERE("TUTOR_ID = #{tutorId}");  
  14. }}.toString();  
  15. } }  
  16. public interface TutorMapper  
  17. {  
  18. @UpdateProvider(type=TutorDynaSqlProvider.class,  
  19. method="updateTutor")  
  20. int updateTutor(Tutor tutor);  
  21. }  

3. @DeleteProvider

我们可以创建DELETEf动态语句,使用@DeleProvider

[java] view plain copy

  1. public class TutorDynaSqlProvider  
  2. {  
  3. public String deleteTutor(int tutorId)  
  4. {  
  5. return new SQL() {{  
  6. DELETE_FROM("TUTORS");  
  7. WHERE("TUTOR_ID = #{tutorId}");  
  8. }}.toString();  
  9. }  
  10. }  
  11. public interface TutorMapper  
  12. {  
  13. @DeleteProvider(type=TutorDynaSqlProvider.class,  
  14. method="deleteTutor")  
  15. int deleteTutor(int tutorId);  
  16. }  

4.总结

在前面的几个章节中,笔者主要向大家介绍是如何使用注解的方法来处理MyBatis的映射。所以这些知道其实是建立地XML的基础上的,只你理解了XML的使用,我们注解的使用不没的多大问题的。好的,到现在为止,MyBatis的基础用法基本上都已经介绍好的,下一章节,我们将会学习如何将MyBatis与Spring联合使用。源码下载:https://github.com/owenwilliam/mybatis.com.git

本文转载自:http://blog.csdn.net/owen_william/article/details/51815506

共有 人打赏支持
重城重楼
粉丝 2
博文 40
码字总数 12312
作品 0
南京
程序员
基于注解的Mybatis mapper 接口注意事项

原文:http://my.oschina.net/doctor2014/blog/411580 基于注解的Mybatis mapper 接口功能没有mapper xml配置文件丰富,而且动态sql语句的灵活性不能和xml配置相比。 这里只说一下基于注解的...

Beaver_
2015/05/06
6.3K
2
springboot之简洁集成mybatis

orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动态sql的mybatis,两者各有特点,在企业级系统开发中...

无语年华
05/22
0
0
Java面试----2018年MyBatis常见实用面试题整理

Java面试----2018年MyBatis常见实用面试题整理 1、什么是MyBatis? 答:MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。 2、讲下MyBatis的缓存 答:MyBatis的缓存分为一级缓存...

优惠券活动
04/29
0
0
Spring Boot干货系列:(九)数据存储篇-SQL关系型数据库之MyBatis的使用

     前言   上篇我们介绍了Spring Boot对传统JdbcTemplate的集成,这次换一下,介绍下Spring Boot中如何集成MyBatis。这里分别介绍注解方式以及XML方式的整合。喜欢哪种方式自己选择。...

后端编程嘟
2017/04/24
0
0
你还在用传统的 JDBC 持久化访问吗

原文出处:locality 前言 这里我会采用mybatis3.2做数据库的持久化,很多小伙伴或许还停留在老师的教导下,仍然停留在使用传统的JDBC持久化访问数据层。今天,我们来聊聊面向接口编程和怎么充...

locality
2017/12/17
0
2
MyBatis使用笔记

MyBatis MyBatis作为一个轻量的SQL映射框架,确实很简单,但是知识点挺多,实际使用中还是会有时想不起来某个标签该怎么写,所以整理了这篇文章,以备查询。由于MyBatis如此简单,使得这一篇...

楠木楠
2016/11/22
17
0
MyBatis基础学习:动态SQL和SQL语句构建器类

Mybatis介绍 MyBatis(http://www.mybatis.org/) 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可...

Jia
2016/09/22
1K
0
MyBatis注解Annotation介绍及Demo

MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置。MyBatis提供的一些基本注解如下表所示。 这些注解都是运用到传统意义上映射器接口中的方法、类或者方法参数中的。 今天主要...

zhao_xiao_long
2014/04/21
0
0
利用st_geometry进行图形叠加分析--结合mybatis

在上一遍利用stgeometry进行图形叠加分析文章的基础上,结合mybatis操作stgeometry,主要简单实现一下三个功能:利用st_geometry两个表之间图形表的叠加分析、WKT与图形表的叠加分析、将WKT...

2016/11/21
146
0
SQL 框架--jfire-sql

jfire-sql 是优秀强大的sql框架。以注解的方式将sql语句和方法进行解耦。使用效果上集合了mybatis和hibernate的各自优点。 支持动态sql,支持参数名称注入,支持动态字段名。如果数据库是mys...

eric_jfire
2015/12/17
774
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对基于深度神经网络的Auto Encoder用于异常检测的一些思考

一、前言 现实中,大部分数据都是无标签的,人和动物多数情况下都是通过无监督学习获取概念,故而无监督学习拥有广阔的业务场景。举几个场景:网络流量是正常流量还是攻击流量、视频中的人的...

冷血狂魔
2分钟前
0
0
并发设计之A系统调用B系统

A-->B A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。 比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付...

汉斯-冯-拉特
23分钟前
0
0
HTTP协议通信原理

了解HTTP HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务。 HTTP使用...

寰宇01
45分钟前
0
0
【Java动态性】之反射机制

一、Java反射机制简介

谢余峰
46分钟前
1
0
Centos 6.X 部署环境搭建

1.Linux学习笔记CentOS 6.5(一)--CentOS 6.5安装过程

IT追寻者
59分钟前
0
0
博客即同步至腾讯云+社区声明

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=8vy9bsmadbko...

xiaoge2016
今天
1
0
大数据教程(3.1):Linux系统搭建网络YUM源服务器

博主在前面的2.5章节讲述了linux系统本地YUM服务器的搭建和httpd轻量级静态网站服务器的安装,本节博主将为大家分享内网环境中搭建自己的网络YUM服务器的全过程。如果大家对本地YUM服务器还不...

em_aaron
今天
1
0
蚂蚁技术专家:一篇文章带你学习分布式事务

小蚂蚁说: 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务...

Java大蜗牛
今天
1
0
新的Steam应用将拓展服务项目

导读 未来几周,Steam将推出两个免费的应用程序Steam Link和Steam Video。这两个应用程序都旨在拓展Steam平台的业务和便利性。 即将开放的Steam Link应用程序最先提供了Android测试版,它将允...

问题终结者
今天
0
0
golang 第三方包的使用总结

golang 第三方包的安装的方法: 1. go get 安装 $ go get github.com/gin-gonic/gin 注意:执行go get 命令需要先安装git命令,并配置git全局变量。 2. 源码包安装 由于国内网络问题,很多时...

科陆李明
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部