mybatis 参数
1. parameterType 输入参数 可以为java基本数据类型如Integer,String[]等,
也可以是自定义的数据类型
例1: select * from tag where employee_id = #{employee_id}
其中employee_id是函数的形参变量名
对应接口函数:
Tag getTagByEmployee(String employee_id);
例2:
INSERT INTO `vishishtadvaita`.`tag`
(`id`, `last_known_x`, `last_known_y`, `name`, `last_known_area_id`, `isknown`, isonline, `type`, tag_employee)
VALUES (UUID(), #{lastKnownX}, #{lastKnownY}, #{name}, #{lastKnownArea.name}, #{isknown}, #{isonline}, #{type},
#{tagEmployee.employee_id});
这里的parameType就是自定义的Tag型数据,包含name等属性,这种输入类型常用于插入和修改操作
对应接口函数:
void addTag(Tag tag);
2. 查询结果类型参数 resultType ,resultType可以包含java基本数据类型List等,也可以是自定义的数据类型,如之前的Tag
例1. java基本数据类型String 这一类型常见于查询数据表中的某一列,比如查询tag表的属性(type)
SELECT DISTINCT type FROM tag 虽然其返回结果是一个由字符串String组成的List,但在resultType中写的是String而非List
对应的接口函数为: List selectTagType()
例2.自定义的数据类型Tag
如果查询结果为一整张表或表的多个属性,不能像只查询一个属性那样用String就可以表示,resultType就要用与数据库表对应的实体类,也就是自定义
的数据类型了
首先要在命名空间标签中标注对应的数据类型,
之后再写查询语句
<select id="selectTags" resultMap="tag">
select*
from tag
* 这里跟上例相同,虽然返回的结果是一个由Tag组成的标签,但resultType对应的仍然是tag * 对应的接口函数: List selectTags(); # 3. 查询结果类型参数 resultMap,这一参数扩大了数据库的可操作性,经常用于多表查询 ## 使用resultMap是因为现有的数据类型不足以表示数据库查询结果,需要自定义返回值的数据类型 ,或者数据表中的属性名与自定义数据类型中属性名不同时 ## 例如tag的name属性,在tag.java 中为 name,在数据表中却为tag_name,这时如果把返回值设置成resultType = "tag",就会查不出结果 ### 例1. 多表查询 假设有Tag和Employee,Area三个实体类,三张表,Tag有外键tag_enployee用来表示tag 与employee之间一对一的关系 tag有外键last_known_area_id 用来表示与area之间一对一的关系
- 这里给出 Tag.java Employee.java Area.java 以及三张表的建议表示 Tag.java:
@Entity @Table(name = "tag") public class Tag extends BaseModel { @Column(name = "name") private String name;
@OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "tag_employee") private Employee tagEmployee;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "last_known_area_id") private Area lastKnownArea;} tag表 id name tag_employee last_known_area_id
首先从这里就可以看出查询tags时要用resultMap而非resultType的原因了, 即java类中的属性与数据表中对应的属性不同名
当只需要tag的信息时自然简单,但是有时候需要知道三张表之间对应的关系
比如想知道每个标签对应的员工是谁,属于哪个区域,这就需要三表连接查询,这样得到的结果既不能用tag,也不能用employee,area表示
因此需要用到reultMap. 下面给出三表连接查询的一个例子
3.1. 首先 准备employee_as_member 和 area_as_member,注意这两个标签卸载其各自的.xml文件中而非tag.xml中
注意:colume属性对应的是数据库表中的属性名,property对应的则是java类中的属性名
在sql语句中用到的是column属性,例如select area_id 而非id
3.2. 写tag自己的resultMap
注意:上述resultMap中涉及四个属性,分别是tag自身的id、name以及外键tagemployee,lastKnownArea(对应tag.java中的tagEmployee和tagEmployee)
=====================
resultMap="cn.edu.bjut.vishishtadvaita.mapper.mockloceng.AreaMapper.area_as_member"则对应第一步写的两个标签
=====================
3.3. 查询语句
SELECT * FROM (SELECT tag.id AS tag_id, tag.name AS tag_name, employee.employee_name AS employee_name, employee.employee_id AS employee_id FROM tag LEFT JOIN employee ON employee.employee_id = tag.tag_employee) AS t1 LEFT JOIN (SELECT area.id AS area_id,area.name AS area_name, FROM area)AS t2 ON t1.last_known_area_id = t2.area_id </select> 注意:这里的select tag.name AS tag_name和SELECT area.id AS area_id等是有必要的,不把area.id表示为数据表中的area_id查询不到结果