Mybatis中两个内置参数
不止是方法传递过来的参数可以被用来判断、取值等操作,mybatis默认还有两个内置参数:_parameter和_databaseId。
_parameter:代表整个参数。
单个参数:_parameter就是这个参数;
多个参数:参数会被封装为一个map;_parameter就是代表的这个map
_databaseId:如果配置了DatabaseIdProvider标签,那么_databaseId就是代表当前数据库的别名。如:oracle。
_parameter属性的实例
接口
public interface EmployeeMapperDynamicSQL{
public List<Employee> getEmpsTestInnerParameter(Employee employee);
}
映射文件
<select id="getEmpsTestInnerParameter" resultType="com.mybatis.bean.Employee">
<if test="_databaseId=='mysql'">
select * from tbl_employee
</if>
<if test="_databaseId=='oracle'">
select * from employees
</if>
</select>
测试
@Test
public void testInnerParam(){
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapperDynamicSQL mapper =
openSession.getMapper(EmployeeMapperDynamicSQL.class);
List<Empolyee> list =
mapper.getEmpsTestInnerParameter(new Employee());
for (Employee employee : list){
System.out.println(employee);
}
}finally{
openSession.close();
}
}
在Oracle下查询结果为
MySQL下数据查询
_databaseId属性实例
映射文件
<select id="getEmpsTestInnerParameter" resultType="com.mybatis.bean.Employee">
<if test="_databaseId=='mysql'">
select * from tbl_employee
<if test="_parameter!=null">
where last_name = #{_parameter.lastName}
</if>
</if>
<if test="_databaseId=='oracle'">
select * from employees
<if test="_parameter!=null">
where last_name = #{lastName}
</if>
</if>
</select>
bind标签实例
bind:可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值。
sql语句中,like 后面做模糊查询的时候是这样的 '%e%' ,如果不加%符号,则是精确查询。
如果只想传入值,而不写%,这种写法是不对的:
如果坚持这样修改,可以把 #{ } 替换为 ${ },就可以动态拼串了
测试结果
虽然这种做法能基本完成要求,但是这种操作并不安全,还是推荐用#{ } 取值。
就需要用到bind标签啦
name属性:拼串组合好的值的名称
value属性:要绑定成想要的样式的值
<select id="getEmpsTestInnerParameter" resultType="com.mybatis.bean.Employee">
<bind name="_lastName" value="'%'+lastName+'%'" />
<if test="_databaseId=='mysql'">
select * from tbl_employee
<if test="_parameter!=null">
where last_name like #{_lastName}
</if>
</if>
<if test="_databaseId=='oracle'">
select * from employees
<if test="_parameter!=null">
where last_name like #{lastName}
</if>
</if>
</select>
测试一下可知
如果把映射文件中的绑定的效果修改成如下,则意思是以一个字母开始,后面跟e再跟一串字母的模糊查询
这是查出来的效果
这是查出来的效果
对于模糊查询来说,还是建议在传值的时候带上% %。这样会比较灵活,不用修改配置文件。
与CRUD标签同级别的表情——sql标签
sql标签:抽取可重用的sql片段,方便后面引用。
1、sql抽取:经常要查询的列名,或者插入用的列名抽取出来方便引用
2、include标签:用来引用已经抽取的sql。还能在include标签内自定义一些属性,sql标签内部就能使用自定义的属性,取值只能使用 ${ },#{ }不能使用
<sql id="insertColumn">
<if test="_databaseId=='oracle'">
employee_id,last_name,email
</if>
<if test="_databaseId=='mysql'">
last_name,email,gender,d_id
</if>
</sql>
<insert id="addEmps" databaseId="oracle">
insert into employees(
<include refid="insertColumn"> </include>
)
<foreach collection="emps" item="emp" separator="union">
open="select employees_seq.nextval,lastName,email from employees"
close=")">
</foreach>
</insert>
<insert id="addEmps" databaseId="mysql">
insert into employees(
<include refid="insertColumn"> </include>
)
<foreach collection="emps" item="emp" separator=",">
(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
</foreach>
</insert>
测试结果,oracle字段判断正常