本文主要内容:mybatis多表关联处理,嵌套查询,注解标签,动态sql.
多表关联
先附上示例代码,后面解释
<resultMap id="searchStudent" type="Student"><result column="id" property="id"></result><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><association property="dorm" javaType="Dorm"><result column="dnum" property="num"></result></association><association property="admin" javaType="Admin"><result column="account" property="account"></result></association></resultMap><select id="findStudentByid" resultMap="searchStudent" parameterType="int">SELECTs.id,s.num,s.name,s.gender,d.num dnum,a.accountFROM student s LEFT JOIN dorm d ON s.dormid = d.idLEFT JOIN admins a ON s.adminid = a.idWHERE s.id = #{id}</select>
这里的多表关联指的是在数据库中用到两张及以上表的关联查询,这个时候一个java类中将涉及到其他java类的属性封装到一个对象中作为java类的一个属性,在对数据库进行查询过后,再将对应数据封装到对应的对象中的操作。
举个例子:
建表时, 学生表:id,name,dormid(宿舍号)
宿舍表:id,num
java类, Student:id,name,Dorm
Dorm:id,num,Student
查询到学生的信息后,对应的dormid要封装到一个Dorm对象中·,这是就用到<resultMap>标签以及等等标签来完成封装这一操作。用法我在之前统述中说过。
嵌套查询
嵌套查询,顾名思义,嵌套,一层一层。
即先查出一层,再用查到的信息去查下一层。
举个通俗易懂的例子。
还是沿用上面的两张表
先查宿舍,再根据宿舍查宿舍内住宿的学生
<!--第一次查询宿舍--><select id="findDorm1" resultMap="dormmap1">select id,num from dorm</select><resultMap id="dormmap1" type="Dorm"><id property="id" column="id"></id><result property="num" column="num"></result><collection property="students" column="id" javaType="list" ofType="Student" select="findStudent"></collection></resultMap><!--通过宿舍区查该宿舍住宿的学生--><select id="findStudent" resultType="Student" parameterType="int">select id,num,name from student where dormid = #{id}</select>
注解标签
这里我不推荐使用注解标签,当单表查询时,注解标签确实能方便不少,但是如果涉及多表关联查询,这里代码就会变得凌乱,自己看得懂,其他人不一定可以看的懂。
@Insert : 插入 sql , 和 xml insert sql 语法完全一样
@Select : 查询 sql, 和 xml select sql 语法完全一样
@Update : 更新 sql, 和 xml update sql 语法完全一样
@Delete : 删除 sql, 和 xml delete sql 语法完全一样
@Param : 入参
@Results : 设置结果集合
@Result : 结果
使用时写在对应方法上面,更为具体的参考API
@Delete("delete from student where id = #{id}")void deleteStudentByid(int id);@Insert("insert into student(id,num,name,gender) value(#{id},#{num},#{name},#{gender})")void addStudent(Student student);@Update("update student set gender=#{gender} where id = #{id}")void updateStudent(int id,String gender)
动态SQL
简单理解就是Mybatis框架根据不同条件拼接 SQL 语句,解决了程序员手动判断拼接的恶梦。
<if>
<where>,<set>
<trim>
<choose><when>
<foreach>
注意特殊字符
< > " , &
以上这五种特殊符号,在xml文件中使用不当会显示错误,举个例子<在sql中是小于的意思,在在xml中是 标签的一半,其他也是xml文件的常用字符,容易与sql语句混淆,导致错误,xml提供两种解决办法。
1.使用转义符
< <
> >
" "
, '
& &
2.使用特有的 <![CDATA[ ]]> 来包裹特殊字符
在这个标签中的内容不会被解析