通过Mybatis提供的各种标签对条件做出判断以实现动态拼接SQL语句。主要解决查询条件不确定的情况下:即多条查询条件,提交的查询条件不足则执行的SQL语句不同。不便于将所有的条件进行排列组合
简化代码比如要通过不同的条件查询相同的实体
User queryUserById(@Param("id") Integer id);
User queryUserByName(@Param("name") String name);
通过动态sql实现查询的mapper
select * from User where id = #{id}
如果不使用动态sql,则上述的body部分就会写两遍,一般的查询语句会要求列出需要查询的项,这样重复的代码量就会更多,所以动态sql还是比较有优势的。
bind标签MyBatis提供bind来解决:在进行模糊查询的时候,如果使用 “${}” 拼接字符串,则无法防止SQL注入的问题。如果使用字符串拼接函数或连接符号,不同数据库的拼接函数或者连接符号不同
在UserMapper.xml文件中使用PS: 如果字符串的拼接不在xml文件中进行,就需要在其他(service)中实现字符串的拼接,在xml文件中使用#{}获得拼接好的字符串。
if标签和where标签 if标签where标签sql语句的部分
举例: 根据性别和名字查询用户 查询sql语句其他动态sql
SELECT id, username, birthday, sex, address FROM `user` WHERe sex = 1 AND username LIKE '%张%'mybatis动态sql
resultMap标签SELECT id, username, birthday, sex, address FROM `user` AND sex = #{sex} AND username LIKE #{pattern}
解决: 实体类属性名和数据库表中字段名不一致的情况,可以将查询结果映射成实体对象
具体理解: 数据库中的字段与实体类中定义的字段代表的是一个意思,但是两者的表示方式(名称)略有差异,或者是要修改一个字段,必定要在另一个文件找到与之对应并全部修改,为了简化,则使用resultMap进行映射,在后续进行修改的时候,只用修改映射中的映射字段即可。
一对一多表查询:association
以下面的例子为例:使用assocaition映射关联对象User的结果
一对多查询:collection
同样以下面的例子做说明:首先映射了User类的结果,然后使用一对多的关系collection标签配置Order的结果。其结果是查询出用户信息及其订单集合信息。



