合肥网站制作费用建手机网站的软件有哪些
合肥网站制作费用,建手机网站的软件有哪些,建设网站空间怎么预算,青岛建站软件关于关联查询 首先#xff0c;请准备一些测试数据#xff0c;使得#xff1a;存在若干条用户数据#xff0c;存在若干条角色数据#xff0c;某个用户存在与角色的关联#xff0c;最好有些用户有多个关联#xff0c;又有些用户只有1个关联#xff0c;还有些用户没有关联…关于关联查询 首先请准备一些测试数据使得存在若干条用户数据存在若干条角色数据某个用户存在与角色的关联最好有些用户有多个关联又有些用户只有1个关联还有些用户没有关联。
假设存在需求根据id查询某用户信息时也查出该用户归属于哪几种角色。
**测试数据参考** truncate admin;
truncate admin_role;
truncate role;
truncate permission;insert into admin (username, password) values (admin001, 123456);
insert into admin (username, password) values (admin002, 123456);
insert into admin (username, password) values (admin003, 123456);
insert into admin (username, password) values (admin004, 123456);
insert into admin (username, password) values (admin005, 123456);
insert into admin (username, password) values (admin006, 123456);
insert into admin (username, password) values (admin007, 123456);
insert into admin (username, password) values (admin008, 123456);
insert into admin (username, password) values (admin009, 123456);
insert into admin (username, password) values (admin010, 123456);
insert into admin (username, password) values (admin011, 123456);
insert into admin (username, password) values (admin012, 123456);
insert into admin (username, password) values (admin013, 123456);
insert into admin (username, password) values (admin014, 123456);
insert into admin (username, password) values (admin015, 123456);
insert into admin (username, password) values (admin016, 123456);
insert into admin (username, password) values (admin017, 123456);
insert into admin (username, password) values (admin018, 123456);
insert into admin (username, password) values (admin019, 123456);
insert into admin (username, password) values (admin020, 123456);insert into permission (name, value, description) values
(商品-商品管理-读取, /pms/product/read, 读取商品数据含列表、详情、查询等),
(商品-商品管理-编辑, /pms/product/update, 修改商品数据),
(商品-商品管理-删除, /pms/product/delete, 删除商品数据),
(后台管理-管理员-读取, /ams/admin/read, 读取管理员数据含列表、详情、查询等),
(后台管理-管理员-编辑, /ams/admin/update, 编辑管理员数据),
(后台管理-管理员-删除, /ams/admin/delete, 删除管理员数据);insert intorole (name) values
(超级管理员), (系统管理员), (商品管理员), (订单管理员);insert into admin_role (admin_id, role_id) values
(1, 1), (1, 2), (1, 3), (1, 4),
(2, 1), (2, 2), (2, 3),
(3, 1), (3, 2),
(4, 1);本次查询需要执行的SQL语句大致是 select *
from admin
left join admin_role on admin.idadmin_role.admin_id
left join role on admin_role.role_idrole.id
where admin.id?通过测试运行可以发现必须基于以上测试数据
- 当使用的id值为1时共查询到4条记录并且用户的基本信息是相同的只是与角色关联的数据不同 - 当使用的id值为2时共查询到3条记录 - 当使用的id值为3时共查询到2条记录 - 当使用其它有效用户的id时共查询到1条记录
其实这种查询期望的结果应该是 public class xxx {// 用户基本信息的若干个属性例如用户名、密码等// 此用户的若干个角色数据可以使用 List?
}则可以先创建“角色”对应的数据类型 public class Role {private Long id;private String name;private String description;private Integer sort;private LocalDateTime gmtCreate;private LocalDateTime gmtModified;// Setters Getterss// toString()
}再创建用于封装此次查询结果的类型 public class AdminDetailsVO {private Long id;private String username;private String password;private String nickname;private String avatar;private String phone;private String email;private String description;private Integer isEnable;private String lastLoginIp;private Integer loginCount;private LocalDateTime gmtLastLogin;private LocalDateTime gmtCreate;private LocalDateTime gmtModified;private ListRole roles;// Setters Getterss// toString()
}接下来可以在AdminMapper接口中添加抽象方法 AdminDetailsVO getDetailsById(Long id);需要注意由于此次关联了3张表一起查询结果集中必然出现某些列的名称是完全相同的所以在查询时不可以使用星号表示字段列表因为这样的结果集中的列名就是字段名会出现相同的列名而是应该至少为其中的一部分相同名称的列定义别名例如 selectadmin.id,admin.username,admin.password,admin.nickname,admin.avatar,admin.phone,admin.email,admin.description,admin.is_enable,admin.last_login_ip,admin.login_count,admin.gmt_last_login,admin.gmt_create,admin.gmt_modified,role.id AS role_id,role.name AS role_name,role.description AS role_description,role.sort AS role_sort,role.gmt_create AS role_gmt_create,role.gmt_modified AS role_gmt_modified
from admin
left join admin_role on admin.idadmin_role.admin_id
left join role on admin_role.role_idrole.id
where admin.id1;在Mybatis处理中此查询时并不会那么智能的完成结果集的封装所以必须自行配置resultMap用于指导Mybatis完成封装 resultMap idDetailsResultMap typexx.xx.xx.xx.AdminDetailsVO!-- 在1对多、多对多的查询中即使名称匹配的结果也必须显式的配置 --!-- 主键字段的结果必须使用id节点进行配置配置方式与result节点完全相同 --id columnid propertyid /result columngmt_create propertygmtCreate /!-- 需要使用collection节点配置1对多中“多”的数据 --collection propertyroles ofTypexx.xx.xx.Roleid columnrole_id propertyid /result columngmt_create propertygmtCreate //collection
/resultMap的查询SQL语句并使用以上的resultMap封装结果即可 sql idDetailsQueryFieldsif testtrueadmin.id,admin.username,admin.password,admin.nickname,admin.avatar,admin.phone,admin.email,admin.description,admin.is_enable,admin.last_login_ip,admin.login_count,admin.gmt_last_login,admin.gmt_create,admin.gmt_modified,role.id AS role_id,role.name AS role_name,role.description AS role_description,role.sort AS role_sort,role.gmt_create AS role_gmt_create,role.gmt_modified AS role_gmt_modified/if
/sql
resultMap idDetailsResultMap typecn.tedu.mybatis.AdminDetailsVO !-- 在1对多、多对多的查询中即使名称匹配的结果也必须显式的配置 -- !-- 主键字段的结果必须使用id节点进行配置配置方式与result节点完全相同 -- id columnid propertyid /result columnusername propertyusername /result columnpassword propertypassword /result columnnickname propertynickname /result columnavatar propertyavatar /result columnphone propertyphone /result columnemail propertyemail /result columndescription propertydescription /result columnis_enable propertyisEnable /result columnlast_login_ip propertylastLoginIp /result columnlogin_count propertyloginCount /result columngmt_last_login propertygmtLastLogin /result columngmt_create propertygmtCreate /result columngmt_modified propertygmtModified /!-- 需要使用collection节点配置1对多中“多”的数据 --collection propertyroles ofTypecn.tedu.mybatis.Roleid columnrole_id propertyid /result columnrole_name propertyname /result columnrole_description propertydescription /result columnrole_sort propertysort /result columnrole_gmt_create propertygmtCreate /result columnrole_gmt_modified propertygmtModified //collection
/resultMap
select idgetDetailsById resultMapDetailsResultMapselect include refidDetailsQueryFields /from adminleft join admin_role on admin.idadmin_role.admin_idleft join role on admin_role.role_idrole.idwhere admin.id#{id}
/select总结 MyBatis是一个流行的Java持久化框架它提供了一种方便的方式来执行数据库查询并支持各种连表查询。在本文中我将为您详细介绍MyBatis的连表查询方式并解释在XML中如何编写SQL语句以及实体类的写法以及需要注意的事项。
连表查询是通过在SQL语句中使用JOIN子句来实现的。在MyBatis中有以下几种常见的连表方式
内连接INNER JOIN只返回满足连接条件的行。左连接LEFT JOIN返回左表中的所有行以及满足连接条件的右表中的行。右连接RIGHT JOIN返回右表中的所有行以及满足连接条件的左表中的行。全连接FULL JOIN返回左右表中的所有行如果某行在另一表中没有匹配的行则用NULL填充。
在XML中编写连表查询的SQL语句时可以使用以下方式
select idselectByExample parameterTypecom.example.entity.Example resultMapcom.example.mapper.ExampleResultMapSELECT * FROM table1 t1JOIN table2 t2 ON t1.id t2.id
/select在这个例子中我们使用了JOIN子句将table1和table2进行连接通过ON关键字指定了连接条件。
在实体类中我们可以使用嵌套对象来表示连接的表。例如如果我们有table1和table2两个表我们可以创建以下两个实体类
public class Table1 {private int id;private String name;private Table2 table2;// getter and setter
}public class Table2 {private int id;private String value;// getter and setter
}在上面的例子中Table1实体类包含了一个类型为Table2的属性table2这样我们就可以通过连表查询获取到table1和table2之间的关联数据。
需要注意的是在进行连表查询时要确保表之间的连接条件是正确的并且在数据库中存在相应的关联关系。此外还要注意避免查询结果过大导致性能问题可以使用分页或其他限制条件来控制查询返回的数据量。
总结
MyBatis支持多种连表查询方式包括内连接、左连接、右连接和全连接。在XML中编写连表查询的SQL语句时可以使用JOIN子句并通过ON关键字指定连接条件。在实体类中可以使用嵌套对象来表示连接的表。在进行连表查询时需要确保连接条件正确并且注意性能问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90330.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!