本次主要来了解:MyBatis数据库配置文件SqlMapConfig.xml
SQL映射配置中输入映射的配置
SQL映射配置中输出映射的配置
SQL映射配置中动态SQL语句的配置
1. SqlMapConfig配置文件详解
主要来配置MyBatis的一些核心信息。配置名称配置含义配置简介configuration包裹所有配置标签整个配置文件的顶级标签
properties属性该标签可以引入外部配置的属性,也可以自己配置。该配置标签所在的同一个配置文件中的其他配置均可引用次配置中的属性
setting全局配置参数用来配置一些改变运行时行为的信息。例如是否使用缓存机制,是否使用延迟加载,是否使用错误处理机制等。并且可以设置最大并发请求数量、最大并发事务数量,以及是否启用命名空间等。
typeAliases类型别名用来设置一些别名来替代Java的长类型声明(如: java.lang.int变为int),减少配置编码的冗余
typeHandlers类型处理器将SQL中返回的数据库类型转换为相应的Java类型的处理器配置
objectFactory对象工厂实例化目标类的工厂类配置
plugins插件可以通过插件修改MyBatis的核心行为,例如对语句执行的某一点进行拦截调用
environments环境集合属性对象数据库环境配置的详细配置
environment环境子属性对象数据库环境的配置信息
transactionManager事务管理指定MyBatis的事务管理器
dataSource数据源使用其中的type指定数据源的连接类型,在标签对中可以使用property属性指定数据库连接池的其他信息
mappers映射器配置SQL映射文件的位置,告知MyBatis去哪里加载SQL映射配置<?xml version="1.0" encoding="UTF-8"?>configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
关于SqlMapConfig.xml各个配置名称的详细说明请访问
:MyBatis配置文件详解
2. Mapper映射文件
Mapper映射文件,主要就是用来配置SQL映射语句的,根据不同的SQL语句性质,要使用不同的标签来包裹。
Mapper配置文件标签:标签名称标签作用insert用来映射插入语句
update用来映射更新语句
delete用来映射删除语句
select用来映射查询语句
resultMap用来将从数据库结果集取出的数据映射到相应的实体对象的相应字段中
sql配置可以被其他语句引用的SQL语句块
cache给定命名空间的缓存配置
cache-ref其他命名空间缓存配置的引用
parameterMap参数映射,该配置现已被抛弃
select、insert、delete、update样例:
SELECT * FROM USER WHERE id=#{id}
SELECT * FROM USER WHERE username LIKE '%${value}'
INSERT INTO USER(username, password, gender, birthday, email, province, city)
VALUE (#{username}, #{password}, #{gender}, #{birthday,jdbcType=DATE}, #{email}, #{province}, #{city})
DELETE FROM USER WHERE id=#{id}
UPDATE USER SET username=#{username} where id=#{id}
关于mapper.xml各个配置文件的详细说明请访问
:Mapper XML文件详解
3. Mapper配置动态SQL语句在Mapper配置文件中,有时候需要根据一些查询条件来选择不同的SQL语句,或者将一些使用频率极高的SQL语句单独配置,在需要的地方引用。MyBatis提供了一种可以根据条件动态配置SQL语句,以及单独配置SQL语句块的机制。
当查询语句的查询条件由于输入参数的不同而无法确切定义时,可以使用“”标签对来包裹需要动态指定的SQL查询条件,而在“”标签对中,可以使用“”条件来分情况设置SQL查询条件。
下面的样例设置了,当输入参数的Java包装类中含有的条件不同时,查询条件可动态变化:
SELECT * FROM USER
AND user.gender = #{UserQueryVo.gender}
AND user.username LIKE '%${UserQueryVo.username}%'
上面的输入参数为封装了查询条件的包装类,在查询条件中使用了动态配置,当性别gender、username不为空时,将其作为查询条件之一,若其中一个为空,不将其作为查询条件。值得注意的是,当使用“”标签对包裹if条件语句时,将会忽略查询条件中的第一个“and”(这样才能组成一个可执行的SQL语句)。
另外,可以将复用性比较强的SQL语句封装成SQL片段,在需要使用该SQl片段的映射配置中声明一下,即可引入该SQL语句。声明如下:
其中id是SQL片段的唯一标识,是不可重复的。SQL片段支持动态SQL语句,但不支持“”标签。
下面示例将上面的SQL语句的查询条件封装为一个“SQL片段”,然后可供所有的SQL映射配置使用:
SELECT * FROM USER
SELECT COUNT(*) FROM USER
这里的标签还可以引用外部mapper.xml文件的SQL片段,refid只需写成该文件的namespace.sql_id (如:test.query_user_where)
语句包含多个查询信息情况(如查询id为2、4、6的User用户)SELECT * FROM USER WHERE id=2 OR id=4 OR id=6SELECT * FROM USER WHERE id IN (2,4,6)
而此时如果在Mapper文件中配置这样的语句,则需要向SQL配置传递一个数组或者List类型的输入参数,然后MyBatis使用“”标签去遍历并解析这些数组或List中的值。
示例:
首先输入参数是一个Java包装类,其属性为一个包含多个id信息的List集合:pubic class UserQueryVo{ //多个id
private List ids; public List getIds(){ return ids;
} public void setIds(List ids){ this.ids = ids;
}
}
在Mapper中配置一个包含foreach查询条件的动态SQL片段,并在查询SQL映射中引入它:
id=#{user_id}
SELECT * FROM USER
上面示例使用foreach遍历传入的ids查询参数,在foreach标签中:collection指定输入对象中的集合属性;
item为每次遍历生成的对象名;
open为开始遍历时要拼接的串;
close为结束遍历时要拼接的串;
separator为遍历的两个对象中间需要拼接的串。
上面示例拼出的效果为:“where (id=2 or id=4 or id=6)”
当然,实现“where id in (2,4,6)” 效果的配置与此类似,只要将拼接前缀open属性改成“and id in(”,separator改为“,”,标签对中的标签改为“#{user_id}”,即可:
#{user_id}
作者:LeaveStyle
链接:https://www.jianshu.com/p/5448403c6e3d