ibatis使用高级篇,多表操作处理!
<script type="text/javascript"> function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();} </script>
<sqlMap namespace="user"><--命名空间,好像2.0默认是开通的--> <cacheModel type="LRU" id="oneDayCategory"><!--缓存配置,详细的资料请察看官方提供的用户手册,好像有中文版本的了 --> <flushInterval hours="24" /> </cacheModel> <typeAlias type="com.infodeliver.pigeon.bean.User" alias="userbean" /><!--定义本地变量,为了方便使用 --> <typeAlias type="com.infodeliver.pigeon.util.Condition" alias="condition" /> <typeAlias type="com.infodeliver.pigeon.bean.Role" alias="rolebean"/> <resultMap id="get_group_result" class="com.infodeliver.pigeon.bean.Group"><!-- 这就是不定义本地变量的结果--> <result property="groupid" column="group_id" /> <result property="groupname" column="group_name" /> </resultMap> <resultMap id="get_role_result" class="rolebean"> <result property="role_id" column="role_id"/> <result property="role_name" column="role_name"/> </resultMap> <resultMap id="get_user_result" class="userbean"> <result property="user_id" column="user_id" /> <result property="username" column="username" /> <!--为user的group信息(属性groupid,groupname)配置 --> <result property="group.groupid" column="group_id" /> <result property="group.groupname" column="group_name" /> <!—这里的property="group.groupid"的含义已经很对象化了,group指的User对象里的数据类型-Group的别名;这里的column=”group_id”为group表里的PK:group_id而非user表的FK:group_id,不要弄混淆了!--> <!--为user的role信息(属性roleid,rolename)配置,这里同样是User中的子对象,采取的处理却是不同的,通过group来避免使用子查询带来的性能问题,大家可以看到 第一个配置的粒度比较细微,配置子对象的属性,而role只是到对象一级,group中没有使用select="XXX"这样的子查询,从而避免了因为数据量大而引起二次查询带来的性能问题,而采用了一个role作为一个反面教材,大家比较一下可以发现其中的不同!--> <result property="role" column="role_id" select="get_role"/> <!—这里采用了子查询(两次查询),注意这里的role_id是role表的PK:role_id,而非user表的FK:role_id,大家不要搞错了> </resultMap> <select id="get_role" parameterClass="int" resultMap="get_role_result"><!--这里的parameterClass="int"因为父查询传过来的role_id为int型的--> select * from sew_role where role_id=#value# </select> <select id="get_user" parameterClass="userbean" resultMap="get_user_result"> select * from sew_user u,sew_group g<!--因为这里的group没有子查询,所以要使用嵌套!这样在执行的效率上比子查询有优势哦,大家应该很熟悉吧!--> where u.group_id=g.group_id and u.user_id=#user_id# </select> <select id="checkuser" parameterClass="userbean" resultMap="get_user_result"> select * from sew_user u,sew_group g where u.group_id=g.group_id and u.username=#username# and u.password=#password# </select> <select id="get_group" resultMap="get_group_result" parameterClass="int"> select * from sew_group where group_id=#value# </select> <insert id="insertuser" parameterClass="userbean"> insert into sew_user values(sew_user_id_seq.nextval,<!—因为数据库里用了序列--> #username#,#password#,#email#,#group.groupid#,#role.role_id#,#nationality#, #tel#,#address#,#language#,#isEvectioner#,#realname#) </insert> |
<!—这里红色标注的:group.groupid同样的意思是User对象的数据成员:group,而groupid为子对象Group的数据成员(在UML里把带有setter和getter的数据成员称为属性。) -->
业务逻辑:
Public class UserService{ public User getUser(User user){ User user1=null; try { System.out.println(user.getUser_id()); user1 =(User)getSqlMapExecutor().queryForObject("getuser",user); } catch (SQLException e) { e.printStackTrace(); return null; } return user1; } } |
请看操作部分的代码:
实现效果:察看user_id为2的用户在那个组。
UserService us=new UserService(); User ub=new User(); ub.setUser_id(2); ub =(User)us.getUser_Group(ub); System.out.println("ok"+"/n"+ub.getUsername()+"/n"+ub.getGroup().getGroupname()+"/n"+ub.getRole().getRole_name()); System.out.println(ub.getGroup().getGroupname()); |
增加用户:
User user=new User(); user.setUser_id(27); user.setUsername("##梁静茹!!"); user.setPassword("1111"); user.setEmail("ljr@sohu.com"); user.setLanguage("CN"); user.setAddress("无锡.江苏"); user.setNationality("中国"); user.setTel("1390000000"); user.setRealname("欧阳静茹"); Group g=new Group(); g.setGroupid(1); Role r =new Role(); r.setRole_id(1); user.setGroup(g); user.setRole(r); user=us.saveUser(user); if(user!=null) System.out.println(user.getGroup().getGroupid()); |
以上所有操作都是通过的!
以上就是一对一的处理,下面再说说如何实现我想察看组下有多少个用户:
<sqlMap namespace="group"> <cacheModel type="LRU" id="oneDayCategory"> <flushInterval hours="24" /> </cacheModel> <typeAlias type="com.infodeliver.pigeon.bean.Group" alias="groupbean" /> <typeAlias type="com.infodeliver.pigeon.bean.User" alias="userbean" /> <resultMap id="get_groups" class="groupbean"> <result property="groupid" column="group_id" /> <result property="groupname" column="group_name" /> <result property="users" column="group_id" select="get_User" /> <!—这里好像只能用子查询了。其他办法还没有想到 根据group_id,能查出所有关联的User,组成装有User的List对象 --> </resultMap> <resultMap id="get_users" class="userbean"> <result property="user_id" column="user_id" /> <result property="username" column="username" /> <!—根据需要得到用户的其他信息,比如说用户的电话,E-MAIL等--> </resultMap> <select id="get_User" parameterClass="int" resultMap="get_users"> select * from sew_user where group_id=#value# </select> <select id="getgroup" parameterClass="groupbean" resultMap="get_groups"> select * from sew_group <dynamic prepend="where"> <isNotEqual property="groupid" compareValue="0"> group_id=#groupid# </isNotEqual> <isNotNull property="groupname">group_name=#groupname#</isNotNull> </dynamic> </select> </sqlMap> |
大家请注意上面配置中的颜色对上的地方!
public Group getGroup(Group g) { Group g1=null; try { g1=(Group) getSqlMapExecutor().queryForObject("getgroup",g); } catch (SQLException e) { e.printStackTrace(); return null; } return g1; } |
测试:
GroupService gs =GroupService.getInstance(); Group g1=new Group(); g1.setGroupname("Sales"); g1.setGroupid(1); Group g2=gs.getGroup(g1); System.out.println(g2.getGroupname()); List list =g2.getUsers(); for(Iterator i=list.iterator();i.hasNext();) { User u=(User)i.next(); System.out.println(u.getUsername()); } |
ibatis使用高级篇,多表操作处理!相关推荐
- iBatis 事务控制 与 两表操作将SQL语句写入单表
事务控制 示例: // move data from temp_table to work_tabletry {sqlMapClient.startTransaction();T03SlipWk or ...
- 续:ibatis使用高级篇,多表操作处理!
持久化对象的映射文件:这里以User为例: <sqlMap namespace="user"><--命名空间,好像2.0默认是开通的--> <cach ...
- Flowable高级篇 - Flowable表结构
Flowable中文手册 一.flowable表结构 数据库表命名规则: ACT_RE_*:其中"RE"表示repository(存储)的意思,是RepositoryService ...
- 基于JAVA实现的WEB端UI自动化 - WebDriver高级篇 - 关联
文章目录 关联 (公共变量传递一些值) 基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍 基于JAVA实现的WEB端UI自动化 - WebDriver基础篇 - 实现简单的浏览器操作 基于J ...
- mysql第四篇:数据操作之多表查询
mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment P ...
- 2017年高级二级计算机考试试题,2017年计算机二级高级Office考试试题操作题
2017年计算机二级高级Office考试试题操作题 第一台通用电子计算机ENIAC就是以当时雷达脉冲技术.核物理电子计数技术.通信技术等为基础的.下面是小编整理的关于计算机二级高级Office考试试题 ...
- Spark性能优化指南:高级篇
前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问 ...
- 从零开始学Axure原型设计(高级篇)
如果你熟悉了Axure的部件库,那么你可以得心应手地画出心目中产品的线框图:如果你会用Axure的母版.动态面板功能,那么你应该能够画出一些简单网站的原型图:但只有你精通了Axure的条件逻辑.变量. ...
- Spark性能优化指南——高级篇
继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. ...
最新文章
- mysql导出数据到s3_mysql导出数据库几种方法
- 使用Lucene.Net实现全文检索
- 新手如何学drupal?
- 大数据和后端学习知识体系思维导图
- margin为负值的几种情况
- printf 指针地址_指针搞都不懂,好意思说自己会C语言?
- 1-微信小程序开发(安装软件和运行第一个微信小程序)
- Unity3d 屏幕空间人体皮肤知觉渲染次表面散射Screen-Space Perceptual Rendering Subsurface Scattering of Human Skin...
- NHibernate Antlr.Runtime.NoViableAltException报错
- 几款好看的HTML按钮样式
- word中如何将所有同一级标题统一格式
- linux gbk 语言包安装,linux 安装gbk字符集
- Idear部署web项目过程
- 计算机算东西,PCDN边缘计算是个啥东西
- 电脑端和手机端的网站SEO优化的排名是否同步?
- Slidev 一种快速制作PPT的奇淫技巧
- 433模块 防冲撞 解决多发一收 mesh自组网 方案实现
- 强化学习3:蒙特卡洛和时序差分
- rocketmq框架详细介绍
- 【C++】1048:有一门课不及格的学生(信息学奥赛)