<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>

持久化对象的映射文件:这里以User为例:

<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使用高级篇,多表操作处理!相关推荐

  1. iBatis 事务控制 与 两表操作将SQL语句写入单表

    事务控制 示例: // move data from temp_table to work_tabletry {sqlMapClient.startTransaction();T03SlipWk or ...

  2. 续:ibatis使用高级篇,多表操作处理!

    持久化对象的映射文件:这里以User为例: <sqlMap namespace="user"><--命名空间,好像2.0默认是开通的--> <cach ...

  3. Flowable高级篇 - Flowable表结构

    Flowable中文手册 一.flowable表结构 数据库表命名规则: ACT_RE_*:其中"RE"表示repository(存储)的意思,是RepositoryService ...

  4. 基于JAVA实现的WEB端UI自动化 - WebDriver高级篇 - 关联

    文章目录 关联 (公共变量传递一些值) 基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍 基于JAVA实现的WEB端UI自动化 - WebDriver基础篇 - 实现简单的浏览器操作 基于J ...

  5. mysql第四篇:数据操作之多表查询

    mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment P ...

  6. 2017年高级二级计算机考试试题,2017年计算机二级高级Office考试试题操作题

    2017年计算机二级高级Office考试试题操作题 第一台通用电子计算机ENIAC就是以当时雷达脉冲技术.核物理电子计数技术.通信技术等为基础的.下面是小编整理的关于计算机二级高级Office考试试题 ...

  7. Spark性能优化指南:高级篇

    前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问 ...

  8. 从零开始学Axure原型设计(高级篇)

    如果你熟悉了Axure的部件库,那么你可以得心应手地画出心目中产品的线框图:如果你会用Axure的母版.动态面板功能,那么你应该能够画出一些简单网站的原型图:但只有你精通了Axure的条件逻辑.变量. ...

  9. Spark性能优化指南——高级篇

    继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. ...

最新文章

  1. mysql导出数据到s3_mysql导出数据库几种方法
  2. 使用Lucene.Net实现全文检索
  3. 新手如何学drupal?
  4. 大数据和后端学习知识体系思维导图
  5. margin为负值的几种情况
  6. printf 指针地址_指针搞都不懂,好意思说自己会C语言?
  7. 1-微信小程序开发(安装软件和运行第一个微信小程序)
  8. Unity3d 屏幕空间人体皮肤知觉渲染次表面散射Screen-Space Perceptual Rendering Subsurface Scattering of Human Skin...
  9. NHibernate Antlr.Runtime.NoViableAltException报错
  10. 几款好看的HTML按钮样式
  11. word中如何将所有同一级标题统一格式
  12. linux gbk 语言包安装,linux 安装gbk字符集
  13. Idear部署web项目过程
  14. 计算机算东西,PCDN边缘计算是个啥东西
  15. 电脑端和手机端的网站SEO优化的排名是否同步?
  16. Slidev 一种快速制作PPT的奇淫技巧
  17. 433模块 防冲撞 解决多发一收 mesh自组网 方案实现
  18. 强化学习3:蒙特卡洛和时序差分
  19. rocketmq框架详细介绍
  20. 【C++】1048:有一门课不及格的学生(信息学奥赛)

热门文章

  1. 腾讯云创建SVN支持多人协同办公
  2. Spring框架常见面试题
  3. 什么东西改善睡眠最有效,改善睡眠质量的好物推荐
  4. 技术分享 | 客户分类管理模型在行业中的实践
  5. 怎么拥有36小时的一天
  6. 24小时只睡了1个小时
  7. img格式镜像转ISO格式
  8. php视频教程折蜗牛,超酷立体折纸蜗牛的折纸视频教程
  9. Python编程--使用NMAP端口扫描
  10. element UI 中 el-tree 树形菜单新增、删除操作