MyBatis的SQL映射
前言
MyBatis是一个优秀数据持久层框架。它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,动态映射SQL语句。
MyBatis实现条件查询
1) SQL映射文件
<?xml vesion="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<mapper></mapper>
mapper:映射文件的根元素,属性的namespace(命名空间)
作用:用于区分不同的mapper,全局唯一绑定DAO接口,面向接口编程,当namespace绑定某一接口后,可以不用实现接口,MyBatis会通过接口的完整限定名查找对应的mapper配置执行SQL语句。namespace的命名必须跟某个接口同名,同属于DAO层,故代码结构上映射文件与该DAO接口应放在同一个package下
mapper.xml配置文件中的一些标签
cache:配置给定命名空间的缓存
cache-ref:从其他命名空间引用缓存配置
resultMap:描述数据库结果集和对象的对应关系
resultMap将结果集映射到Java对象
id:唯一标识。作用于到select元素resultMap属性的引用
type:表示resultMap的映射结果类型
result:子节点标识简单属性,其中column属性表示从数据库中查询的字段名
property表示查询出来的字段对应的值赋给实体对象的哪个属性
最后测试类中进行相关字段的输出。比较:resultType:直接表示返回类型resultMap:对外部resultMap定义的引用,可以做出更复杂的查询结果
数据库字段信息与对象属性不一致或需要做复杂联合查询以便自由控制应设结果。在resultMap中么有映射出的字段是不能在后台查出数据,即使是查询全部信息。如果需要查出没有映射的字段需要改写resultMap的自动映射级别为 NONE。默认为 PARTIAL 在mybatis-config.xml中修改<settings><setting name="autoMappingBehavior" value="NONE"/></settings> FULL - 自动匹配所有 NONE - 禁止自动匹配 PARTIAL
sql:重用的SQL块
insert:映射插入
update:映射更新
delete:映射删除
- 增删改默认返回值为int
select:映射查询
<select>sql语句</select>
id:指定其节点的唯一标识,与接口方法同名
parameterType:标识查询语句传入参数的类型,名称为指定的别名或类名。支持基础数据类型或复杂数据类型。如String或别名string
接收值:
基础类型:#{属性名}
对象类型:#{对象类型里的属性名}
Map:#{Map的Key}
同时接收两种类型时对象在接口处需要加上@Param注解对象需要通过注解的别名.属性名 #{对象别名.属性名}
resultType:查询语句返回结果类型,名称为指定的别名或类名。
2)使用@Param注解实现多参数入参
接口中方法定义
public int updatePwd(@Param("id")Integer =id,@Param("password")String pwd);
使用别名之后可以在配置文件中的SQL语句之间使用
update 表名 set password=#{password} where id=#{id}
3) 单参数或多参数也可以使用下标
public int updatePwd(Integer id,String pwd);
update 表名 set password=#{1} where id=#{0}
使用动态SQL完成多条件查询
1) 实现动态SQL的元素
if:实现简单的条件选择
<if test="条件">条件成立结果</if> 执行一个SQL语句时 select * from 表名 where 1=1 <if test="条件"> and .... </if>
choose(when,otherwise):等于Java中switch语句
where:简化SQL语句中where的条件判断
set:解决动态更新语句
<update id="modify" parameterType="User"> update smbms_user <set> <if test="userName!=null">userName=#{userName}</if> </set> </update>
trim:去除多余的关键字
trim会自动识别其标签内是否有返回值,true会在自己包含的内容 前或后 加上某些前缀,与之对应的属性prefix和suffix。也可包含内容的 首部或尾部 某些内容覆盖(即忽略),对应的属性:prefixOverrides和suffixOverrides
可以利用trim来替换where元素suffix:后缀,在trim包含的内容上加上后缀
prefixOverrides:trim包含的首部进行制定内容(如”and | or”)的忽略suffixOverrides:trim包含内容的首尾部进行指定内容的忽略
<select id="getUserList" resultType="User"> select * from smbms_user <trim prefix="where" prefixOverrides-"and | or" > <if test="userName !=null and userName !=''"> and userName like concat('%',#{userName},'%') </if> </trim> </select>
foreach:迭代一个集合,通常用于in条件
MyBatis入参为数组类型的foreach迭代
foreach主要用在构建in条件中,可以在SQL语句中迭代一个集合。
属性:
- item:表示集合中每个元素进行迭代时的别名。
- index:指定一个名称,表示迭代过程,每次迭代到的位置。
- open:表示该语句以什么开始
- separator:表示每次进行迭代直接以什么符号作为分隔符
- close:表示该语句以什么技术
- collection:最关键最容易出错的属性。不同情况,该属性的值不一样,主要三种情况
- 入参为单参数且参数类型是一个List时:collection值为List
- 入参为单参数且参数类型是一个数组时:collection值为array
- 入惨为多参数,需要把它们封装为一个Map。
- 入参不能有@Param注解
正则表达式的捕获组替换
搜索:(\w+)=\{(\w+)\}
替换:<if test="$1">$1=#\{$1\}</if>