有关mybatis的动态sql
一般地,实现动态SQL都是在xml中使用等标签实现的.
我们在这里使用SQL构造器的方式, 即由abstract sql写出sql的过程, 当然感觉本质上还是一个StringBuilder, 来手动生成SQL, 只不过不需要使用sql mapping
例子 :
Model类
package lyb.model.report;
/**
* Created by lyb-pc on 17-7-19.
*/
public class UserCustomerAuthority {
private String login_code;
private String login_name;
private String store_code;
private String store_name;
public String getLogin_code() {
return login_code;
}
public void setLogin_code(String login_code) {
this.login_code = login_code;
}
public String getLogin_name() {
return login_name;
}
public void setLogin_name(String login_name) {
this.login_name = login_name;
}
public String getStore_code() {
return store_code;
}
public void setStore_code(String store_code) {
this.store_code = store_code;
}
public String getStore_name() {
return store_name;
}
public void setStore_name(String store_name) {
this.store_name = store_name;
}
}
对应于一个sqlbuilder 有:
package lyb.model.report;
import org.apache.ibatis.jdbc.SQL;
import java.sql.Timestamp;
import java.util.Map;
/**
* Created by lyb-pc on 17-7-19.
*/
public class UserCustomerAuthoritySqlBuilder {
public String buildUserCustomerAuthorityFull(Map<String, Object> parameters) {
String user_id = (String) parameters.get("user_id");
SQL a = new SQL().SELECT("user_id",
"user_name",
"customer_id",
"customer_name")
.FROM("WCC_User_Customer_Connection")
.WHERE("user_id = #{user_id}")
.GROUP_BY("customer_name",
"user_id",
"user_name",
"customer_id");
return a.toString();
}
}
这里使用SQL()构造器的语法, 把所有的原始sql转化为相应的语句, 可以动态根据参数来进行配置, 如这里的user_id就是使用了一个占位符, 在真正执行语句的时候传递给jdbc. 可以将SQL()部分作为一个StringBuilder来使用, 需要使用占位符的时候就使用#{}, 这样的模式, 在最后执行的时候会把参数进行匹配, 并加上'', 也可以直接字符串拼接.
直接使用字符串拼接的如 like和in的使用:
if (invFirstClass != null) {
a.WHERE("Inventory.cInvCode like " + "'" + invFirstClass + "%'");
}
if (invSecondClass != null) {
a.WHERE("Inventory.cInvCode like " + "'" + invSecondClass + "%'");
}
if (barcode != null) {
a.WHERE("Inventory.cInvAddCode = #{barcode}");
}
if (cDCCode != null) {
a.WHERE("DistrictClass.cDCCode = #{cDCCode}");
}
if (customer_id_list != null) {
a.WHERE("Customer.cCusCode in" + "(" + customer_id_list + ")");
}
SQL t = new SQL().SELECT("Count(*) as count")
.FROM("(" + a.toString() + ") as table_temp");
如上面的代码, 展示了like和in的用法, 也有子查询的用法, 即先用一个SQL(), 作为子查询然后一层层嵌套.
实际调用的时候是 :
建立一个Mapper文件, 作为sqlSession掉用时实例化的DAO层.
package lyb.mapper;
import lyb.model.report.UserCustomerAuthority;
import lyb.model.report.UserCustomerAuthoritySqlBuilder;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.SelectProvider;
import java.util.List;
/**
* Created by lyb-pc on 17-7-19.
*/
public interface UserCustomerAuthorityMapper {
@Results(id = "userCustomerAuthorityDefault123", value = {
@Result(property = "store_name", column = "customer_name"),
@Result(property = "store_code", column = "customer_id"),
@Result(property = "login_code", column = "user_id"),
@Result(property = "login_name", column = "user_name")
})
@SelectProvider(type = UserCustomerAuthoritySqlBuilder.class, method = "buildUserCustomerAuthorityFull")
public List<UserCustomerAuthority> getAuthority(@Param(value = "user_id") String user_id);
}
里面定义好查询结果的ResultMap, 以及使用的SqlProvider.
这样是把具体的sql实现代码给分散出来, 并且具体的代码也具有了一定的可移植性, 而不必直接编写sql的xml文件, 但是如果需要针对多数据源的切换还是需要不同的设置或者是切换语句等.
注意的是在mapper文件中, @Param的注解和sqlBuilder的对应关系.
调用为:
@RequestMapping(value = "/TestStoresListShow", method = RequestMethod.POST)
public @ResponseBody
UCCheckResponse storesListShow(@RequestBody UCCheckRequestParams params) {
UCCheckResponse response = new UCCheckResponse();
String login_code = params.getLogin_code();
SqlSession sqlSession = sessionFactory.openSession();
UserCustomerAuthorityMapper authorityMapper = sqlSession.getMapper(UserCustomerAuthorityMapper.class);
List<UserCustomerAuthority> authorityList = authorityMapper.getAuthority(params.getLogin_code());
// StringBuilder customer_id_list = new StringBuilder();
// customer_id_list = JohnsonReportHelper.GetCustomerIdListBuilder(authorityList, customer_id_list);
if (authorityList.size() == 0) {
response = (UCCheckResponse) JohnsonReportHelper.GenErrorResponse(response, 5002, "该用户没有对应门店数据权限");
return response;
}else {
response = (UCCheckResponse) JohnsonReportHelper.GenRightResponsePart(response);
response.setData(authorityList);
return response;
}
}
通过sqlSession得到Mapper对象, 就可以继续调用了.
有关mybatis的动态sql的更多相关文章
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- mybatis 使用动态SQL
RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- 使用Mybatis实现动态SQL(一)
使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面: *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...
- MyBatis探究-----动态SQL详解
1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...
- mybatis中的.xml文件总结——mybatis的动态sql
resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...
- mybatis.5.动态SQL
1.动态SQL,解决关联sql字符串的问题,mybatis的动态sql基于OGNL表达式 if语句,在DeptMapper.xml增加如下语句; <select id="selectB ...
- MyBatis的动态SQL详解-各种标签使用
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...
- 利用MyBatis的动态SQL特性抽象统一SQL查询接口
1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...
随机推荐
- CentOS6下安装Java jdk1.7.0_10和 maven
安装步骤如下: 1. 下载JDK7.0_10 (jdk-7u10-linux-i586.tar.gz) 地址: 2. 卸载系统自带的开源JDK 查看是否安装JDK rpm -qa | grep jav ...
- 基于Laravel框架的一个简单易学的微信商城(新手必学)
俗话说,麻雀虽小可五脏俱全呀! 今天分享的这个基于Laravel的小项目大概功能有这些: 1.实现会员登录.注册功能.数据双向验证功能.2.实现手机短信验证.邮件激活账号.邮件通知.3.ajax提交数 ...
- 7.20实习培训日志-Java基础程序设计结构
Java基础程序设计结构 在 Math 类中,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程,如果得到一个完全可预测的结果比运行速度更重要的话,那么就应该使用StrictMath类,它使用 ...
- SPOJ IAPCR2F 【并查集】
思路: 利用并查集/DFS都可以处理连通问题. PS:注意Find()查找值和pre[]值的区别. #include<bits/stdc++.h> using namespace std; ...
- 51nod1103(抽屉原理)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1103 题意:中文题诶- 思路:抽屉原理 对于两个数a, b, ...
- vijos1007 绕钉子的长绳子
P1007绕钉子的长绳子(https://vijos.org/p/1007) 背景 平面上有N个圆柱形的大钉子,半径都为R,所有钉子组成一个凸多边形. 现在你要用一条绳子把这些钉子围起来,绳子直径忽略 ...
- 洛谷P3190 [HNOI2007]神奇游乐园(插头dp)
传送门 大概是算第一道自己做出来的插头dp? (虽然都是照着抄板子的) (虽然有个地方死活没调出来最后只能看题解才发现自己错在哪里的) 我就当你们都会插头dp了…… 因为必须得是一条路径,所以扫描线上 ...
- 剑指Offer的学习笔记(C#篇)-- 树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 一 . 二叉树的概念 树形结构是一种典型的非线性结构,除了用于表示相邻关系外,还可 ...
- 理解SPI
SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时, ...
- JS高级学习历程-8
2 构造函数和普通函数的区别 两者本身没有实质区别,具体看使用 new 函数(); -------->构造函数 函数(); ---------> 普通函数 <!D ...