2021-04-15

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查询不到结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值