原文始发于:05.Mybatis sql 片段重用
1. sql 重用标签
Mybatis 提供了sql 标签和include 标签, 用于sql 片段的重用
1.1 sql 标签
- sql 标签中不能通过#{}来引用参数, 因为#{} 是处理占位符参数的
- sql 标签中只能使用${} 接收引用时传入的参数, ${} 表示的是字符串替换
- ${} 可获取接口传入的或自定义的参数(include 标签中定义的参数)
- sql 标签中可以使用if, choose 等标签
<sql id="columns_query"> ${alias}.id,${alias}.username,${alias}.password </sql>
1.2 include 标签
- include 标签用于引用自定义的sql 片段, 可以嵌套在任何sql语句的任何位置
- refid: 指的是引用sql片段的id
- property 属性: 自定义参数, value 可使用ognl 表达式
<include refid="columns_query"> <property name="alias" value="emp"/> </include>
2. sql 片段应用
2.1 抽离全部字段
<-- sql片段定义: 定义所有的字段 --> <sql id="columns_full"> id, name, sex, age, entryDate, ${} </sql> <!-- sql 片段引用: 引用所有字段 --> <select id="queryAll" resultType="EmployeePO"> select <include refid="colunms_full"/> from t_employee </select>
2.2 抽离字段, 自定义表别名
- 为表自定义别名emp, 查询的字段就都应通过别名.字段访问
- ${}表示直接进行字符串替换, 不表示对象的引用.
<-- sql片段定义: 定义所有的字段 --> <sql id="columns_query"> ${alias}.id, ${alias}.name, ${alias}.sex, ${alias}.age, ${alias}.entryDate </sql> <!-- sql 片段引用: 引用所有字段 --> <select id="queryAll" resultType="EmployeePO"> select <include refid="columns_query"> <property name="alias" value="emp"/> </include> from t_employee emp </select>
2. 分表表名
- createYear 参数为接口定义时传入的参数
- 接口定义
<!-- sql 片段定义: 定义动态表名, createYear 为接口传入参数 --> <sql id="tableName"> t_employee_${createYear} </sql> <!-- sql 片段引用: 引用标明, 不传入动态参数 --> <select id="queryAll" resultType="EmployeePO"> select * from <include refid="tableName"/> </select>