【MyBatis笔记10】Mybatis中几个动态SQL标签和内置参数
这篇文章,主要介绍MyBatis中几个动态SQL标签和内置参数。
目录
一、MyBatis动态SQL
1.1、sql标签
1.2、include标签
1.3、resultMap标签
1.4、bind标签
1.5、_parameter内置参数
1.6、_databaseId内置参数
(1)添加databaseIdProvider
(2)使用_databaseId参数
一、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="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.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="com.mybatis.demo.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="com.mybatis.demo.mapper.UserMapper">
<!-- 动态SQL -->
<select id="query" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">
<bind name="username" value="'%' + _parameter.getUsername() + '%'"/>
select *
from user
where username like #{username}
</select>
</mapper>
bind标签中有两个属性,分别是:
- name属性:这个是输出参数的名称。
- value属性:这个是拼接之后name参数的新值。
上面代码中,假设我们传递的输入参数username值是:【2022】,那么经过bind标签参数绑定之后,新的username参数值等于【%2022%】,这样就实现了模糊查询的SQL。
测试代码:
package com.mybatis.demo;
import com.mybatis.demo.domain.User;
import com.mybatis.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author ZhuYouBin
* @version 1.0.0
* @Date: 2022/9/1 16:23
* @Description
*/
public class DemoTest {
public static void main(String[] args) throws IOException {
// 1、加载配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3、创建 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = builder.build(is);
// 4、创建 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5、获取 UserMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行操作
User user = new User();
user.setUsername("2022");
List<User> query = userMapper.query(user);
for (User user1 : query) {
System.out.println(user1);
}
// 提交事务: mybatis 默认是不会自动提交事务的
sqlSession.commit();
// 关闭流
sqlSession.close();
is.close();
}
}
1.5、_parameter内置参数
【_parameter】是MyBatis框架中提供的一个内置参数对象,这个_parameter对象包含了Mapper接口方法的所有参数,如果Mapper接口方法只有一个输入参数,那么【_parameter】对象就表示这个输入参数;
如果Mapper接口方法有多个输入参数,那么MyBatis框架会将所有的参数封装为一个Map对象,我们可以直接通过【_parameter.XXX】的方式获取具体的输入参数。
<select id="query7" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.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="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.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>
以上,就是MyBatis动态SQL的标签以及内置参数。
综上,这篇文章结束了,主要介绍MyBatis中几个动态SQL标签和内置参数。