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

持久化对象的映射文件:这里以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" />

              <!--usergroup信息(属性groupidgroupname)配置 -->

              <result property="group.groupid" column="group_id"  />

              <result property="group.groupname" column="group_name" />

       <!—这里的property="group.groupid"的含义已经很对象化了,group指的User对象里的数据类型-Group的别名;这里的column=”group_id”group表里的PKgroup_id而非user表的FKgroup_id,不要弄混淆了!-->

              <!--userrole信息(属性roleidrolename)配置,这里同样是User中的子对象,采取的处理却是不同的,通过group来避免使用子查询带来的性能问题,大家可以看到

第一个配置的粒度比较细微,配置子对象的属性,而role只是到对象一级,group中没有使用select="XXX"这样的子查询,从而避免了因为数据量大而引起二次查询带来的性能问题,而采用了一个role作为一个反面教材,大家比较一下可以发现其中的不同!-->

              <result property="role" column="role_id" select="get_role"/>

<!—这里采用了子查询(两次查询),注意这里的role_idrole表的PKrole_id,而非user表的FKrole_id,大家不要搞错了>

       </resultMap>

      

       <select id="get_role" parameterClass="int" resultMap="get_role_result"><!--这里的parameterClass="int"因为父查询传过来的role_idint型的-->

       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里把带有settergetter的数据成员称为属性。) -->

业务逻辑:

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_id2的用户在那个组。

              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,组成装有UserList对象

              -->

       </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());

                 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值