一、字段名与实体类属性名不相同
上图中实体类中的属性名和数据库中字段名不一致, 这样定义的话会导致后面写的spl语句中#{parameter}赋给参数取不到,sql语句执行的结果就为null或者会报错.
那么解决这个问题的方案有两个:
1. 通过在 sql 语句中定义别名
这种方法是最笨的方法,试想如果数据库表中有很多个字段,那么这种方法就会很笨拙并且容易出错,下面要添加其他查询的话还要写很多冗余的代码,所以这种方法不建议使用!
2. 使用<resultMap>标签来完成属性和列的映射关系。
标签中关键字的解释和作用:
id:唯一标识.名字自定义
type: 类型 ; 操作的表与对应实体类的映射
<id 主键的映射关系 column="列名" property="属性名"/> (这个id必须写)
<result 普通字段/> (如果表中字段名和实体类中的属性名相同可不写)
autoMapping=true 表示自动映射。默认true
注意:
如果字段名和实体属性名相同 那么在查询语句中要添加<result Type>标签来接收查询的 返回值, 但是如果字段名和实体属性名不相同,定义了<resultMap>就不能再加入 <resultType>了!
二、多表联查
1.多对一查询------链表查询
一般多为inner join...on...
这种查询我们用员工和部门之间的关系来说
可以看到一个员工对应一个部门
首先需要生成每张表对应的实体类和DAO接口以及映射文件
不要忘记再Mybatis.xml文件中引入相关的映射文件
接下来我们根据员工id查找对应部门
在EmpMapper文件下添加<resultMap> 文件
<resultMap>中生成<association>标签
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yanci.dao.EmpDao">
<!-- 链表查询-->
<resultMap id="emp01" type="com.yanci.entity.Emp">
<id property="id" column="emp_id"></id>
<result property="name" column="emp_name"></result>
<result property="age" column="emp_age"></result>
<result property="pid" column="part_id"></result>
<association property="part" javaType="com.yanci.entity.Part" autoMapping="true">
<id property="id" column="part_id"></id>
<result property="name" column="part_name"></result>
</association>
</resultMap>
<select id="selByCondition" resultMap="emp01">
select * from emp e inner join part p on e.part_id=p.part_id where emp_id=#{id}
</select>
</mapper>
标签中关键字的解释和作用:
association:表示多对一
property:表示对象属性名
javaType:表示该对象所属的类型
autoMapping必须写
DAO和实体类
建立测试类测试
2.多对一查询------嵌套查询
我们把通过查询获得的part_id传给PartMapper
通过在<association>标签中添加select关键字建立EmpMapper和PartMapper之间的联系
建立测试类测试
由结果看到两条sql语句都执行了!
三、动态sql
sql语句根据条件而发生改变。
元素 | 作用 | 描述 |
if | 条件判断 | 单条件判断 |
choose(when otherwise) | 条件选择 | 多条件分支判断 |
where、set | 辅助 | sql拼接 |
foreach | 循环 | 循环 |
我们还对之前的student表进行操作
1.if 和where
如果传入了姓名 则按照姓名进行查询 如果没有传入姓名 则查询所有
where:可以帮你添加where关键 并且把第一个and | or去除
通过姓名和性别查询
2.choose +where
when:当条件满足时会执行下面的when和other 都不满足则执行otherwise
通过姓名或者性别查询
<select id="selByNameOrSex" resultMap="student1">
select * from student
<where>
<choose>
<when test="name != null and name != ''">
and s_name=#{name}
</when>
<when test="sex != null and sex != ''">
and s_sex=#{sex}
</when>
</choose>
</where>
</select>
3.set标签:修改部分字段。
修改部分列的值。
set 可以帮你添加set关键字 并且去除最后的逗号。
4. foreach 批量操作
此处我们进行批量查询
标签中关键字的解释和作用:
foreach:
collection:要遍历的集合和数组名
item: 每次遍历时赋值的元素变量名
open: 以什么开始
close:以什么结束
separator: 分隔符
建立测试类