Spring Boot (10) mybatis三种动态sql
脚本SQL
xml配置方式见mybatis讲解,下面是用<script>的方式把它照搬过来,用注解来实现。适于xml配置转换到注解配置
@Select("<script>select * from cat <if test=\"id != null \"> where id = #{id} </if></script>")
List<Cat> fintCatById(Cat param);
很明显,在java中写xml可读性和维护性太差,尤其 当sql很长时,这样写是很痛苦的。
在方法中构建SQL
dao接口中是不能写实现的,所以这里借用内部类来生成动态sql。增删改也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider
//使用CatDaoProvider类中的findCatById方法 来生成sql
@SelectProvider(type=CatDaoProvider.class,method = "findCatById")
List<Cat> findCatById(Cat cat); class CatDaoProvider{
public String findCatById(Cat cat){
String sql = "select * from Cat";
if(cat.getId() != null){
sql += " where id = #{id} ";
}
return sql;
}
}
这种方法比<script>更加清晰,适用于查询语句不是很长、条件不多的场景,sql很直观。但是在写很长的sql时,这样拼接sql同样很痛苦。
结构化SQL
class CatDaoProvider{
public String findUserById(Cat cat) {
return new SQL(){{
SELECT("id,cat_name,cat_age");
FROM("cat");
if(cat.getId() != null){
WHERE("id = #{id}");
}
if(cat.getCatName() != null){
WHERE("cat_name != #{catName}");
}
}}.toString();//内部使用高效的StringBuilder实现sql拼接
}
}
把前面的内部类改造一下
SELECT:表示 要查询的字段,如果一行写不完,可以在第二行再写一个SELECT,这两个SELECT 会只能的进行合并而不会重复。
FROM和WHERE:跟SELECT一样,可以写多个参数,也可以在多行重复使用,最终会智能合并而不会报错
这样的语句很适合写很长的sql,能够保证代码结构清楚,便于维护,可读性高。但是这种自动生成的sql和hibernate一样,在实现一些复杂语句的sql时会束手无策。
List传值错误
动态sql中,有时要对批量数据进行处理,难免会使用list作为参数
@SelectProvider(type=CatDaoProvider.class,method = "find")
List<Map> find(List list);
传递list参数时,在运行时会报传参错误,这是mybatis内部机制造成的,其参数需要是key/value结构,当遇到这里不是Key/value结构的list时,mybatis会自动把它转换成key、value结构,key就是他的名字"list" ,value就是他的值 list,要正确传参需要使用key/value结构的map:
@SelectProvider(type=CatDaoProvider.class,method = "find")
List<Map> find(List list); class CatDaoProvider{
public String find(Map map) {
List list = (List) map.get("list");
Spring Boot (10) mybatis三种动态sql的更多相关文章
- spring boot(8)-mybatis三种动态sql
脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...
- Spring boot 配置 mybatis xml和动态SQL 分页配置
更新时间 2018年4月30日23:27:07 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...
- spring boot-mybatis三种动态sql(5)
脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...
- Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式
我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...
- spring boot 配置mybatis plus 控制台打印sql
spring boot 版本2.1.5 mybatis plus 版本3.1.1 aplication.properties中添加 logging.level.com.demo.system.mapp ...
- Spring boot配置Dubbo三种方式
方式一 使用注解的方式 导入dubbo-starter 在application.properties配置属性 使用@Service暴露服务 使用@Reference引用服务 使用@EnableDub ...
- Spring Boot 实战 —— MyBatis(注解版)使用方法
原文链接: Spring Boot 实战 -- MyBatis(注解版)使用方法 简介 MyBatis 官网 是这么介绍它自己的: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过 ...
- Spring Boot将Mybatis返回结果转为驼峰的三种实现方式
本文不再更新,可能存在内容过时的情况,实时更新请访问原地址:Spring Boot将Mybatis返回结果转为驼峰的三种实现方式: 我们通常获取Mybatis返回的数据结果时想要将字段以驼峰的形式返回 ...
- spring与mybatis三种整合方法
spring与mybatis三种整合方法 本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可通过链接 http://code.googl ...
随机推荐
- Unity中确定时间是否在一定范围内
NowTime = DateTime.Now.ToLocalTime(); Timeyear = DateTime.Now.ToLocalTime().ToString("yyyy-MM-d ...
- css 样式 解释
字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 {font-style: obl ...
- RESTful API 学习【第1篇】
一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...
- (C/C++学习)7.数组及其访问方式
说明:数组的数据类型是一种构造类型,而存储数组的内存是一段连续的存储区域.数组的数据类型决定了连续内存的访问方式,它包括数组的三要素:起始地址.步长以及元素个数. 一.一维数组 1.形式:type 数 ...
- MySQL的分组和排序
分组操作 select count(id) from userinfo group by pat(id); -- 聚合函数: --count --max --sum --avg ---如果对于二次函数 ...
- hdu 3500 DFS(限定)
Fling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submi ...
- Spring整合Junit框架进行单元测试Demo
一.开发环境 eclipse版本:4.6.1 maven版本:3.3.3 junit版本:4.12 spring版本:4.1.5.RELEASE JDK版本:1.8.0_111 二.项目结构 图 三. ...
- 敏捷开发系列学习总结(2)——Bug修改流程
原则,力求各司其职,简单明了. 1. 测试人员提交bug ⑴ 标题: [ 模块名称 ] 问题描述 ⑵ 内容: 问题重现步骤的描述,最好贴上图片. 因为一图胜万言. ⑶ 指定责任人: 根据bug指定责任 ...
- 中缀表达式转逆波兰式(后缀表达式)求值 C++ Stack
给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'(' push else if 字符为 ')' 出栈运算符直到遇到‘(' else if ...
- 相克军_Oracle体系_随堂笔记 PPT
http://www.cnblogs.com/jyzhao/category/581259.html http://download.csdn.net/detail/yzj149286454/8960 ...