MyBatis学习(四)–配置说明
标签(空格分隔): MyBatis学习
上文的讲解中,已经对MyBatis的编码方式结合JDBC的编码方式进行了对比。总结MyBatis能够为持久层解决的问题。现对MyBatis的几个主要的配置文件进行说明
(一) SqlMapConfig.xml
该文件为MyBatis的全局配置文件,主要配置MyBatis的运行环境信息、数据库连接信息、别名、导入Mapper.xml映射等等
属性包括:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
具体说明参考:
https://www.cnblogs.com/selene/p/4607004.html#_label2
(二) Mapper.xml
该文件主要用来声明执行的SQL信息。其中具体内容包括以下:
1、输入参数
a) #{}和${value}的区别
#{}相当于prepareStatement的?,作为一个占位符存在,可以有效的防止sql注入,可接受简单数据类型和pojo属性值,如果是简单数据类型,可以使用#{value}或者其他名称。如果使用pojo,则使用ognl表达式即可实现参数和java对象的转换。
${}将输入参数中传入的内容不进行任何jdbc类型的转换做字符串拼接,如果传递的是简单数据类型,只能使用${value},不能防止SQL的注入。使用场景有以下:
>① like查询中,不需输入参数中带入%。
② ORDER BY 排序。将参数值直接拼接
b) 传递POJO
使用ognl表达式解析对象字段的值
c) 传递map
直接通过ognl表达式获取key值即可。不匹配则key值为空
2、输出参数(一) — resultType
a) 输出简单类型
输出简单类型必须查询出来的结果集有一条记录,最终将第一个字段的值转换为输出类型。
使用session的selectOne可查询单条记录。
b) 输出pojo类型
输出的pojo单个对象或者列表对应的pojo属性名必须和sql定义输出保持一致。mapper的动态代理对象会根据接口中声明的返回时单个对象或者是列表选取执行sql的方法是selectOne还是selectList。
c) 输出hashMap
输出的Map的key值为sql中所定义的字段名信息
3、输出参数(二) — resultMap
在resultType中我们提到了SQL输出的字段名必须与输出的pojo对象名保持一致,但在实际的开发过程中并不能保证所有SQL的输出属性名必须和Java对象保持一致,所以引入了resultMap。将SQL的输出属性和pojo进行映射。
在mapper.xml中声明一个resultmap.然后在sql中指定输出的resultmap即可完成映射
4、动态SQL
在实际的开发中,动态SQL实用的范围较广。主要是用来对一些SSQL实现动态拼接,满足日常的各种需求,实现对sql的灵活操作.
4.1 IF
<!-- 传递pojo综合查询用户信息 -->
<select id="findUserList" parameterType="user" resultType="user">
select * from user
where 1=1
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</select>
注意要做不等于空字符串校验.注意上面的1=1.主要是为了防止没有查询条件的情况,可以加入where进行优化
4.2 WHERE
<select id="findUserList" parameterType="user" resultType="user">
select * from user
<where>
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</select>
标签可以自动处理第一个 and
4.3 foreach
向sql传递数组或List,mybatis使用foreach解析。例如实现IN查询条件的拼接
<if test="ids!=null and ids.size>0">
<foreach collection="ids" open=" and id in(" close=")" item="id" separator="," >
#{id}
</foreach>
</if>
如果传递的是一个数组,则:
<!-- 传递数组综合查询用户信息 -->
<select id="selectUserByArray" parameterType="Object[]" resultType="user">
select * from user
<where>
<!-- 传递数组 -->
<if test="array!=null">
<foreach collection="array" index="index" item="item" open="and id in("separator=","close=")">
#{item.id}
</foreach>
</if>
</where>
</select>
sql只接收一个数组参数,这时sql解析参数的名称mybatis固定为array,如果数组是通过一个pojo传递到sql则参数的名称为pojo中的属性名。
index:为数组的下标。
item:为数组每个元素的名称,名称随意定义
open:循环开始
close:循环结束
separator:中间分隔输出