zoukankan      html  css  js  c++  java
  • 转ibatis多表操作

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

    2009-01-08 作者:programeyonger 来源:csdn

     

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

    }

  • 相关阅读:
    技术管理之路三、团队建设:怎么带队伍?
    技术管理之路五、管理沟通:管理的必修课!
    职场工作方法论:计划安排,时间管理的“四象限法则”
    职场工作方法论:目标管理SMART原则
    激励方法论1、马斯洛需求模型
    mybatis PageHelper 分页组件优化
    async 和 await
    spring cloud 负载均衡 平滑上下线
    vue 重新渲染组件
    spring cloud 超时整理
  • 原文地址:https://www.cnblogs.com/j2eedesigner/p/2181140.html
Copyright © 2011-2022 走看看