Mybatis中动态SQL标签和内置参数
一、MyBatis动态SQL
1.1、sql标签
sql标签用于抽取公用的SQL代码,定义sql标签的时候需要通过【id】属性设置唯一标识。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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 mapperPUBLIC "-//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 mapperPUBLIC "-//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 employeewhere 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 {@Resourceprivate EmployeeMapper employeeMapper;@Testpublic 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 mapperPUBLIC "-//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>