Mybatis中动态SQL标签和内置参数
一、MyBatis动态SQL
1.1、sql标签
sql标签用于抽取公用的SQL代码,定义sql标签的时候需要通过【id】属性设置唯一标识。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 动态SQL -->
<sql id="sqlDemo">
id,username,password
</sql>
</mapper>
1.2、include标签
include标签用于引用其他的sql代码块,上面介绍的sql标签是定义公共代码块,而include标签则是在其他地方引用公共代码块。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 动态SQL -->
<sql id="sqlDemo">
id,username,password
</sql>
<select id="query" parameterType="cn.js.domain.User" resultType="cn.js.domain.User">
select
<include refid="sqlDemo"></include>
from user
</select>
</mapper>
1.3、resultMap标签
resultMap标签用于定义sql表字段和java实体类属性的映射关系,resultMap标签中可以使用如下几个标签。
- id标签:用于指定主键。
- result标签:用于指定普通的实体字段属性映射关系。
- associate标签:一对一的关联查询。
- collection标签:一对多、多对多的关联查询。
id标签和column标签都有下面这些属性:
- column属性:用于指定数据库表字段名称。
- property属性:用于执行java实体类属性名称。
- jdbcType属性:数据库表字段的类型,可选。
- javaType属性:java实体类字段的类型,可选。
- typeHandler属性:定义jdbcType和javaType类型转换的处理器,可选。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 动态SQL -->
<resultMap id="resultMap" type="cn.js.domain.User">
<!-- id 标签: 用于指定主键 -->
<id column="id" property="id" jdbcType="INTEGER" javaType="Integer" typeHandler=""/>
<!-- column 标签: 用于定义数据库和java实体类的名称映射关系 -->
<result column="username" property="username"/>
<result column="password" property="password"/>
</resultMap>
</mapper>
定义resultMap标签之后,可以通过select标签的【resultMap】属性进行引用。
MyBatis中常见的数据类型映射关系如下所示:
jdbcType和javaType类型对应关系:
- INTEGER===》INTEGER
- DATE===》DATE
- BLOB===》BLOB
- (oracle中是NUMBER)(mysql中是DOUBLE)===》DOUBLE
- DECIMAL===》DECIMAL
- VARCHAR===》STRING
1.4、bind标签
bind标签是用于绑定参数的,它可以对输入参数拼接一些其他的内容,然后将拼接好的整体一起拼接到SQL语句上面,例如:模糊查询的时候需要拼接【%】符号,这种情况就可以使用bind标签,并且使用bind标签处理模糊查询可以解决SQL注入问题。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.Mapper.EmployeeMapper">
<!-- 动态SQL -->
<!-- 动态SQL -->
<select id="query" parameterType="cn.js.domain.Employee" resultType="cn.js.domain.Employee">
<bind name="name" value="'%' + _parameter.getName() + '%'"/>
select *
from employee
where name like #{name}
</select>
</mapper>
bind标签中有两个属性,分别是:
- name属性:这个是输出参数的名称。
- value属性:这个是拼接之后name参数的新值。
上面代码中,假设我们传递的输入参数username值是:【雄霸】,那么经过bind标签参数绑定之后,新的username参数值等于【%雄霸%】,这样就实现了模糊查询的SQL。
测试代码:
package cn.js.Test;
import cn.js.Mapper.EmployeeMapper;
import cn.js.MybatisApp;
import cn.js.domain.Employee;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* @BelongsProject: MybatisTest
* @Author: com.js
* @CreateTime: 2023-09-10 00:01
* @Version: 1.0
* @introduce:
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MybatisApp.class)
public class EmployeeTsst {
@Resource
private EmployeeMapper employeeMapper;
@Test
public void test01(){
Employee user = new Employee();
user.setName("雄霸");
Employee employee = employeeMapper.query(user);
System.out.println(employee);
}
}
1.5、_parameter内置参数
【_parameter】是MyBatis框架中提供的一个内置参数对象,这个_parameter对象包含了Mapper接口方法的所有参数,如果Mapper接口方法只有一个输入参数,那么【_parameter】对象就表示这个输入参数;
如果Mapper接口方法有多个输入参数,那么MyBatis框架会将所有的参数封装为一个Map对象,我们可以直接通过【_parameter.XXX】的方式获取具体的输入参数。
<select id="query7" parameterType="cn.js.domain.User" resultType="cn.js.domain.User">
select * from user
<where>
<if test="_parameter.username != null">
and username = #{username}
</if>
</where>
</select>
1.6、_databaseId内置参数
【_databaseId】内置参数,可以获取到当前项目中使用的数据库类型,例如:是MySQL数据库,还是Oracle数据库。要使用【_databaseId】内置参数,必须在Mybatis的配置文件里面添加【databaseIdProvider】标签。
(1)添加databaseIdProvider
在mybatis的配置文件里面,添加如下配置:
<databaseIdProvider type="DB_VENDOR">
<!-- 定义参数 -->
<property name="MySQL" value="mysql"/>
</databaseIdProvider>
(2)使用_databaseId参数
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<select id="query6" parameterType="cn.js.domain.User" resultType="cn.js.domain.User">
<if test="_databaseId == 'mysql'">
select * from user limit 5,5
</if>
<if test="_databaseId == 'oracle'">
select * from user where rownum <![CDATA[ <= ]]> 5
</if>
</select>
</mapper>